「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



引き続き、MIDIマスターキーボードのシールド。

モジュレーションとピッチベンドの機能を追加。
ついでに、ファンクションボタンで、とりあえず
音色を1個だけ(1回だけ)変えられるようにして
みた。

スケッチがこんな感じ。

/**********************************************/
/***     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;idigitalRead(key[i]);
  }
  
  now_velocity = analogRead(velocity_pin) / 8;
  now_pitch_bend = analogRead(pitch_bend_pin) / 8;
  now_modulation = analogRead(modulation_pin) / 4 - 128;
  if (now_modulation < 0) {
    now_modulation = 0;
  }
}


void check_and_output(){
  int i;
  
  for (i=0;iif (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;ivoid 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 ,65);  // Soprano Sax
  }
}



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


void program_change(int channel,int program){
  Serial.write(0xc0 + channel);
  Serial.write(program);
}



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

void setup() {
  int i;
  
  Serial.begin(38400);      // connect to PC
  //Serial.begin(31250);      //connect to MIDI synth

  for (i=0;ipinMode(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();
  
}



昨日からあまり変化は無いんだけど、とりあえず
細かいところもチョイチョイ直しを入れたり。


こいつを使って、とりあえず和音を出したり、
音色を色々変えてみて、それぞれのモジュレーション
やピッチベンドをグリグリやってみて、それなりに
動くことを確認。

使ったのは、仮想MIDIケーブル「Loop Be」と、
Serial - MIDI converter。
http://www.nerds.de/en/download.html
http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html
いつもありがとうございますの感謝。

音源は、Windows7内蔵のGM音源。


色々試してみると、なんか、プログラムチェンジの
タイミングが微妙というか、プログラムチェンジ
直後にnote onを受け付けない時があるみたい
なので、色々と実験して原因を探ってみる…。

どうやら、Windows7内蔵GM音源が、プログラム
チェンジを受け取った後になにやらプチフリか
なにか起こしているっぽい。ナニをしてるのかは
よくわかんないけど、ちょっとだけ遅れてるみたい。

意図的に間隔をあけて使うと、再現はしないこと
を確認。

後で、外部MIDI音源使って確認しなおそう。


とりあえず最低限動くMIDIキーボードシールドが
出来たので、やりたかったことを試しだす。

チャンネルボリュームとか、エクスプレッションとか
を使って、ボリュームを動的に弄れることを確認
してみた。プログラムチェンジで色んな音色に
変えてみたけど、ドッチも大丈夫みたい。

これが、KAWAI GMEGAや、CBX-K1XG(の内蔵音源)
でも上手く動くとバッチリなんだけどな。

とりあえず今日はココまで。


http://itpro.nikkeibp.co.jp/article/NEWS/20130729/495002/
へぇ。単精度なら、「京」より17ペタFLOPS。
すごいな。すごいけど、なんで単精度?


9ヶ月ぶり!
http://www.nicovideo.jp/watch/sm21739718
GGTVの新作。シーズン3ということになっているらしい。

しかし、このファミコン。一度雑誌で見たことがある
ような気がする…。実物は見たことないけど。

なんにしても、復活オメデタイ!


http://www.yukawanet.com/archives/4529317.html#more
最近の彫刻刀。こんな風になっちゃってるのか…
歯ブラシみたい。



コメント ( 0 )