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



例によって、ArduinoのMIDIキーボードシールド。

あれやこれや、過去のスケッチからフランケンを
作って、チョイチョイと手直しして、とりあえず
演奏出来る状態にはなった。(velocity対応)

/**********************************************/
/***     MIDI shield controller             ***/
/***                      for Arduino       ***/
/***                      version 0.1       ***/
/***     2013. 9. 3  created by Nekoasn     ***/
/***                                        ***/
/**********************************************/


/* 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 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;
  /* active low */



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


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) {
  midi_out(0x90+channel , note , velocity);
}


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


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


void funtion_key(){
  int i;
  
  if (key[13] == LOW) {
    /* */
  }
}



/**************/
/* 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);
  }
  
  old_pitch_bend = analogRead(pitch_bend_pin) / 8;
  old_modulation = analogRead(modulation_pin) / 8;
}


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

  /* function key */
  funtion_key();

  /* check push or release / output note on/off */
  check_and_output();
  
  /* store "old notes" */
  store_old();
}



ちなみに、端子の接続はこんな感じ。(クリックで拡大)



D13以外は全部使用中。

今のところ、ドから1オクターブ上のドまでの音階
と、可変抵抗でvelocityも対応。当然、和音もOK。

まだオクターブシフトも、ファンクションキーも、
ピッチベンドも、モジュレーションも未搭載。

ここから色々作りこみして実験に使うのだ。フフフ。
こんな単純なものでも、手に取ってグリグリ弄れると、
なんか楽しい。
よく見ると、シグネチャが間違ってた。後で。


http://headlines.yahoo.co.jp/hl?a=20130903-00000058-mai-sctch
こうのとり、7日に再突入。地上に帰還できるように
なったらいいのにな。
イプシロンは、いつになるんだろう?


http://labaq.com/archives/51802223.html
アイザックアシモフの予想。なんか、すごいな。


http://gcluster.jp/games/
G-clasterって、どうなのよ?って思ってたんだけど、
PCエンジン関係とか、ファルコムのYsシリーズとか、
なんか色々ヨサゲなのがあるんだなぁ。

モトローダとか、ビクトリーランとか、大得意。
どっちかって言うと、フェルガナとか、Ysオリジン
とかじゃなく、その後のシリーズがやりたいんだ
けどな。移植されないのかな?

PCエンジンは、何だかんだで、面白いゲームが
いっぱいあったな。

そういえば、ヨドバシAkibaにデモ機があったなぁ。
触らなかったけど。月額定額だけじゃなくて、買取
っていうのもあるのか。悪くは無いかも。
(あまりゲーム機を家に置いておきたくないんだよな)

あと、ゲームソフトをダウンロードした媒体がぶっ壊れ
たりしたら、再ダウンロードとかもちゃんと出来るの
かな?できれば、Raspberry Piみたく、媒体丸ごと
バックアップできたりすればいいんだけど、さすがに
それは無いだろうしなぁ。


(追記)
アナログピン周りの配線が違ってました。正しくは、

こんな感じ。

詳しくは、
http://nekosan0.bake-neko.net/connection2_midi_master.html
こちら。



コメント ( 0 )