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

 投稿者
  題名
  内容 入力補助画像・ファイル<IMG> youtubeの<IFRAME>タグが利用可能です。(詳細)
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ 検索 ]


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

 投稿者:nekosan  投稿日:2015年 7月29日(水)00時27分9秒
返信・引用
  > No.776[元記事へ]

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



> タッチセンサー式ですとか、私、さんざん申しておりましたが、(汗・・・)
> 特にアルトサックスを吹くときには楽器がさえぎって足元が殆ど見えませんで、
> それでほぼブラインドタッチで踏んでゆくのですけど、踏む際に、
>
> 1、足の裏で踏む鍵盤に一度触れて位置の確認
> 2、任意のタイミングで踏み込んでノートオン
>
> という感じが具合が良いようで、非タッチ式ですと1番が出来ないですので、
> 結果的にはどうなのかな・・・という具合ではあります。


フォトインタラプタは、「センサの動作原理が非接触」という
だけで、「足で触りながら操作できない非接触」という意味では
ないですよ。

普通のMIDI鍵盤でも、キー押下のセンシングに、フォト
インタラプタを使っているものが多くあるはずです。

http://www.eleki-jack.com/next/2010/08/11/mRIMG0299.jpg

この写真の、上下の黒い部分の片方に赤外線LEDが、反対側に
フォトセンサーが入っていて、その間を、この写真の100円玉
のように遮ると、センサーを遮ったことを検知できるという
仕組みです。
センサー側の回路自体はタクトスイッチのものが流用できる
と思います。
(LED側は、別途電源が必要ですが、単に光らせておくだけで、
 制御は不要です)

http://rohmfs.rohm.com/jp/products/images/faq/opto/optical_sensor/common/faq_01.gif

中身はこうなっています。

MIDI鍵盤の場合、キー内部に、この100円玉の代わりとなる
出っ張りがあって、キーを押下したときに、LEDとセンサー
の間を遮って、押下されたことを検知できます。

(MIDI鍵盤だと2段構えになっていて、2つのセンサーを遮る
 時間の差をとれば、ベロシティーが計算できます)


で、コレだとなにがいいかというと、タクトスイッチのような
磨耗故障による接触不良が無いことです。MIDI鍵盤なら、センサー
が壊れるよりも前に、キーのほうが寿命になります。

足で操作するパネルでも、タクトスイッチのように接触不良
を気にする必要もなく、足で探ってから、カチッと踏み込めば
センシングできるという仕組みにできるかと思います。

MIDI鍵盤などと同じ動作方式、回路、プログラムで扱えます。
(正負の論理は、場合によっては逆になるかもしれませんが)



あと、アルミ箔の容量センサーだけでなく、タクトスイッチでも
チャタリングは生じます。
一方、フォトインタラプタは、タクトスイッチよりも
チャタリングの影響が小さいといわれています。

タクトスイッチは、オンとオフの間を激しく上下する
ようなチャタリングがおきますが、フォトインタラプタの
場合は、せいぜい小さなのこぎり歯のようなノイズが載る
といった感じで、その小さなのこぎり歯は、Arduinoの場合、
内蔵のシュミットトリガ入力回路が取り去ってしまうので、
ソフト側では何の意識もせずに、オンかオフかをセンシング
できると思います。

逆に言うと、タクトスイッチのような、機械接点入力の
デメリットを何とかしようとして作られたのがフォト
インタラプタ、ともいえると思います。

https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0
 
 

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

 投稿者:猫サックス  投稿日:2015年 7月28日(火)09時42分18秒
返信・引用
  nekosanさんへのお返事です。

お世話になっております!!
有り難う御座います!


> ただ、やっぱりタクトスイッチの耐久性がちょっと
> 気になりますね。タクトスイッチ内部の接触部分は、
> 薄い膜かなにかでできてたと思うので。
> (導電プラスチックの薄い板だったかな?)
>
> 多分、当分は問題なく動くだろうと思います。
> ある程度使ってると、スイッチの接触部分の劣化で
> 「踏んだけど反応しない」っていう状態がでてくる
> かもしれないなと。
>
> まぁ、そうなってからどうするか考えても
> 遅くはないかと思います。
>

仰るとおり絶対にこういうところ壊れますよね・・・笑
で、この木とプラの接着をしっかりついて剥がせる両面テープにしておりますので接触が悪くなったらタクトスイッチを交換、というふうに考えてはおります。
両面テープを剥がさなくても交換できるように出来るようにもまた考えてみたいです。



> フォトインタラプタだと、非接触スイッチとして
> 使えるので、機械的な劣化は理屈上はゼロになると
> 思うので、次の候補としてリストに挙げておいて
> お勧めしておきたいと思います。
>


タッチセンサー式ですとか、私、さんざん申しておりましたが、(汗・・・)
特にアルトサックスを吹くときには楽器がさえぎって足元が殆ど見えませんで、
それでほぼブラインドタッチで踏んでゆくのですけど、踏む際に、

1、足の裏で踏む鍵盤に一度触れて位置の確認
2、任意のタイミングで踏み込んでノートオン

という感じが具合が良いようで、非タッチ式ですと1番が出来ないですので、
結果的にはどうなのかな・・・という具合ではあります。

因みに・・・
ブラインドタッチしている動画↓
https://youtu.be/qlgbKMMeXAc

ちょっと足元を見ながらやっている動画↓
https://youtu.be/6lfjnV6gJUE

とこんな感じで苦心?しています。ま、演奏する側の問題でしかありませんけれど・・・。w


あと、Arduinoと話はずれますが、音源側の操作で一番手前に配置している1オクターブ分だけダンパーペダルが利くように設定できる方法が先日わかりまして、そうしますと低音一回ばーんと踏みましてから、それをホールドさせておいて、二段目のフットペダル以降でさらに両足を使ってメロディーが奏でられるということで、 演奏の可能性が広がるかもしれません。

それで何回か、即席簡易ダンパーペダルをつけて実験をやってみました。これは次回作のでやってみるつもりです。
因みに参考にさせていただいたスケッチはこちらのサイトです↓
http://shop.plaza.rakuten.co.jp/shiraimusic/diary/detail/201212050000

いつも他の人が書いたものばかりをお借りして、自分でのスケッチのアプローチが一切ないのが問題ですが。(汗)

あとは、
タクトスイッチを押したらオン、離してもまだオンのまま、
さらにもう一度押すとオフ、離してもオフのまま、

のように動作するスケッチを調べてみたり、検索したり、しています。スケッチが分かるようになればきっとすぐに解決できると思っています。

しかし意外に、腕の肘内側部分にあの自家製スイッチをくくりつけて、
・ホールドしたい時だけ肘を体に押し付けてオン、
・ホールド解除したいときは離してオフ、

とか、そうすると、物凄い演奏しやすいかもしれません。

ただ、どんどんわけ分からない人になりそうで怖いですが。
(普通、ダンパーペダルは足で踏むのに、足で踏むものは手や腕でやるというなんかやはり非常識ですから。w)
という感じです。
いつも有り難う御座います!
 

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

 投稿者:nekosan  投稿日:2015年 7月28日(火)00時20分23秒
返信・引用
  > No.774[元記事へ]

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

> ところで、以前写真で見て頂きました伝導テープ製のスイッチなのですが、
> 音のアタックがハッキリしている音色を使うと、やはり仰っておられましたようにチャタリングというものが起きるようで、
> 結局はタクトスイッチを利用して足で踏み込んでも壊れないものを作ってみました。 これだと踏んだときのクリック感もでて良い感じです。(今のところですけれど・・・・)
>


写真拝見しました。

力が加わっても一定以上スイッチが押し込まれない
構造とか、いい感じですね。

ただ、やっぱりタクトスイッチの耐久性がちょっと
気になりますね。タクトスイッチ内部の接触部分は、
薄い膜かなにかでできてたと思うので。
(導電プラスチックの薄い板だったかな?)

多分、当分は問題なく動くだろうと思います。
ある程度使ってると、スイッチの接触部分の劣化で
「踏んだけど反応しない」っていう状態がでてくる
かもしれないなと。

まぁ、そうなってからどうするか考えても
遅くはないかと思います。

フォトインタラプタだと、非接触スイッチとして
使えるので、機械的な劣化は理屈上はゼロになると
思うので、次の候補としてリストに挙げておいて
お勧めしておきたいと思います。
 

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

 投稿者:猫サックス  投稿日:2015年 7月26日(日)14時18分43秒
返信・引用
  nekosanさんへのお返事です。

お世話になります!!
忙しいところ、重ね重ね誠に有り難う御座います!!

やはり、基本を押さえておかなければ何事も成しえず、
そのやり方まで教えていただいて恐縮です!

まずは仰るようにやってみて、基本部分を分かるようにしてみます。
有り難う御座います。


ところで、以前写真で見て頂きました伝導テープ製のスイッチなのですが、
音のアタックがハッキリしている音色を使うと、やはり仰っておられましたようにチャタリングというものが起きるようで、
結局はタクトスイッチを利用して足で踏み込んでも壊れないものを作ってみました。 これだと踏んだときのクリック感もでて良い感じです。(今のところですけれど・・・・)

https://drive.google.com/file/d/0B1TrTdB7SpaYQXd2SkdQdzk5Q0U/view?usp=sharing
 

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

 投稿者:nekosan  投稿日:2015年 7月26日(日)11時57分18秒
返信・引用
  > No.772[元記事へ]

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



> ひとまず、ここに書いたらいいかな?という感じでスケッチを完成させて動作させてみましたら、何故か音が鳴らなくなりました。
> それと、ファンクションボタンも反応しなくなって・・・。
>
> 因みに以下のスケッチになります。
>
> 何卒宜しくお願い申し上げます。



昨日のスケッチは、2つの関数(bank_select、program_change)
を動かすためのサンプルなので、これのloop処理の中身を、
そのままloopに入れてしまうと、多分うごかないでしょう。

(1)for文の処理
  →この場合のfor(;;){}というのは、ここで処理を
   打ち切って、無限ループにするという定番処理
   なので、以降の処理がストップしてしまいます。

(2)2つの関数を呼び出す条件
  →loop処理は、無条件で何度も何度も繰り返す処理を
   書くところなので、ここに呼び出す処理を書くと、
   延々とバンクセレクト、プログラムチェンジを
   出力し続けてしまいます。

「特定のキーが押された」時に、この2つの関数を順に
呼び出すという風にするのが、多分意図されている
処理だと思います。

  キー全般の入力処理
   →特定のキーが押されているかのチェック
    →押されていれば、2つの関数を呼び出し


どのような回路、どのような配線になっているかが
詳しくわからないのですが、多分check_and_output
の関数内で、特定のキーが押されているかどうかを
チェックして、押されてたら2つの関数を呼び出す、
という感じになるのではと思います。


ちなみに、配列「note」や、変数now_velocity、
now_pitch_bend、now_modulation といったものは、
それぞれ、各音程用のキーを押してるかどうか、
ベロシティー量、ピッチベンド量、モジュレーション量
を扱う専用の変数なので、バンク切り替え用のキー入力
があったかどうかを格納しておく変数については、
これらとは別に確保する必要があるでしょう。
(冒頭の変数定義の処理)

で、key_input関数内で、その変数に入力値を格納
する、といった処理も必要になると思います。




具体的にこの内容でコードを書いていくまえに、
スケッチ全体の処理を1行ずつ、および1関数ずつ、
どんなことをしているのかを、一旦日本語に翻訳して
みるとよいかと思います。
(で、setup、loopを順に処理していく流れの中で、
 各関数がどんなタイミングで、どんな条件で
 呼び出されて、結果どんな動作を起こすのかを、
 時系列的に追ってみると、スケッチの意味が
 掘り下げられるかと思います)


配列の使い方だとか、「newなんとか」「oldなんとか」
みたいな変数の意味や機能が、プログラミングに
慣れないとわかりにくいかもしれません。
が、一般に良く使われているような処理ロジックの
パターンで書いてあるので、「おきまり」なんだな、
と思って、なんとかがんばって読み込んで、日本語化
に挑戦してみてください。


→「変数表」(各変数がどんな目的で使用されて、
 どんな値を取って、どんなところで更新・参照
 されるのか、みたいにまとめたもの)だとか、
 各関数の意味や機能を纏めたものを書いておくと、
 便利だし解りやすくなり、実際、開発の仕事では
 設計書に変数表や関数定義を書いておいたりも
 するんですが、このプログラムだと短いし、
 趣味用なので、そこまでしていません。

白紙に、変数の名前を書いておいて、処理を1行1行
目で追いながら、変数がどのように書き換わっていくか
を、紙上でシミュレートしていくと、変数の意味が
つかめていくと思います。

(ステップ実行ができる統合開発環境とかなら、
 いちいち紙に書かなくても画面で簡単にできて
 しまうんですが、Arduino-IDEはそういう機能が
 ないんですよね)



あと、bank_selectやprogram_changeを呼び出すときの
引数は、現状、(0, 0x3F, 0x01)とか(0, 109)とか
固定値になっています。

バンクやプログラムをどんな値に変えるかを、
キー操作の内容によって細かく設定したい場合は、
キー入力によって処理を振り分けする必要があるので、
そのあたりも含めて、自由に仕様を変えられるように、
スケッチ1行1行がどんな風に機能していて、それらが
組み合わさって関数としてどんな機能を実現していて、
全体の中でどんな意味を持っているのか、日本語で
スケッチの動作を言語化しておくと、あとあと、
機能変更するときに役立つかと思います。



 

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

 投稿者:猫サックス  投稿日:2015年 7月25日(土)23時13分52秒
返信・引用
  > No.771[元記事へ]

nekosanさんへのお返事です。

お世話になります!


> 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」をつけます)


ご指摘、有り難う御座います!
そうなのですね、ちょうどその部分がコンパイルで引っかかっておりました・・・。
今後、気をつけます!


> 関数program_changeの引数部分、複数の値を渡すには、
> それぞれをカンマで区切って別のデータとして渡すか、
> 配列にしておいて先頭ポインタを渡す必要があるかと
> 思います。
>
> ポインタのことは説明が少々面倒になりそうなので、
> ひとまず置いておいて、値を1個1個区切って渡す方向で
> 考えることにします。
>
> 5分くらいで、それっぽい処理を書いてみました。
>

有り難う御座います!!!!!

ひとまず、ここに書いたらいいかな?という感じでスケッチを完成させて動作させてみましたら、何故か音が鳴らなくなりました。
それと、ファンクションボタンも反応しなくなって・・・。

因みに以下のスケッチになります。

何卒宜しくお願い申し上げます。




/**********************************************/
/***     MIDI shield controller             ***/
/***                      for Arduino       ***/
/***                      version 0.2       ***/
/***   2013. 9. 3  created by Nekosan       ***/
/***   2013. 9. 4  modified 0.2 by Nekosan  ***/
/***                                        ***/
/**********************************************/


/* declare constant values */

const int velocity_pin = 0;        // potentiometer
const int pitch_bend_pin = 2;      // vertical
const int modulation_pin = 1;      // horizontal (cc#1)
const int led = 13;

const int note[13] = {60,61,62,63,64,65,66,67,68,69,70,71,72};
  // 24::120
const int key[14] = {2,18,3,17,4,5,10,6,11,7,12,8,9 ,19};
  // c c# d d# e f f# g g# a a# b c  func


/* declare global variables */

int now_notes[14] = {1,1,1,1,1,1,1,1,1,1,1,1,1, 1};
int old_notes[14] = {1,1,1,1,1,1,1,1,1,1,1,1,1, 1};
  /* active low */

int now_velocity;
int now_pitch_bend;
int now_modulation;

int old_pitch_bend;
int old_modulation;



/****************/
/* sub routines */
/****************/

void key_input(){
  int i;

  /* input keys */
  for (i=0;i<14;i++){
    now_notes[i] = digitalRead(key[i]);
  }

  now_velocity = 127;
  now_pitch_bend = 64;
  now_modulation = 0;
  if (now_modulation < 0) {
    now_modulation = 0;
  }
}


void check_and_output(){
  int i;

  for (i=0;i<13;i++){
    if (now_notes[i] == old_notes[i]) {
      /* note is not changed */
    } else {
      /* check note on or off */
      if (now_notes[i] == LOW) {  // active low
        note_on(0 , note[i] , now_velocity);
      } else {
        note_off(0 , note[i]);
      }
    }
  }
}


void store_old(){
  int i;

  for (i=0;i<13;i++) {
    old_notes[i] = now_notes[i];
  }

  old_pitch_bend = now_pitch_bend;
  old_modulation = now_modulation;
}


void note_on(int channel ,int note ,int velocity) {
  note_out(0x90+channel , note , velocity);
}


void note_off(int channel ,int note) {
  note_out(0x80+channel , note , 0);
}


void pitch_bend(int channel) {
  if (now_pitch_bend != old_pitch_bend) {
    pitch_bend_out(channel ,0 ,now_pitch_bend);
  }
}


void modulation(int channel) {
  if (now_modulation != old_modulation) {
    control_change(channel ,1 ,now_modulation);
    //1 = modulation (MSB only)
  }
}


void funtion_key(){
  int i;

  if (now_notes[13] == LOW) {  // funcyion
    program_change(0 ,109);  //
  }
}



/*****************************/
/* sub routines for midi-out */
/*****************************/

void note_out(int channel,int note,int velocity){
  Serial.write(channel);    // 0::15
  Serial.write(note);       // 24::120
  Serial.write(velocity);    //0:127
}


void pitch_bend_out(int channel,int LSB,int MSB){
  Serial.write(0xe0 + channel);
  Serial.write(LSB);
  Serial.write(MSB);
}


void control_change(int CC,int LSB,int MSB){
  Serial.write(0xb0 + CC);
  Serial.write(LSB);
  Serial.write(MSB);
}


// bank select test //

void bank_select(int ch, int msb, int 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(int ch, int pgm) {
  Serial.write(0xC0 + ch);
  Serial.write(pgm);
}



/**************/
/* main logic */
/**************/

void setup() {
  int i;

  Serial.begin(31250);      // connect to MIDI synth
  //Serial.begin(38400);      //connect to PC

  for (i=0;i<14;i++){
    pinMode(key[i], INPUT);
  }
  pinMode(led, OUTPUT);

  old_pitch_bend = analogRead(pitch_bend_pin) / 8;
  old_modulation = analogRead(modulation_pin) / 4 - 128;
  if (old_modulation < 0) {
    old_modulation = 0;
  }
}


void loop(){
  /* input from keys and pots */
  key_input();

  /* function key */
  funtion_key();

  /* check push or release / output note on/off */
  check_and_output();

  /* pitch bend */
  pitch_bend(0);

  /* modulation */
  modulation(0);

  /* store "old notes" */
  store_old();

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

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
にしてますが、多分その辺は関数内部で臨機応変にして
くれてるかと)

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

(バンクセレクト、実は使ったこと無いんですよ…)
 

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

 投稿者:猫サックス  投稿日:2015年 7月25日(土)15時42分34秒
返信・引用
  > No.769[元記事へ]

nekosanさんへのお返事です。

お世話になります!
有り難う御座います~。

> フォーマットは
> http://www1.plala.or.jp/yuuto/midi/p0301.html
>
> このあたりとかに書かれているので、
> そのまま出力すれば動くのではないかと。
>

実はこちらのご紹介ページは以前から存じてはおりますが、
これを利用したつもりで試みましても残念ながらうまくいっておりません。
。プログラムチェンジ送信だけなら全く問題はないのですが。



たとえば
MSB  0  63
LSB  32  1
Prog  109

を1チャンネルで送りたい設定だとします。
それで

B0H 00H 3FH B0H 20H 00H (←バンクセレクトで書き換えたつもり)


ということで、とりあえずバンクセレクトだけ付け加えてやってみますと、

///////////////////////////////////

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);
}


///////////////////////////////////

と書いてみて まぁ↑これだと、コンパイルが通りませんし、

MSB  0  63
LSB  32  1

の63と1だけ採用して(一個ずつしか数字を入れられない?ため・・)


void funtion_key(){
int i;

if (now_notes[13] == LOW) { // funcyion
program_change(0,63,1,109); // Spitz Bottle
}
}

とかでも、または、

void funtion_key(){
int i;

if (now_notes[13] == LOW) { // funcyion
program_change(0,0 63,32 1,109); // Spitz Bottle
}
}


当然(汗)これもだめでして。完全に迷宮入りですw




例えば、nekosanさんはこう書かれてます。
void program_change(int channel,int program){
  Serial.write(0xc0 + channel);
  Serial.write(program);
}

と、

void funtion_key(){
  int i;

  if (now_notes[13] == LOW) {  // funcyion
    program_change(0 ,65);  // Soprano Sax
  }
}


なにはともあれ、この2箇所にどうにかしてバンクセレクトを加えるという方向性でとりあえずは間違ってはいないでしょうか???

 

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

 投稿者:nekosan  投稿日:2015年 7月24日(金)23時55分43秒
返信・引用
  > No.768[元記事へ]

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

> nekosanさんへのお返事です。
>
> お世話になっております!!
>
> mega2560のアナログピンの件、分かりました~♪
> 54~69(A0~A15)
> という割り振りのようでした!!
> 有り難う御座います~。
>
> ではでは!!
>



解決しましたか。

ちなみに、LSB、MSBっていうのは、バンクセレクト
のことですかね?

フォーマットは
http://www1.plala.or.jp/yuuto/midi/p0301.html

このあたりとかに書かれているので、
そのまま出力すれば動くのではないかと。
 

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

 投稿者:猫サックス  投稿日:2015年 7月24日(金)10時12分54秒
返信・引用
  > No.767[元記事へ]

nekosanさんへのお返事です。

お世話になっております!!

mega2560のアナログピンの件、分かりました~♪
54~69(A0~A15)
という割り振りのようでした!!
有り難う御座います~。

ではでは!!
 

レンタル掲示板
/79