- ベストアンサー
H8マイコンで音階メロディーを発生させる方法
- H8マイコンを使用してスピーカーから音楽を奏でる方法について教えてください。
- 現在H8マイコンを使って音楽を奏でるプログラムを作成していますが、一部の音が連続して鳴り続けてしまう問題があります。
- どのようにすればうまく音を区切って発生させることができるでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
音の長さを管理してみてはいかがでしょうか。 以前私が作ったプログラムでは、音の名前、音の長さ、テンポを次のように管理していました。 // 音の長さ ---------------------------------------------------------- // 十六分音符の長さを基準として長さを管理する。 #define SIXTEENTH_NOTE 1 // 十六分音符 #define EIGHTH_NOTE 2 // 八分音符 #define QUARTER_NOTE 4 // 四分音符 #define HALF_NOTE 8 // 二分音符 #define WHOLE_NOTE 16 // 全音符 #define SIXTEENTH_REST 1 // 十六分休符 #define CROTCHET_REST 2 // 四分休符 #define HALF_NOTE_REST 8 // 二分休符 #define WHOLE_NOTE_REST 16 // 全休符 // テンポ(十六分音符の時間)----------------------------------------- // テンポの数字は1分間で打たれる四分音符の回数を意味する。 // ここでは十六分音符を基本単位としているため、テンポ数から十六分音符の長さ // を次式で求める。 // (十六分音符の時間[ms])= 60 / (テンポの数字) / 16 * 1000 #define TEMPO_60 63 // [ms] #define TEMPO_80 47 #define TEMPO_100 38 // 楽譜の構造体 typedef struct{ unsigned char tempo; // テンポ short (*melody)[2]; // メロディデータへのポインタ short timeCount; // 発音中の音が終わるまでの時間カウンタ short noteCount; // メロディ先頭から数えた音符位置のカウンタ short maxNoteCount; // noteCount の最大値 // 言い換えれば、メロディ中の音符の数 BOOL loop; // TRUE(1): 繰り返す FALSE(0): 繰り返さない } Score; メロディデータはこんな感じです。 // デフォルトメロディ(ドレミファソラシド) #define DEFAULT_MELODY_LEN 9 static const short defaultMelody[DEFAULT_MELODY_LEN][2] = { { Do4, QUARTER_NOTE }, { Re4, QUARTER_NOTE }, { Mi4, QUARTER_NOTE }, { Fa4, QUARTER_NOTE }, { So4, QUARTER_NOTE }, { La4, QUARTER_NOTE }, { Si4, QUARTER_NOTE }, { Do5, QUARTER_NOTE }, { REST, QUARTER_NOTE}, }; 上記の定義を使い、休符を使って音を出さない時間を管理していました。