音楽雑記帳

音楽鑑賞ネタ 他は 自分の英語ブログ(google blogger)からの転載など。他は適宜時事、社会ネタも混じります


 当ブログも放置したままはや半年、ということで、休眠ブログにするつもりでもないので、何か「更新ネタでもやっておかないと」ということで、経過報告を兼ねて投稿した次第です。現在、電子工作ネタからの延長で、マイコンプログラミングの泥沼にはまっていますが、プログラミングの方から音楽という場合、C言語を習得しなければなりません。少々時間が空きましたが、WAV音源をC言語でプログラミングする所まで来ました。 

 sinewave






















 左はC言語で書いたソース コードですが、 16ビット深度の量子データーを配列に格納していくわけだ。 0~65535の範囲のデーターになるわけですが、これをmath.h という標準ヘッダ ファイルのsin関数を使って変換した数値を配列に格納していきます。 WAVファイルに書き込む為の関数は後述の参考書で用意されているラヘッダのwave.hから用います。 音源用のwavファイルはRIFFという形式でデーターが格納されており、それに合わせるための関数群がwave.hに定義されており、これを使えば比較的シンプルにwav音源のプログラミングが出来るように成っています。

 上のイメージの音源は、二つのサイン波を少し周波数を違えて足しあわせたもので、 スーパーヘテロダインなんかのミキシングをイメージしたものです。いわゆる「うなり」の原理として知られています。 データーとして格納する数値をいじることで、音階の表現も視野に入ってきました。

 参考に使ったのはオーム社の「C言語で始める 音のプログラミング」です。 本書はC言語のコンパイラとしてBorland C++を使う手順(windows)になっていますが、 C言語に違いがあるわけでも無いので、個人的にはLinuxのGCC コンパイラを使用しています。 こちらのほうが開発はしやすい。

 出来上がった wavファイルは音声編集ソフトの定番audacityで開く事ができます。

 もちろん 内容的にはC言語の入門編は一通り終わっていることが前提になります。

 c_programing

 
 当参考書で用いられているwave.h は記載されているサポートのURLからダウンロードで取得出来ますが、ソースコードがそのままでは使えなかったので修正しました。 mono_wave_write関数で、dateに最後代入する部分の行、、、、data=(short)(s+0.5)-32768....をdata=(int) かdata=(double)に変えてみた所、上手く行きました。





















 今日から12月ですが、一年はあっという間ですね。年内にあと一回は更新する予定ですが、今年は新たに関心を持った音楽そのものはまったくなかった。 


 近年普及が進んでいるコンピューター言語のPythonはライブラリーを使えば、初歩のうちから結構遊べる。というわけで当ブログの趣旨としても音楽系の投稿ネタはやらねばということで、音楽再生プレーヤーを作ってみた。

 pygameというゲーム製作用のライブラリーに音楽再生用のオブジェクトが用意されているので、これを使ってみました。元はCDーROMをPythonで操作しようと漁っていて、これにぶつかったわけですが、CD再生プログラミングの方はデーターの読み取りだけで音が出ませんので目下研究中です。

Screenshot from 2019-05-04 20-24-01
 pygame.mixer以下で定義されている関数を使えば良いわけで、プログラムを取り敢えず組んでフォルダーの中でターミナルを開いて用いるようにしました。フォルダーごとに再生用プログラム ファイルをコピーして再生用音楽ファイルと一緒に入れておけば再生はワンタッチです。











 OSは32bitのサポートが継続しているLinuxMint です。使い勝手は他のLinuxと比べて遜色はなく、シンプルで使いやすいLinuxなのでおすすめです。光学ドライブはもともとIDEという特殊な規格でUSBの場合、通信規格も異なるので外付CDーROMで音楽CDの再生はかなりキツイ。

Screenshot from 2019-05-04 20-24-42
 
 音質は良いですが、再生フォーマットは16bitまでのようです。(pygame.mixier.init()で設定しておく)今回製作したプログラムは機能上は最低限でポーズや途中再生とか出来ないので、改良版はいずれ試してみましょう。


 PCM1795のデフォルトは24bit

 レジスタRaspberry Pi 2 Model B に I2S接続した PCM1795を用いた自作DAC回路ですが、このPCM1795はデフォルト設定では24Bitになっています。レジスタを書き換えることで変更出来ます。デジタルフィルターやDSDへの変更などもレジスタの書き換えで行えます(デフォルトはPCM) 

  Volumioの方の設定で常時192KHz, 24bitにオートリサンプリングさせて聞いていましたが、32bitに対応させる方法がArduinoの使い方を憶えるうちにわかってきたので、ここは32bitに書き換えましょう。








 Arduinoのスケッチ例のWire→master_writerが使える。

PCM1795はSPIもしくはI2CでArudinoに接続できるので、ここはI2Cで行います。スケッチ例のWireにmaster_
writerがありますからこれを少し変えます。
 アドレスの変数は byte で設定 これは 変数を2進法で使うという意味です。

 レジスタ−3
TI社で提供しているマニュアルをみると、I2Cの接続に対応する部分が表でわかります。MSとMDIはGNDに繋げばいい。

 デバイスのアドレスはスレーブ扱いで(Arduinoがマスター)B1001100です。このBは2進法(binaryということです。
  




レジスタ−4次にレジスタのアドレスを見ますが、ココには見えませんが、bit数の設定は
Register 18 なのでB00010010になります。(R/Wはデフォルトでは0)

レジスタ−5
 レジスタの中はこの表だと文字表記ですが、このFMT2〜FMT0を101だったのを→100にします。

 他はデフォルトの設定の数字を入れればいい。これは スケッチ上で Wire.write(B01000000); になります。

 レジスタ−5










 終わったら Volumioのプレイバックを開いてオートリサンプリングの再生bit数を32bitに変更して保存しておきます。

 レジスタ−2


  秋月電子で入手可能なPNPデュアルトランジスタ


 デュアルデュアルのトランジスターは差動増幅回路を作る上で重宝するものの、入手難で、ヤフオクでもあまり出品がない。熱結合がよく、特性が揃っており、ディスクリートの差動ペアには是非使ってみたいものだ。前回はJFETのデュアルでヘッドホンアンプの回路部を交換してみたが、今回も秋月電子でオーディオ用のデュアルタイプのトランジスターが販売開始で早速入手で、乾電池動作のヘッドホンアンプの回路をこれで作り直して交換してみた。

 







 チップタイプも専用基板でOK HN4A06J

 秋月電子で売られているHN4A06Jは5個で100円と安価ながら、東芝製でオーディオ用には最適な特性である。オーディオ用半導体は日本製も捨てがたい。他にも励起用2SC1815、出力段に東芝2sc2655とオールジャパンにしてみた。→特に半導体国粋主義者じゃないですけどネ。普段は小信号用はフェアチャイルドばかりだな。

 配線ミスに気づかずしばらく頭を抱える

 通電しても音が出ない、、オカシイ部分がなかなか解らない。こういう時は症状から原因を特定するのだが、まさにココが知識のあるなしが試されるものだ。致命的な間違いは無いようなのだが、、入力がそもそもないようだ、、ということはどこか断線だろうということで、テスターで電圧を測って行ったら、そもそもハンダ付け忘れに気がついて、一見落着。


 音質は文句なし。極めて高い解像感とアタックの強さはトランジスターならでは。

 音質はトランジスターの特徴が良く分かるというか、カリッとしていてパンチの効いた音で、JFETとはある種対照的。電源用パスコンやローパスフィルターも効果的に配置。乾電池式なので雑音は無くクリーンだ。

 試聴用にアグネス チャン アイドル時代の名作「ポケットいっぱいの秘密」をダウンロードして聞いてみた。アップテンポのカントリー調で、ギターの弾く音が素晴らしい。これは名演であろう。甲高いアグネスの歌唱もスッキリ。

 アグネス

このページのトップヘ