とりあえず、シリアルからのMIDI入力で、BIO100%
的な音色で音楽が鳴るところまで。
#include <MIDI.h>
#include <TimerOne.h>
#include "midi2tone.h"
/***************************/
/*** declare globals ***/
/***************************/
/* define constant values */
#define max_op (4) // 4 poly
#define interrupt_per_sec (100) // interrupt per 1sec
/* declare global variables */
int sound_pin = 8; // Digital 8 pin
int led = 13;
int op_ch[max_op];
int op_tone[max_op]; // each tone read from MIDI
int op_velocity[max_op]; // each velocity read from MIDI
int op_using[max_op]; // whether op is in use
/*********************/
/*** functions ***/
/*********************/
/* midi input process */
void midi_in() {
int i;
int channel;
int data1;
int data2;
if (MIDI.read()) {
switch(MIDI.getType()) {
/*** channel message ***/
case midi::NoteOn:
channel = MIDI.getChannel();
data1 = MIDI.getData1(); // note no
data2 = MIDI.getData2(); // velocity
if(data2 == 0){
/* note off with velocity = 0 */
for (i=0; iif( (op_using[i] == data1) &&
(op_ch[i] == channel) ){
op_ch[i] = 0;
op_using[i] = 0;
op_tone[i] = 0;
op_velocity[i] = 0;
break;
}
}
break;
}
else {
/* note on */
digitalWrite(led,HIGH);
for (i=0; iif(op_using[i] == 0){
op_using[i] = data1;
op_ch[i] = channel;
op_tone[i] = data1;
op_velocity[i] = data2;
break;
}
}
digitalWrite(led,LOW);
}
break;
case midi::NoteOff:
/* note off */
channel = MIDI.getChannel();
data1 = MIDI.getData1(); // note no
for (i=0; iif( (op_using[i] == data1) &&
(op_ch[i] == channel) ){
op_ch[i] = 0;
op_using[i] = 0;
op_tone[i] = 0;
op_velocity[i] = 0;
break;
}
}
break;
case midi::AfterTouchPoly: // 0xAn
case midi::ControlChange: // 0xBn
case midi::PitchBend: // 0xEn
case midi::ProgramChange: // 0xCn
case midi::AfterTouchChannel: // 0xDn
/*** system message ***/
case midi::SystemExclusive: // 0xF0
case midi::TimeCodeQuarterFrame: // 0xF1
case midi::SongSelect: // 0xF3
case midi::SongPosition: // 0xF2
case midi::TuneRequest: // 0xF6
case midi::Clock: // 0xF8
case midi::Start: // 0xFA
case midi::Continue: // 0xFB
case midi::Stop: // 0xFC
case midi::ActiveSensing: // 0xFE
case midi::SystemReset: // 0xFF
// ignore these messages
default:
break;
}
}
}
/* init variables */
void init_val() {
int i;
for (i=0; i/* timer1 interrupt process (output tones) */
void sound_out() {
static int pattern = 0;
int now_tone;
now_tone = op_tone[pattern];
if (now_tone != 0) {
tone(sound_pin, midi2freq[now_tone]);
} else {
noTone(sound_pin);
}
pattern++;
if (pattern == max_op) {
pattern = 0;
}
}
/************************/
/*** main process ***/
/************************/
void setup() {
/* init variables */
init_val();
/* init GPIO */
pinMode(sound_pin, OUTPUT);
pinMode(led, OUTPUT);
/* init timer1 */
Timer1.initialize(1000000 / interrupt_per_sec); // initialize timer1, and set interval
Timer1.attachInterrupt(sound_out); // attaches sound_out() as a timer overflow interrupt
/* init MIDI lib */
MIDI.begin(MIDI_CHANNEL_OMNI);
MIDI.turnThruOff(); // monitoring off
Serial.begin(38400); // for conect to PC
// ( comment out if conect direct to MIDI instrument at 31250bps)
}
void loop() {
midi_in();
}
インクルードファイルに指定している
「midi2tone.h」
っていうファイルは、MIDIのnote番号と周波数の
対比表。急いで作ったので、四捨五入とかで誤差
あるかも。こんな感じ↓。
/* midi to frequency convert table */
int midi2freq[128] = {
0,
9,
9,
10,
10,
11,
12,
12,
13,
14,
15,
15,
16,
17,
18,
19,
21,
22,
23,
25,
26,
28,
30,
31,
33,
35,
37,
39,
41,
44,
46,
49,
52,
55,
58,
62,
65, //NOTE_C2
69, //NOTE_CS2
73, //NOTE_D2
78, //NOTE_DS2
82, //NOTE_E2
87, //NOTE_F2
93, //NOTE_FS2
98, //NOTE_G2
103, //NOTE_GS2
110, //NOTE_A2
117, //NOTE_AS2
124, //NOTE_B2
131, //NOTE_C3
139, //NOTE_CS3
147, //NOTE_D3
156, //NOTE_DS3
165, //NOTE_E3
175, //NOTE_F3
185, //NOTE_FS3
196, //NOTE_G3
208, //NOTE_GS3
220, //NOTE_A3
233, //NOTE_AS3
247, //NOTE_B3
262, //NOTE_C4
277, //NOTE_CS4
294, //NOTE_D4
311, //NOTE_DS4
330, //NOTE_E4
349, //NOTE_F4
370, //NOTE_FS4
392, //NOTE_G4
415, //NOTE_GS4
440, //NOTE_A4
466, //NOTE_AS4
494, //NOTE_B4
523, //NOTE_C5
554, //NOTE_CS5
587, //NOTE_D5
622, //NOTE_DS5
659, //NOTE_E5
699, //NOTE_F5
740, //NOTE_FS5
784, //NOTE_G5
831, //NOTE_GS5
880, //NOTE_A5
932, //NOTE_AS5
988, //NOTE_B5
1047, //NOTE_C6
1109, //NOTE_CS6
1175, //NOTE_D6
1245, //NOTE_DS6
1319, //NOTE_E6
1397, //NOTE_F6
1480, //NOTE_FS6
1568, //NOTE_G6
1661, //NOTE_GS6
1760, //NOTE_A6
1865, //NOTE_AS6
1976, //NOTE_B6
2093, //NOTE_C7
2218, //NOTE_CS7
2349, //NOTE_D7
2489, //NOTE_DS7
2637, //NOTE_E7
2794, //NOTE_F7
2960, //NOTE_FS7
3136, //NOTE_G7
3322, //NOTE_GS7
3520, //NOTE_A7
3729, //NOTE_AS7
3951, //NOTE_B7
4186, //NOTE_C8
4435, //NOTE_CS8
4699, //NOTE_D8
4978, //NOTE_DS8
5274, //NOTE_E8
5588, //NOTE_F8
5920, //NOTE_FS8
6272, //NOTE_G8
6645, //NOTE_GS8
7040, //NOTE_A8
7459, //NOTE_AS8
7902, //NOTE_B8
8372, //NOTE_C9
8870, //NOTE_CS9
9397, //NOTE_D9
9956, //NOTE_DS9
10548, //NOTE_E9
11175, //NOTE_F9
11840, //NOTE_FS9
12544 //NOTE_G9
};
で、そのまま書き込めば、D8から音が出るしくみ。
シリアルからのMIDI入力は、このスケッチの状態だと
38400bpsに上書きしてあって、PCのシリアル出力
(シリアルMIDI)から受け取れるようになってる
んだけど、MIDIシールドとかから直接入力する場合は、
この上書きしてる行をコメントアウトすれば、普通に
31250bpsで通信OK。
で、鳴らしてみると…
MIDファイルとかSMFファイルとかを再生して、この
スケッチ通して音を出してみると、とりあえず原曲
のメロディーが出てくることは出てくる。んだけど、
音色がやっぱりひどい。
BIO100%の、あの矩形波の和音っぽい感じじゃなく、
ノイズだらけって感じ。
さすがに4和音は無理があったみたい。ポップノイズ
的なもので、元のメロディーがグチャグチャな感じ。
BIO100%のSuper Depthとかは、2和音でメロディーと
リズムを鳴らしてる感じなんだよな。
メロディーを2和音ずつ、2つの端子から出力して、
それを抵抗2本で繋いで出力、みたいな感じに出来れば
いいんだけどな。
http://www.kyoto-np.co.jp/top/article/20140123000018
ロジウムを作っちゃう的なスゴイお話なの?それとも
オカルトなの?って思ったら、どうやら、ロジウム的
な触媒の性質を、他の金属で作るって言うお話みたい。
でもなぁ、パラジウム自体も同じ白金族で、高い金属
なんだけどな。まぁ、採掘量とかちょっと違って、
単価が安いんだろうけど。奥歯からも発掘できるし。
それにしても、両隣の金属を混ぜると、その間の金属に
近い性質を持つっていうのは、盲点だったような気が
するなぁ。ほかにも色々応用できたりしないのかな?
逆に、特定の元素の毒性が消えたりとかも。
多分、得られるのは化学的特性で、物理的特性(硬度
とか)は別なんだろうな。
http://headlines.yahoo.co.jp/hl?a=20141021-00000018-rps-bus_all
東急バスの「押しボタン工作キット」の不具合。
へぇ。良くわかんないけど、作って、押してみたけど、
バスが止まらなかったとか?
猫2連発。
http://videotopics.yahoo.co.jp/videolist/official/animal_pet/p0e2778264db7b83de30063931424574b
http://karapaia.livedoor.biz/archives/52176068.html
このトラップ。野生の猫でも使えないかなぁ…
ふと、宇宙空母ブルーノアをヤフオクで探してたら、
サジェスチョンに、
http://page13.auctions.yahoo.co.jp/jp/auction/r119837462
…おぉ。パッと見て判った。アリゾナだ!!!
すごいねぇ。これ。よくこんなの出来たなぁ。