2004/07/10(土)8048マイコンを使った単音オルゴール

mmlplay

古くはTK-80でもオルゴールのプログラムがあったように8048版のオルゴール演奏プログラムを書いてみた。I/Oポートの1つから圧電スピーカへ接続しただけの簡単な回路で始めてみた。これでメロディーを奏でるには音程と音の長さを決めたデータを用意するだけで簡単に実現する筈である。

音程

音程は割りと簡単に決める事が出来る。ポートをHighにして決まった時間だけ待ってからポートをLowにして同じ時間だけ待つ。これを繰り返せば音が鳴るわけで、ドレミファソラシドの周波数は決まるし、クロックとマシンサイクルからループに費やすカウンターの値は決まる。これを繰り返せば必要な音程の矩形波が出力される事になる

音の長さ

ここで難しいのは音の長さを等しくする事だ。低い音と高い音ではループに費やされる時間が異なるので、決められた長さの音程を出力する為に、どの程度上記の音程ルーチンを繰り返すかは、音程によって変わる訳で、TK-80のサンプルでは音の長さを決めるカウンターを音程を決めるループの中で一緒に減算してこれを解決している。しかしTK-80のCPUである8080Aでは16ビットのレジスタ(HLとかDEとかBCなど)があって割りと簡単に実現できるが、8048では同じ事しようと思うとステップ数が多くなってしまい、高い音が出せなくなってしまった。さてと、考え付いたのは8048には内蔵のタイマーがあるので、これを使って音の長さを決める事とした。8048の内蔵カウンターの最大は20msなので、これを基準とした。音を聞いてみると判るけれど20ms毎にプログラムが動くので音が濁っている

音のデータ

なんだかんだで音が出せるようになっても肝心の曲データが見つからない。著作権の絡みで音楽データはおいそれと入手できないのである。インターネットを調べてもなかなか掲載されていない。一昔前は着メロデータとか言って色々な人のページに耳コピーした曲データがあったのに・・・

テキスト音楽

そんな中みつけたのが「テキスト音楽・サクラ」である。Windows用のソフトで音符を貼り付けると演奏してくれる。この中でMML(MusicMacroLanguage)機能を見て「MMLデータを演奏できるプログラム」にすれば、あらかじめWindows上でメロディーを確認してから8048のROMにそのまま焼ける!と思いついた。しかし本当のMMLは8048には割りと実装が重いのでMMLをまだ簡素化したものをインプリメントした。

映画・禁じられた遊び

私は見たことないのですが、有名な曲ですよね。これのデータはインターネットにあったのでこれを拝借。(著作権はどうなんでしょう?)それと、音楽を趣味でやっている友人にオリジナル楽曲を「テキスト音楽・サクラ」で貰いました。

  • 8048 MML Player ソースリスト mmlplay.lst

  • 禁じられた遊びを演奏中 KinjiraretaAsobi.mp3

  • SHOIさんのオリジナル・うっかりハチベイを演奏中 8bei.mp3

  • ちなみにオリジナルはこういうMIDI楽曲 Shoi_8bei.mp3です