(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 ----