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



とりあえず、シリアルからの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
…おぉ。パッと見て判った。アリゾナだ!!!

すごいねぇ。これ。よくこんなの出来たなぁ。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする