dポイントプレゼントキャンペーン実施中!

現在H8マイコンを用いて電子工作をしている者です。今スピーカーから音楽(単音)を奏でようと考えています。周波数の変え方としては割り込みを用いて、以下のようにしています。

/**************************:目覚まし音制御*****************/
void int_imia2 (void)
{
ITU2.TSR.BIT.IMFA = 0; //割り込みステータスフラグクリア
a0-=1;
if(a0==0){
nn+=1;

if(nn==1)ITU1.GRA=doo;
if(nn==3)ITU1.GRA=doo;
if(nn==5)ITU1.GRA=doo;
if(nn==7)ITU1.GRA=doo;
if(nn==9)ITU1.GRA=ra;
if(nn==11)ITU1.GRA=si;
if(nn==13)ITU1.GRA=doo;
if(nn==14)ITU1.GRA=si;
if(nn==15)ITU1.GRA=doo;
a0=20;
}
}

dooやsiには私自信が出したい周波数となるようなGRAレジスタの値を入れています。そこで、以上のようなプログラムを組んだ際に、例えば
 if(nn==9)ITU1.GRA=ra;
if(nn==11)ITU1.GRA=si;
if(nn==13)ITU1.GRA=doo;
この部分ではちゃんとラ、シ、ド、と発生しているのですが、一番初めの
 if(nn==1)ITU1.GRA=doo;
if(nn==3)ITU1.GRA=doo;
if(nn==5)ITU1.GRA=doo;
if(nn==7)ITU1.GRA=doo;
この部分では、ドの音がn=7のところまで鳴りっぱなしになってしまっています。本来としては、ド、ド、ド、ドと区切りを入れて欲しいところなのでどうしていいのか困っています。どのように設定すれば、うまく区切りを出して発生させることができるのでしょうか?どなたかいいアイデアがあればお願いします。

A 回答 (1件)

音の長さを管理してみてはいかがでしょうか。



以前私が作ったプログラムでは、音の名前、音の長さ、テンポを次のように管理していました。

// 音の長さ ----------------------------------------------------------
// 十六分音符の長さを基準として長さを管理する。

#define SIXTEENTH_NOTE1// 十六分音符
#define EIGHTH_NOTE2// 八分音符
#define QUARTER_NOTE4// 四分音符
#define HALF_NOTE8// 二分音符
#define WHOLE_NOTE16// 全音符

#define SIXTEENTH_REST1// 十六分休符
#define CROTCHET_REST2// 四分休符
#define HALF_NOTE_REST8// 二分休符
#define WHOLE_NOTE_REST16// 全休符

// テンポ(十六分音符の時間)-----------------------------------------
// テンポの数字は1分間で打たれる四分音符の回数を意味する。
// ここでは十六分音符を基本単位としているため、テンポ数から十六分音符の長さ
//を次式で求める。
// (十六分音符の時間[ms])= 60 / (テンポの数字) / 16 * 1000

#define TEMPO_6063// [ms]
#define TEMPO_8047
#define TEMPO_10038

// 楽譜の構造体
typedef struct{
 unsigned chartempo;// テンポ
 short(*melody)[2];// メロディデータへのポインタ
 shorttimeCount;// 発音中の音が終わるまでの時間カウンタ
 shortnoteCount;// メロディ先頭から数えた音符位置のカウンタ
 shortmaxNoteCount;// noteCount の最大値
                // 言い換えれば、メロディ中の音符の数
 BOOLloop;// TRUE(1): 繰り返すFALSE(0): 繰り返さない
} Score;

メロディデータはこんな感じです。
// デフォルトメロディ(ドレミファソラシド)
#define DEFAULT_MELODY_LEN9
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},
};

上記の定義を使い、休符を使って音を出さない時間を管理していました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!