teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]


新着順:27/789 記事一覧表示 | 《前のページ | 次のページ》

Re: お世話になっております~♪

 投稿者:nekosan  投稿日:2015年 7月25日(土)17時15分16秒
  通報 返信・引用
  > No.770[元記事へ]

猫サックスさんへのお返事です。


> たとえば
> MSB  0  63
> LSB  32  1
> Prog  109
>
> を1チャンネルで送りたい設定だとします。
> それで
>
> B0H 00H 3FH B0H 20H 00H (←バンクセレクトで書き換えたつもり)
>


B0Hや00Hなどの表記は、プログラム言語に因らない
16進数の一般表記なので、C言語系で16進数表記を
行うには、C言語流に、先頭を数値(0~9)で書き
はじめる必要があるかと思います。

  →B0Hだと、先頭がアルファベットなので、定義済み
   の変数や予約語と認識するでしょうし、00Hは、
   C言語では最後のHが文法にマッチしません。

C言語で16進数の定数を書くには、先頭に「0x」を
つけます。B0Hなら、「0xB0」といった具合です。
(ちなみに、xは「hex」→16進数のhexadecimalで、
 8進数なら「0o」、2進数なら「0b」をつけます)




> ///////////////////////////////////
>
> void funtion_key(){
> int i;
>
> if (now_notes[13] == LOW) { // funcyion
> program_change(0,B0H 00H 3FH,B0H 20H 00H,109); // Spitz Bottle
> }
> }
>
> というのと、
>
> void program_change(int channel,int MSB,int LSB,int program){
> Serial.write(0xc0 + channel);
> Serial.write(MSB);
> Serial.write(LSB);
> Serial.write(program);
> }
>
>
> ///////////////////////////////////
>
> と書いてみて まぁ↑これだと、コンパイルが通りませんし、



関数program_changeの引数部分、複数の値を渡すには、
それぞれをカンマで区切って別のデータとして渡すか、
配列にしておいて先頭ポインタを渡す必要があるかと
思います。

ポインタのことは説明が少々面倒になりそうなので、
ひとまず置いておいて、値を1個1個区切って渡す方向で
考えることにします。

5分くらいで、それっぽい処理を書いてみました。



// bank select test //

void bank_select(unsigned char ch, unsigned char msb, unsigned char lsb) {
  Serial.write(0xB0 + ch);
  Serial.write(0x00);  //msb
  Serial.write(msb);

  Serial.write(0xB0 + ch);
  Serial.write(0x20);  //lsb
  Serial.write(lsb);
}

void program_change(unsigned char ch, unsigned char pgm) {
  Serial.write(0xC0 + ch);
  Serial.write(pgm);
}

void setup() {
  Serial.begin(31250);
}

void loop() {
  bank_select(0, 0x3F, 0x01); // ch:0 msb:63 lsb:1
  program_change(0, 109);  // ch:0 pgm:109
  for(;;){}
}

コンパイルは通りましたが、動かしてないので、ちゃんと
動くかはわかりません。多分コレで動くんじゃないかと
思うんですが…

あと、「unsigned char」型じゃなく、「int」型でも
動くと思います。
(一応、1バイトのバイナリで出力するようにunsigned char
にしてますが、多分その辺は関数内部で臨機応変にして
くれてるかと)

といった具合で、ちょっと試してみていただければ、と。

(バンクセレクト、実は使ったこと無いんですよ…)
 
 
》記事一覧表示

新着順:27/789 《前のページ | 次のページ》
/789