MIDI楽曲

MCIを利用したMIDIの楽曲例です。簡単にドレミ音を再生できるようにしようとしていたのですが、某所に7行MMLプレーヤというものが。。→here

MIDI楽曲(list_62.c)
//-----------------------------------------------------------------
// melody.c:
//     MCIデバイスのMIDI再生の例
//                  Last Update: <2004/11/27 15:58:12 A.Murakami>
//-----------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>

//-----------------------------------------------------------------
enum DOREMI_KEY {
    DO=0,RE=2,MI=4,FA=5,SO=7,RA=9,SI=11
};
enum DOREMI_EXT_KEY {
    S=1,UP=12,DOWN=-12,END=-1
};
//-----------------------------------------------------------------
// melody
//-----------------------------------------------------------------
static int doremi_uta[] = {
    DO,RE,MI,DO,MI,DO,MI,RE,MI,FA,FA,MI,RE,FA,
    MI,FA,SO,MI,SO,MI,SO,FA,SO,RA,RA,SO,FA,RA,
    SO,DO,RE,MI,FA,SO,RA,RA,RE,MI,FA,SO,RA,SI,
    SI,MI,FA,SO,RA,SI,UP+DO,S+SI,SI,RA,FA,SI,SO,UP+DO,END
};
//-----------------------------------------------------------------
int  play_n(int melody[]);
void play_melody(int melody[]);
int  midi_set();
void midi_end();
void midi_play(int note);
//-----------------------------------------------------------------
// midi 演奏
HMIDIOUT hMidiOut;

int main()
{
    int cmd=0;
    if(midi_set()){
        printf("** playing melody\n");
        play_melody(doremi_uta);
        midi_end();
        printf("** end melody.\n");
    }
    return 0;
}

void play_melody(int melody[])
{
    int i;
    for(i=0;i<play_n(melody);i++){
        midi_play(melody[i]);
        Sleep(4000/10);
    }
}
int play_n(int melody[])
{
    int i=0; while(melody[i++]!=END); return --i;
}
int midi_set()
{
    if(!midiOutGetNumDevs()) return 0;
    // MIDI音源を使用できない
    if(midiOutOpen(&hMidiOut,-1,0,0,0)) return 0;
    // MIDI音源がすでに使用されているか、
    // その他の理由で使用できない
    return 1;
}
void midi_end()
{
    midiOutReset(hMidiOut);
    midiOutClose(hMidiOut);
}
void midi_play(int note)
{
    midiOutShortMsg(hMidiOut,0x7F3C90+note*0x100);
}

result
** playing melody
** end melody.


7行MMLプレーヤ(list_62.c)
// 7行MMLプレーヤ(ホントは7行だったものです^^)
#include <windows.h>
#include <mmsystem.h>

HMIDIOUT h;
char*a="cdefgab",*b,*d,o,l=4,m,n;
V(){(m=atoi(b+1))?l=m:0;Sleep(4000/l);} // interval
W(x){midiOutShortMsg(h,x);} // play
main(int c,char**v){
    // melody
    static char play[] =
        "@45c32d32e32g32o5c32d32e32g32o6c32d32e32g32o7c32"\
        "d32e32g32o8c32o7g32e32d32c32o6g32e32d32c32o5g32e32"\
        "d32c32o4g32e32d32o3a32b32o4c32e32a32b32o5c32e32a32"\
        "b32o6c32e32a32b32o7c32e32a32e32c32o6b32a32e32c32o5"\
        "b32a32e32c32o4b32a32e32c32o3b32o3f32g32a32o4c32f32"\
        "g32a32o5c32f32g32a32o6c32f32g32a32o7c32f32c32o6a32"\
        "g32f32c32o5a32g32f32c32o4a32g32f32c32o3a32g32o3g32"\
        "a32b32o4d32g32a32b32o5d32g32a32b32o6d32g32a32b32o7"\
        "d32g32d32o6b32a32g32d32o5b32a32g32d32o4b32a32g32d32"\
        "o3b32a32";
    //r:休符
    //@[音色番号]: 音色を変更
    //cdefgab 音階.それぞれド,レ,ミ,ファ,ソ,ラ,シ
    //音階の後に数字(1-2000)を入れると音の長さを指定できる。
    //  省略時は最後に指定した長さになる。デフォルトは4。
    //o[0-10]: オクターブ指定。デフォルトは4。
    //+: シャープ. 音階の後に付けると半音上がります
    //-: フラット. 音階の後に付けると半音下がります
    if(!midiOutOpen(&h,0,0,0,0))
        for(b=play;*b;b++)
            (d=strchr(a,*b))?
                n=(b[1]==43?b++,1:0),
                c=("024579;"[d-a]-48+n+o*12)*256,
                W(8335504+c),
                V(),
                W(12416+c):*b==111?o=atoi(++b)-4:*b==64?m=atoi(++b),
                W(192+m*256):*b==114?V():0;
    midiOutClose(h);
    return 0;
}
//7行MMLプレーヤ:原文--------------------------------------------
#if 0 // play[] の部分を引数より指定
#include <windows.h>
#include <mmsystem.h>
HMIDIOUT h;char*a="cdefgab",*b,*d,o,l=4,m,n;V(){(m=atoi(b+1))?l=m:0;Sleep(4000/l
);}W(x){midiOutShortMsg(h,x);}main(c,v)char**v;{if(!midiOutOpen(&h,0,0,0,0))for(
b=v[1];*b;b++)(d=strchr(a,*b))?n=(b[1]==43?b++,1:0),c=("024579;"[d-a]-48+n+o*12)
*256,W(8335504+c),V(),W(12416+c):*b==111?o=atoi(++b)-4:*b==64?m=atoi(++b),W(192+
m*256):*b==114?V():0;midiOutClose(h);return 0;}
#endif
//----------------------------------------------------------------
inserted by FC2 system