引き続き、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
最近の彫刻刀。こんな風になっちゃってるのか…
歯ブラシみたい。