音を出すためにあるICを初めて買ってみました。
マニュアルも何も同梱されていないIC「YMZ294」単価300円。
いろんな楽器の音が出るのかと勝手に想像していましたが、矩形波x3+ノイズx1の合成波がアナログ出力されるものでした。
つまりファミコンなど旧世代ゲーム機のブザー+ピコピコ音が出ます(^^)
データシートは秋月のホームページからダウンロードできます。以下ブロック図。
音を専用に出すためのものなので、曲データや発音指令タイミングなどはすべてPICなどのコントローラ側が担います。
買って説明見て「しまった」と思ったのはこのIC、4MHzか8MHzのクロック供給が必要なこと。知っていれば一緒に購入したところでした。
買った人のブログを見ると、昔は4MHzのクロック発振器が同梱されていました。
100円しない発振器を新たに購入すると送料のほうが高くなってしまいますので、手持ちの部品でなんとかできないか考えました。
PICのマニュアルを読んでいるとCLKOUTポートが目に留まりました。
クロック出力としては使ったことがなかったのですが、内部クロックの1/4周波数を出力できるようです。
ということで強制的にPICのクロックは16MHzに決定、CLKOUTポートから4MHzのクロックを出力する設定にしました。
ひとつ問題が解決したところで次はデータのやりとり。
データバスが8ビット(=D0~D7の8ポート)。
チップセレクトが1ポート(1つのコントローラから各々指定することにより複数のYMZ294が使えるようになる)。
アドレス/データ セレクトが1ポート(データバスにアドレスを送っているのかデータなのか選択)。
ライトイネーブルが1ポート(データバスを読み取ってね指令)。
今回はIC1個なのでチップセレクトはL。
ライトイネーブルが、ローからハイに立ち上がったタイミングで、データ(アドレスorデータ)を読んでくれます。
矩形波は3つ(Aチャンネル、Bチャンネル、Cチャンネル)それぞれのアドレスとそのデータである周波数を設定することにより出力されます。
データホールド時間は10ns以上としか記述がありません。
PICは16MHzで動作しているので1命令4MHz=250nsとなり、25倍も長い間読んでもらうデータを保持していることになり、やりとりにおいてタイミングがシビアになることはありません。
ブレッドボードに乗せるとPIC18F26KとYMZ294とスピーカの3部品だけ。簡単なオルゴールができてしまいます。
こんな関数を作ると便利
YMZ294にデータ転送
周波数設定
無出力に設定する関数は、こんな感じ。音量も周波数も0にします。
いろいろ関数ができたところで、ラの音を0.5秒鳴らしてみます。
割り算はとても時間がかかるので(といっても1ミリ秒程度)周波数設定関数は、テーブル形式に変更。
エンベロープといって、音量をいろんなパターン(10種類、4ビットで指定)で変化させることもできます。
残念なのはエンベロープ回路が1つしかなく、ブロック図でわかるように各A,B,Cチャネルで共通なこと。
つまりAチャネルで特定のエンベロープを選択してミキシングを設定して、Bチャネル用にと別エンベロープへ変更した瞬間、Aの音量が別エンベロープパターンで鳴ることになります。
最終的には、主旋律をAチャネルでエンベロープ付きで演奏し、B、Cチャネルは伴奏としてエンベロープ無しの単一音量矩形波として使うことにしました。
ここまでくると次は曲を演奏させてみたくなります。
手元にある楽譜の入力作業(データ化)です。
音楽の勉強は中学で最後ですので、楽譜を読んで周波数と長さのデータに変換していくのはとても苦痛です。
何かいいツールがないか探してみたらありました。
「MUSE」という無料音楽演奏ソフト。テキストエディタで簡単に音階を入力し、そのファイルを読み込ませると演奏してくれます。
例えば、メモ帳を開いて
{d4rm2}2f4mrdrmr2
と書いて演奏すると、ドレミードレミーファミレドレミレー(さいたーさいたーチューリップのはながー)となります。
4は四分音符、2は二分音符、_は休符を意味していて、とにかく入力作業が軽減されます。
このMUSE文法のうち繰り返し記号{ }、3連符記号( )、和音記号[ ]、オクターブ上下記号< >、などを解釈するパーサー(構文解析プログラム)を書くことにしました。これができればYMZ294用の(周波数+音長)データの羅列が簡単に得られます。
プログラムはほとんどRE(正規表現)の固まりのようなもので、以下は { }を処理する関数。{ }はネスト(入れ子)があるので注意。
いま振り返ってみるとこのMUSE文法パーサー(TCLで200行)の開発が一番面白かったわけで一番時間がかかった部分でもあります。
3和音までが出せるので、楽譜はピアノでいう右手主旋律、左手伴奏が適しています。
音の流れが1本のときは、演奏データを逐一、音階(休符=無音)+音長(休符=無音時間)、に変換出力するだけでいいのですが、3本並行となると話は途端に難しくなります。
例えば、ラの二分音符が鳴っている中間でソの四分音符伴奏が鳴り始める場合、ラを出して四分音符時間後、ソを出して、さらに四分音符時間後、ラとソを停止する4つの指令データに変換する必要があるからです。
ということでパーサーはまず楽譜をイベント発生点に変換します。すべての音が発生消滅する時刻を音データに付加して、時刻でソートし、その順に出力するので、チャネル指定+音階+発生or消滅+次イベント時間、がひとつの音データとしてPICに記録されます。
3和音(例:(dms)8=ドミソ♪)となると、次イベント時間=0のデータが2つ続いたあと、和音長時間(例では八分音符長)を持ったデータが続くことになります。
MUSE形式で以下の4曲をメモ帳入力し、パーサーにかけてPICに取り込んで演奏させました。
アンプも何もないので音がとても小さいです。安心して再生してください。
スピーカーは100均で買った仕様不明なものです^^;
「ローレライ」
ドラゴンクエスト「序曲」
同「不思議のほこら」
同「ジプシーの旅」










