とりあえず、シリアルからの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
…おぉ。パッと見て判った。アリゾナだ!!!
すごいねぇ。これ。よくこんなの出来たなぁ。



|
toneの続き。
なんとなく、toneで4和音は少し無理があるのかな?
出なくはないんだけど、音色が濁って厳しいかも。
で、改めて
http://bio100.jp/game_review/game01.html
ゲームのムービーを見てみると、どうやら2和音で、
ゲームのSEが出るときには音楽が途切れる感じみたい。
2音じゃぁ、メロディーとベースにしかならないな。
コードが鳴らせる感じにしたい。
タイマーを全部使い切ってもいいから、せめて
tone関数が2つ使えないかな。そうすれば、
2音×2和音で4和音がSuper Depthっぽい音色で
出せるんだけどな。
http://swnews.jp/
http://sunspots.sakura.ne.jp/
デカイ黒点だな。こんなの見たことないかも。
どうやら、1ヶ月くらいさかのぼってみてみると、
この間の土星食の合間に撮ってた太陽の写真

に写ってたこの中央ちょっと下の黒点が、ぐるっと
一周して、今の大きさに成長したっぽいなぁ。
あの時も、太陽用フィルター通して太陽見た時に、
デカイ黒点があるなぁと思ってたくらいなんだ
けど、それでもこの大きさだもんな。
しかもここ数日でXクラスのフレアが連続してる
ってことは、黒点がこっち向いたときにドッカン
ということも有りうるんじゃね?こわいね。
|
ニコニコ動画で、PC-8801系の動画をいくつか
眺めてて、チップチューンのことをモヤモヤと
思い出した。
Bio100%の潜水艦のゲーム、Super Depth。
http://bio100.jp/game_review/game01.html
ご存知のとおりの、あのSuper Depthなんだけど、
BEEP音(単音)で無理やり和音を出力してるって
いうのもひとつのポイントだったと思うんだけど、
今となっては、やっぱりノスタルジーすら感じる
チープな音色。
で、ノスタルジジイとしては、むしろそのチープ
な感じを、チップチューンの音源にできないかと
妄想し出す。
以前、
http://nekosan0.bake-neko.net/connection_synth1.html
Arduinoで正弦波の8ポリ出力が出来るMIDI音源とか、
http://picavr.uunyan.com/avr_m2_ppsg.html
似非PSG音源とかを作ったんだけど、これとはまた違う
チップチューンで使えそうな、チープな音源を作れ
ないかなぁ?と。
で、手っ取り早くこの手の音源を作るといえば、
やっぱArduinoでサクッと実験。
http://arduino.cc/en/Tutorial/Tone
ArduinoチュートリアルのページのTone関数の
サンプルを弄って、4和音を出してみる。
#include "TimerOne.h"
#include "pitches.h"
int melody[][8] = {
{NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5},
{NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4},
// { 0, 0, 0, 0, 0, 0, 0, 0},
// { 0, 0, 0, 0, 0, 0, 0, 0},
{NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6},
{NOTE_C6, NOTE_B5, NOTE_A5, NOTE_G5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_C5}
// {NOTE_C3, NOTE_D3, NOTE_E3, NOTE_F3, NOTE_G3, NOTE_A3, NOTE_B3, NOTE_C4},
// {NOTE_C4, NOTE_B3, NOTE_A3, NOTE_G3, NOTE_F3, NOTE_E3, NOTE_D3, NOTE_C3}
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 4, 4, 4,4,4,4,4 };
int notes[4];
void callback() {
static int pattern = 0;
//tone(8, melody[thisNote],noteDuration);
if (notes[pattern] != 0) {
tone(8, notes[pattern]);
} else {
noTone(8);
}
pattern++;
if (pattern == 4) {
pattern = 0;
}
}
void setup() {
Timer1.initialize(1000000 / 100); // initialize timer1, and set a 1/100 second period
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
for (int i=0; i// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000/noteDurations[thisNote];
//tone(8, melody[thisNote],noteDuration);
for (int i=0; idelay(noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
//noTone(8);
for (int i=0; ivoid loop() {
}
(ヘッダファイルは、チュートリアルページに
載ってるので、それをそのままコピペで使用)
D8ピンに圧電素子とか繋げば、それなりに音がでて
くることは判った。
処理方式としては、Toneが当然単音なので、Super
Depthのように、時分割で音程を切り替える方式。
1/100秒ごとに音程を切り替えるようにしてみた
んだけど、とりあえず、オクターブ3以上は問題なく
出てるみたい。
オクターブ2以下は実験してないのでわかんないけど、
1/100秒ごとに切り替えるのと、タイマ割り込みと
微妙に影響しあうと思うので、低音を優先するなら
タイマ割り込み周期を1/50とか、長く設定すれば
よいかと。
(あまり長くすると、音が濁っちゃうけど)
とりあえず、4ポリくらいは、処理能力的には全然
問題ないことが判った。まぁ、そりゃそうだな。
無理があるとすれば、処理能力の方じゃなく、
処理方式に伴う音の濁りの方。
4ポリが出れば、とりあえずセブンスコードくらいは
鳴らせるので、簡単な曲はこれだけでも鳴らせるはず。
http://www.weblio.jp/content/%E3%82%BB%E3%83%96%E3%83%B3%E3%82%B9%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%89
で、音がそれなりに出ることが判ったので、コイツに
MIDIライブラリを組み合わせて、MIDI音源化したら、
チップチューンの音源になりそうかなぁ…と。
メインではなくても、ワンポイントのおかず的に。
MIDI化は、8ポリシンセでやってることの半分なので、
造作ないだろうなと。
https://www.youtube.com/watch?v=Nk6XYuK4QeI
このArduino MIDI音源ライブラリ、詳細が載ってる
ページが見てみたいなぁ。
http://ascii.jp/elem/000/000/943/943505/
へぇ。蛍石を人工的にサクサク作れるようになるみたい。
そしたら、高性能なレンズがジャンジャン作れるように
なるわな。
それは大歓迎としても、蛍石って、経年劣化で曇ったり
変色しちゃうんだよな。人工のでもやっぱりそういう
欠点は継承しちゃうのかな?
あと、硬度が低いから、傷つきやすいとか。最近のは
そうでもないのかな。
http://page13.auctions.yahoo.co.jp/jp/auction/r119536529
あぁ、この8ビットのナツカシPCカタログはお宝だったな。
ちょっと手が出ない値段だったけど。



|
|
|