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バイト入力ごとの流れの
中で処理すると、ホント面倒。
やっぱ、先人が用意してくれたアリガタイものは
存分に使わせていただくのが正解だな。