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



H2A 23号機、打ち上げ成功だったらしい。
http://www.nicovideo.jp/watch/sm22984611

http://www.satnavi.jaxa.jp/gpmdpr_special/
それにしても、GPMのサイト。JAXA公式とは
にわかに信じがたいような印象。

これで、竜巻とかの予報もある程度正確に
出来るようになるといいなぁ。



http://www.nicovideo.jp/watch/sm22986241
ゲーグラTV。通産250回記念。オメデタイ!
そして、アリガタイ!カンシャカンシャ。

毎回楽しみなので、末永く続いて欲しい。



なんだか、
http://www.huffingtonpost.jp/2014/02/28/bitcoin_n_4872346.html?utm_hp_ref=japan
このニュースで持ちきりな感があるけど、

http://www.h5.dion.ne.jp/~ginza/newpage3581.htm
既視感。

まぁ、それはともかく、揮発メモリだったのかな。



http://ideahack.me/article/960
こんな方法があったとは!目ウロコ。



引き続いてMIDIのプログラム。

ふと、ArduinoのMIDIライブラリページを見に行って
みると、ここ1年でかなりバージョンアップが重ね
られて、全16CHマルチ入力とか、ソフトウェア
シリアル含めたマルチインスタンス対応とか、
ものすごく進化してることに気付いた。


んで、ここ数日作ってたMIDI入力のプログラムを、
早速このMIDIライブラリを使って書き換えてみる。

…if文の嵐で大変な状態だった代物が、case文に
置き換わって、すっかり見やすい、解りやすい
ものになってしまった。なんだったんだ7days


というわけで、失敗作(と言っても一応ちゃんと
動く)のプログラムを晒してみる。

/***************************************/
/***      MIDI master keyboard       ***/
/***         serial in (D0)          ***/
/***             |                   ***/
/***         this sketch             ***/
/***             |                   ***/
/***     software serial out (D3)    ***/
/***           eVY1 shield           ***/
/***************************************/

#include <SoftwareSerial.h>
//#include <string.h>

#define rxPin 4  // not in use
#define txPin 3  // software midi out
#define led 13

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

const char words[][7] =
  {"t M","a","4 a","a","w a","N","a","o"};

int ignore_bytes;
int last_status;
int data_seq;


void set_words(int pt) {
  mySerial.write((uint8_t)0xF0);
  mySerial.write((uint8_t)0x43);
  mySerial.write((uint8_t)0x79);
  mySerial.write((uint8_t)0x09);
  mySerial.write((uint8_t)0x00);
  mySerial.write((uint8_t)0x50);
  mySerial.write((uint8_t)0x10);
  for (int i=0; i<7; i++) {
    uint8_t c = words[pt][i];
    if (c == 0) {
      break;
    }
    mySerial.write(c);
  }
  mySerial.write((uint8_t)0x00);
  mySerial.write((uint8_t)0xF7);
}


void setup() 
{
  Serial.begin(31250);  // serial-in from MIDI-keyboard
  while(!Serial){
  }
  mySerial.begin(31250);  // soft-serial-out to eVY1
  delay(5000);   // wait NSX-1 to start up
  pinMode(led, OUTPUT);
  ignore_bytes = 0;
  last_status = 0;
  data_seq = 0;
}

void loop() 
{
  int in_data;
  
  if (Serial.available() > 0) {
    in_data = Serial.read();
    if (data_seq == 0) {
      // if in sequence of status byte
      digitalWrite(led,HIGH);
      if ((in_data >= 0xF6) && (in_data <= 0xFF)) {
        // interrupting data (system message)
        mySerial.write(in_data);
      } else {
        // status or data
        if (in_data < 0x80) {
          // running status (data byte)
          data_seq = 1;
          if ( (last_status == 0x90) || (last_status == 0x80) ) {
            // check normal note-on or change-word
            if ((in_data >= 48) && (in_data <= 55)) {
              // change word
              set_words(in_data - 48);  // changing a word
              data_seq++;
              ignore_bytes = 1;
            } else {
              //mySerial.write(last_status);  // not needed
              mySerial.write(in_data);
              data_seq++;
            }
          } else {
            // normal 2nd data
            mySerial.write(in_data);
            data_seq++;
          }
        } else {
          // normal "status data"
          data_seq++;
          last_status = in_data;
          if ((in_data != 0x80) && (in_data != 0x90)) {
            mySerial.write(in_data);
          } else {
            // hold outputting
          }
        }
      }
    } else {
      // if in sequence of data byte
      if ((in_data >= 0xF6) && (in_data <= 0xFF)) {
        // interrupting data (system message)
        mySerial.write(in_data);
      } else {
        // data byte
        if ( ((last_status == 0x90) || (last_status == 0x80)) && (data_seq == 1) ) {
          // check normal note-on or change-word
          if ((in_data >= 48) && (in_data <= 55)) {
            // change word
            set_words(in_data - 48);  // changing a word
            data_seq++;
            ignore_bytes = 1;
          } else {
            mySerial.write(last_status);
            mySerial.write(in_data);
            data_seq++;
          }
        } else {
          // normal data
          if (ignore_bytes == 0) {
            // normal "note on" data
            mySerial.write(in_data);
            data_seq++;
          } else {
            // no output 3rd byte when "changing a word"
            ignore_bytes--;
            data_seq++;
          }
        }
      }
    }
    if ( (data_seq == 3) || ( (data_seq == 2) && (last_status >= 0xC0) && (last_status <= 0xDF) ) ) {
      // end of a message
      data_seq = 0;
      // leave last_status (for running status)
    }
    digitalWrite(led,LOW);
  }
}


文字通り、if文の嵐。

もがいたあとがところどころに散らばって見える
かと。システムメッセージの割り込みとか、
Running Statusとか、1バイト入力ごとの流れの
中で処理すると、ホント面倒。

やっぱ、先人が用意してくれたアリガタイものは
存分に使わせていただくのが正解だな。



コメント ( 0 )