foo
[bootcard] / tools / mididump / mididump.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "midi.h"
4
5 unsigned int calc_reload(int note);
6
7 int main(int argc, char **argv)
8 {
9         int i, chan = -1;
10         struct midi *midi;
11         struct midi_event *ev;
12         long ticks;
13
14         if(!argv[1]) {
15                 fprintf(stderr, "pass the path to a midi file\n");
16                 return 1;
17         }
18         if(argv[2]) {
19                 if((chan = atoi(argv[2])) < 0 || chan > 127) {
20                         fprintf(stderr, "invalid channel: %d\n", chan);
21                         return 1;
22                 }
23         }
24
25         if(!(midi = midi_load(argv[1]))) {
26                 fprintf(stderr, "failed to load midi file: %s\n", argv[1]);
27                 return 1;
28         }
29
30         if(chan < 0) {
31                 printf("midi file: %s\n", argv[1]);
32                 if(midi->ppqn > 0) {
33                         printf("  pulses per quarter-note: %d\n", midi->ppqn);
34                 }
35                 if(midi->fps > 0) {
36                         printf("  fps: %d (ticks per frame: %d)\n", midi->fps, midi->ticks_per_frame);
37                 }
38                 printf("  tracks: %d\n", midi->num_tracks);
39                 for(i=0; i<midi->num_tracks; i++) {
40                         if(midi->tracks[i].name) {
41                                 printf("  %d - \"%s\":", i, midi->tracks[i].name);
42                         } else {
43                                 printf("  %d:", i);
44                         }
45                         printf(" %d events\n", midi->tracks[i].num_ev);
46                 }
47                 midi_free(midi);
48                 return 0;
49         }
50
51         if(chan >= midi->num_tracks) {
52                 fprintf(stderr, "invalid track: %d (file has %d tracks)\n", chan, midi->num_tracks);
53                 midi_free(midi);
54                 return 1;
55         }
56
57         ticks = 0;
58         ev = midi->tracks[chan].head;
59         while(ev) {
60                 ticks += ev->dt;
61                 switch(ev->type) {
62                 case MIDI_NOTE_ON:
63                         /*printf("%ld: %d (%d)\n", ticks, MIDI_NOTE_NUM(ev), MIDI_NOTE_VEL(ev));*/
64                         if(ticks >= 0) {
65                                 printf("\tdw %ld, %u\n", ticks, calc_reload(MIDI_NOTE_NUM(ev)));
66                         }
67                         break;
68
69                 case MIDI_NOTE_OFF:
70                         /*printf("%ld: off\n", ticks);*/
71                         if(ticks >= 0) {
72                                 printf("\tdw %ld, 0\n", ticks);
73                         }
74                         break;
75
76                 default:
77                         break;
78                 }
79                 ev = ev->next;
80         }
81
82         midi_free(midi);
83         return 0;
84 }
85
86
87 static float note_freq[] = {
88         27.500, 29.135, 30.868, 32.703, 34.648, 36.708, 38.891, 41.203, 43.654, 46.249,
89         48.999, 51.913, 55.000, 58.270, 61.735, 65.406, 69.296, 73.416, 77.782, 82.407,
90         87.307, 92.499, 97.999, 103.83, 110.00, 116.54, 123.47, 130.81, 138.59, 146.83,
91         155.56, 164.81, 174.61, 185.00, 196.00, 207.65, 220.00, 233.08, 246.94, 261.63,
92         277.18, 293.67, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16,
93         493.88, 523.25, 554.37, 587.33, 622.25, 659.26, 698.46, 739.99, 783.99, 830.61,
94         880.00, 932.33, 987.77, 1046.5, 1108.7, 1174.7, 1244.5, 1318.5, 1396.9, 1480.0,
95         1568.0, 1661.2, 1760.0, 1864.7, 1975.5, 2093.0, 2217.5, 2349.3, 2489.0, 2637.0,
96         2793.0, 2960.0, 3136.0, 3322.4, 3520.0, 3729.3, 3951.1, 4186.0
97 };
98
99 #define OSC     1193182
100
101 unsigned int calc_reload(int note)
102 {
103         if(note < 21 || note > 108) return 0;
104
105         return (int)(OSC / note_freq[note - 21] + 0.5f);
106 }