10c8 /* -*- mode: C; compile-command: "cc fmtest.c -ofmtest"; -*- */ /* Simple test of /dev/music */ #include #include #include #include #include #include #include #include #include #include #define NUM_INSTR 9 #define CHN 0 #define NOTE_C 0 #define NOTE_CISS 1 #define NOTE_D 2 #define NOTE_DISS 3 #define NOTE_E 4 #define NOTE_F 5 #define NOTE_FISS 6 #define NOTE_G 7 #define NOTE_GISS 8 #define NOTE_A 9 #define NOTE_B 10 #define NOTE_H 11 #define NOTE_C1 12 char midibyte,vel,channel; int seqfd,sbfd,i,j; int sb_noteon(char c, char n, char v); int sb_noteoff(char c, char n); int midi_noteon (char c, char n, char v); int midi_noteoff (char c, char n); char pattern[4][16*NUM_INSTR]; char octave[4]; struct sbi_instrument inst; SEQ_DEFINEBUF(4096); main(int argc, char **argv) { FILE *patf; int dtime, tempo, ctrlrate, timebase, instrument[4], dummy, nrsynths; char instfile[80]; strcpy(instfile,argv[1]); instrument[0] = atoi(argv[2]); instrument[1] = atoi(argv[3]); instrument[2] = atoi(argv[4]); instrument[3] = atoi(argv[5]); dtime = atoi(argv[6]); if ((seqfd = open ("/dev/music",O_WRONLY))== -1 ) { printf("Error opening /dev/music!\n"); exit(1); } /* ioctl(seqfd,SNDCTL_FM_4OP_ENABLE,&dummy); */ sbfd = open(instfile,O_RDONLY); for(i=0; i<128; i++) { inst.key = FM_PATCH; /* inst.key = OPL3_PATCH; */ inst.device = 0; inst.channel = i; lseek(sbfd,(off_t)(52*i+36),SEEK_SET); /* lseek(sbfd,(off_t)(60*i+36),SEEK_SET); */ read(sbfd,inst.operators,11); /* read(sbfd,inst.operators,22); */ SEQ_WRPATCH(&inst, sizeof(inst)); } close(sbfd); SEQ_SET_PATCH(0,0,instrument[0]); SEQ_SET_PATCH(0,1,instrument[1]); SEQ_SET_PATCH(0,2,instrument[2]); SEQ_SET_PATCH(0,3,instrument[3]); octave[0] = 3; octave[1] = 6; octave[2] = 6; octave[3] = 6; printf ("Playing...\n"); tempo = 120; ioctl(seqfd, SNDCTL_TMR_TEMPO, &tempo); printf("Tempo: %d\n", tempo); /* timebase = 768; ioctl(seqfd, SNDCTL_TMR_TIMEBASE, &timebase); printf("Timebase: %d\n", timebase); ctrlrate = 0; ioctl(seqfd, SNDCTL_SEQ_CTRLRATE, &ctrlrate); printf("Ctrl rate: %d\n", ctrlrate); */ SEQ_START_TIMER(); while(1) { sb_noteon(0, NOTE_C, 127); sb_noteon(1, NOTE_C, 127); sb_noteon(1, NOTE_DISS, 127); sb_noteon(1, NOTE_G, 127); midi_noteon(9, 44, 127); midi_noteon(9, 35, 127); SEQ_DELTA_TIME(dtime); sb_noteoff(0, NOTE_C); SEQ_DELTA_TIME(dtime); sb_noteon(0,NOTE_C,80); midi_noteon(9,44,127); SEQ_DELTA_TIME(dtime); sb_noteoff(0,NOTE_C); SEQ_DELTA_TIME(dtime); sb_noteon(0,NOTE_DISS,127); midi_noteon(9,40,127); midi_noteon(9,44,127); SEQ_DELTA_TIME(dtime); sb_noteoff(0,NOTE_DISS); SEQ_DELTA_TIME(dtime); sb_noteon(0,NOTE_DISS,80); midi_noteon(9,44,127); SEQ_DELTA_TIME(dtime); sb_noteoff(0,NOTE_DISS); SEQ_DELTA_TIME(dtime); sb_noteon(0,NOTE_F,127); midi_noteon(9,35,127); midi_noteon(9,44,127); SEQ_DELTA_TIME(dtime); sb_noteoff(0,NOTE_F); SEQ_DELTA_TIME(dtime); sb_noteon(0,NOTE_F,80); midi_noteon(9,44,127); SEQ_DELTA_TIME(dtime); sb_noteoff(0,NOTE_F); SEQ_DELTA_TIME(dtime); sb_noteon(0,NOTE_G,127); midi_noteon(9,40,127); midi_noteon(9,44,127); SEQ_DELTA_TIME(dtime); sb_noteoff(0,NOTE_G); SEQ_DELTA_TIME(dtime); sb_noteon(0,NOTE_G,80); midi_noteon(9,46,127); SEQ_DELTA_TIME(dtime); sb_noteoff(0,NOTE_G); SEQ_DELTA_TIME(dtime); } SEQ_DUMPBUF(); close(seqfd); } void seqbuf_dump(void) { if(_seqbufptr) if( write(seqfd, _seqbuf, _seqbufptr) == -1) { perror("write /dev/sequencer"); exit (-1); } _seqbufptr = 0; } sb_noteon(char c, char n, char v) { SEQ_START_NOTE(0, c, (12*octave[c])+n, v); } sb_noteoff(char c, char n) { SEQ_START_NOTE(0, c, (12*octave[c])+n, 0); } midi_noteon(char c, char n, char v) { SEQ_START_NOTE(1, c, n, v); } midi_noteoff(char c, char n) { SEQ_START_NOTE(1, c-1, n, 0); } . 0