「あの楽器(ミニ)」を作ってみました。 (その3)
お盆の用事と来客対応が終わりまして、ちょっと時間ができましたので、あの楽器(ミニ)のソフトについて整理してみました。
まず、キャラクタLCDでグラフィックもどきを表示している方式についてです。以下の図のようにしています。
このLCDは、1キャラクタ5x8ピクセルで構成されており、キャラクタコード0x20〜0xFFには固定データが書き込まれています。
0x00〜0x07の8個だけはユーザ定義キャラクタとなっており、CGRAM領域にビットパターンを書き込むことで自由なキャラクタを作ることができます。
この8個のキャラクタを図のように4桁x2行で並べることで横4x5=20、縦8x2=16ピクセルのミニグラフィックエリアにしています。こうしておいてCGRAMに円や回転する三角のパターンを書き込むことであの楽器の表示パターンを真似します。
また、この4桁x2行のセットを音程に合わせて横に移動することで、LCD全域に表示パターンが移動するようになっています。(このため一度に表示できる図形は一つとなっています。)
次に各モードの概略動作フロー図を用意しました。なお、図にはないですが各モードの選択は電源オン直後にどのセンサがオンになっているかによって行っています。
下の図がリフレクタセンサを使って手動演奏するモードの動作です。
メインループでは一定時間置きに表示パターンの切り替えとリフレクタセンサのスキャンを行っています。
その裏で、Timer1の割込み処理としてセンサに対応した音程を矩形波としてPORTCのビット0から出力します。
Timer1の周期は発音すべき音程の周期の1/2です。各周期割込みごとにメインから指示さる音程に合わせて次の割込み周期を再設定することで矩形波の周期を調整しています。
下の図が最初の演奏モード(inocenceの演奏)での動作フローです。
このモードではメインは表示切り替えのみを行っており、楽譜データに合わせた音程の切り替えはTimer0の一定周期(16ms間隔)割込みで行っています。
次が後から追加した演奏モード(IevanPolkkaの演奏)での動作フローです。
このモードの動作は最初の演奏モードとほぼ同じですが、階調表示をするためメインのほうで階調イメージデータに合わせた表示切り替えを行う機能が追加になっています。
下の図が階調イメージデータの例です。
データは横32x縦16ピクセル、1Byte/Pixelで構成されており、3が白、1が灰(中間)、0が黒、という3階調の情報を格納しています。
このデータの20x16ピクセルをとりだしてCGRAMに転送することで画像表示をしています。
またデータは2面で構成しており、一定時間で切り替えることで動きを表現します。
アセンブラソースは突貫作成であまり綺麗ではないため、申し訳ないですが公開は控えさせていただきます。
ほんとうは発声音も2和音くらいにしたかったのですが、ちょっと息切れしてしまいました。。。。今の感じだとPICマイコンのメモリと処理能力的にはまだ余裕があるようですので、やればできるとは思います。
一応できてみるとカラ―化にも手を出したくなりますね。カラーLCDだとどのくらい手間がかかりそうか、ちょっと小型カラーLCDの仕様を見て検討してみようかと思います。(実際に作るかどうかはまだ不明ですが)
ということで今回は以上です。
にほんブログ村 ←記事が面白かったらクリックしてやってください。
コメント