(1)PIC マイコンで BGM を出力させる
目的は、おもちゃの COB IC が壊れているとき、動作が PIC マイコンで代替可能なら、BGM を SOUND IC を使わずにやりたい。
このコーヒーカップは、COB IC の代替に、PIC と SOUND IC で約 400 円かかっている。
これを 150 円以下でやりたい。
・ ボタンを押すと回転を始め、1 曲を 2 回演奏して止まる。
・ 3 曲のどれかを演奏中、別のボタンを押せばその曲に変わる。
・ 回転中は、てっぺんのポットが赤色で点滅する。
共用の BGM 部を作っておくことにする。
(2)BGM の基本仕様
@主音(メロデイ)と副音(伴奏)の 2 音、50 % 矩形波、減衰なし。
A音名範囲は、 2 音とも おもちゃのキーボードの範囲である 2 ファ 〜 3 ド 〜 4 ド( 真中のド ) 〜 5 ド 〜 5 ファ、半音あり、休符は音名に含める。
B主音長は、 70 、80 〜 130 の 7 種、32 分音符 〜 全音符の 6 種
副音の音長は、主音長に委ね、同じとする。
C音符数 480 個 ( データ数は、× 3 の 1440 個 、 100 換算で 4.8 分 )
DMPLAB アセンブラ、楽譜入力はシコシコ手打ち
E部品は最少で
(3)ハード構成
@8 ピン PIC でメモリ 2K、 8 MHz( 1 命令 0.5 μs )を内臓する PIC12F683 を使用する。PWM は使用しない。
A電源は、乾電池 2 本か 3 本
B起動ボタンで 1 曲演奏、演奏中 LED 点灯
C主音と副音の 2 出力を外部で OR 合成後、8050 トランジスタ で φ 29 、8 Ω、 0.25 W のスピーカを駆動する。
2 出力合成にしたのは、プログラムで 1 出力に合成するやりかたがわからなかったため、全電圧、1 / 2 電圧、0 の 3 値とした。
I / O が 1 つ減るのでつらいが、しょうがない。
主音 |
副音 |
GP2 |
GP4 |
合成出力比 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0.5 |
1 |
0 |
0 |
1 |
0.5 |
1 |
1 |
1 |
0 |
1 |
主音と副音が共に 1 であれば GP 2 を 1 に、片方のみ 1 であれば GP 4 を 1 にする。
共に 0 であれば GP 2 、4 を 0 にする。
GP 2 と GP 4 の両方を 1 にはしない。
抵抗 460 Ω は、計画では 電圧を 1 / 2 にするので 220 Ω なのだが、音質が丸くなるので大きくした。
したがって比は 0.5 でなく 0.68 となる。
47 K は、H → L 時、波形の○部に少しなまりがあったので、入れるとなまりがなくなり、音質がよくなったようだ。
改善後の波形
(4)プログラム仕様
@主音と副音の各音名は、各 8 ビットで、32 μs 毎に − 1 カウントし、50 % デユーテイ( T / 2 )毎に反転させる。
32 μs は、タイマ 0 の割込で、主音と副音のどちらかが反転発生するとフラグを立て、RETFIE。
割込処理は 最長 13 μs かかり、残 19 μs が割込待アイドル時間となる。
タイマ 0 の PS は 2 とし、カウント値は 32 とする。 ( 256 − 224 ) × 2 × 0.5 μs = 32 μs
224 の設定では、退避処理などで延び、39 μs ぐらいになるので、設定値と OSCTUNE レジスタで微調整が必要。
A音長は、8 ビットで、割込待アイドル中に、14 ms 毎に − 1 カウントし、0 で次の音符を取得する。
14 ms は、タイマ 1 のオーバーフローフラグチエックで行う。
タイマ 1 の PS は 1 とし、カウント値は 28000 とする。 ( 65536 − 37536 )× 1× 0.5 μs = 14 ms
B出力は、割込後に反転発生フラグがあれば、主音と副音の反転状況を見て、GP 2、4 を ON、OFF する。
Cおもちゃのボタンなどの動作は割込待アイドル中に行う。
音名テーブル開始 200 H までに終わらなければならない。MPASM の VIEW−Program Memory で確認。
D概略フロー
E楽譜入力は、 主音、副音、音長の 3 テーブルとし、各テーブルに DO4、KYF(休符)、L 4 などと記述する。
曲終了は、主音テーブルの最後に FIN ( 0FF H )を記入する。
テーブルは 主音が 200 H 〜 3FF H、副音が 400 H 〜 5FF H、音長が 600 H 〜 7FF H で自動切換えさせる。
(5)プログラムとサンプル BGM
@プログラム
PIC BGM 12F683.txt
A同上内の BGM
大きな栗の木の下で.mp3
(6)音名基準とカウント値
@音名の周波数・周期
A音名のカウント値
5727 ÷ 32 = 178.9
B音長
100 とは、1 分間に 4 分音符を 100 個という意味。
基準は、 100
減衰しない 600 ms の連続音
小・中学校の音楽教科書の「君が代」 は、 69 に指定されている。
600 ÷ 14 = 42.8
黄色枠は、小数になり区別できない。
(7)わかったこと
@内臓 8 MHz は、電源電圧を 2.8 V 〜 5 V まで変化させても変わらない。
A割込周期を 32 μs などの小さい領域にすると、レジスタ退避やタイマ再起動の命令サイクルの遅れが影響する。
BOSCTUNE レジスタの設定値と FOSC
マニュアルではわかりにくいので、表にした。
± 12 % というので MAX と MIN の FOSC を決め、等差とした。
C擬似命令の BANKSEL、IFDEF 〜 ENDIF、CALL TABLE 時の PCLATH の使い方
DPICオルゴールとしていろんな HP で紹介されているが、音合成の理屈がどうしてもわからない。
これが理解できないと、減衰などをしたくても?
E実際の音質は、合成以降のハードアンプとスピーカ径に拠るところが大きいように思うが、「部品は最少で」なのでオペアンプは使わない。
PIC出力をパソコンに取り込んで再生すると、まろやかに聞こえる。
LPFを入れると良くなるようだが、8050 の入力が低下し、増幅できない。アナログに弱いのでここまでかな
F楽譜入力は、一旦 Excel に記入し、コピペすると効率的
TEST 基板は、16 ピンゼロプレッシャーソケットにしたので抜き差しが楽で続けられた。
しかし、手作業ではつらい。
Excel データをリアルタイムでパソコンで鳴らし、チエックしたい。マクロでできるかな?
G主音を DO4、副音を DO3 のように同音(倍音)にすると、矩形波がノコギリ波のようになるみたいで、ブザー音のように濁る。
DO4 の周期を T とすると和は、2T つまり DO3 のノコギリ波に変身する。
矩形波の合成は、多くが濁り雑音ぽくなるが、雑音でも単音のみより雰囲気がでるので捨てがたい。
濁る場合、副音を 主音の和音、例えば ドミソ の ミ とか ソ に変えたほうが澄んだ音になる場合がある。
HPIC12F1822 というのが、内臓 32 MHz で安く、いろんな新しい機能があるので使ってみたいが、秋月ライターが対応していない?
I主音(メロデイ)と副音(伴奏)を単音で左右スピーカで別々に鳴らせば、当然ながら澄んだ音が出る。
合成音を聞かせるより、単音 2 個を聞かせ、耳と脳ミソで合成させるのが自然という気もする。
この場合、副音の音量を下げないと伴奏が強すぎる。
でもスピーカとトランジスタがもう 1 個ずついるので現実的でない。
J上記Iのヒントにより、主副を全電圧の単音にして、OR してみたがかえって悪くなった。
以前のダイオード後すぐの OR 回路では、主副が両方 1 のとき、電圧が極端に落ち OR できない。
ダイオードの逆方向電流 ( 6 nA 程度 )の影響と思われる。
抵抗後 で OR したが、音が濁る。
ダイオード、抵抗の代わりにインバータを直列に 2 個入れると OR できたが、音質は当初より劣る。
---- 2013.10.05 ----