OSDN Git Service

p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
[proj16/16.git] / 16 / src / miditest.c
1 /* miditest.c\r
2  *\r
3  * Adlib OPL2/OPL3 FM synthesizer chipset test program.\r
4  * Play MIDI file using the OPLx synthesizer (well, poorly anyway)\r
5  * (C) 2010-2012 Jonathan Campbell.\r
6  * Hackipedia DOS library.\r
7  *\r
8  * This code is licensed under the LGPL.\r
9  * <insert LGPL legal text here>\r
10  *\r
11  * Compiles for intended target environments:\r
12  *   - MS-DOS [pure DOS mode, or Windows or OS/2 DOS Box]\r
13  */\r
14 \r
15 #include "src/lib/midi.h"\r
16 \r
17 int main(int argc,char **argv) {\r
18         unsigned long ptick;\r
19         int i,c;\r
20 \r
21         printf("ADLIB FM test program\n");\r
22         if (argc < 2) {\r
23                 printf("You must specify a MIDI file to play\n");\r
24                 return 1;\r
25         }\r
26 \r
27         /*if (!probe_vga()) {\r
28                 printf("Cannot init VGA\n");\r
29                 return 1;\r
30         }*/\r
31         if (!init_adlib()) {\r
32                 printf("Cannot init library\n");\r
33                 return 1;\r
34         }\r
35         if (!probe_8254()) { /* we need the timer to keep time with the music */\r
36                 printf("8254 timer not found\n");\r
37                 return 1;\r
38         }\r
39 \r
40         for (i=0;i < MIDI_MAX_TRACKS;i++) {\r
41                 midi_trk[i].raw = NULL;\r
42                 midi_trk[i].read = NULL;\r
43                 midi_trk[i].fence = NULL;\r
44         }\r
45 \r
46         if (load_midi_file(argv[1]) == 0) {\r
47                 printf("Failed to load MIDI\n");\r
48                 return 1;\r
49         }\r
50 \r
51         write_8254_system_timer(T8254_REF_CLOCK_HZ / 100); /* tick faster at 100Hz please */\r
52         irq0_cnt = 0;\r
53         irq0_add = 182;\r
54         irq0_max = 1000; /* about 18.2Hz */\r
55         old_irq0 = _dos_getvect(8);/*IRQ0*/\r
56         _dos_setvect(8,irq0);\r
57 \r
58         //adlib_shut_up();\r
59         midi_reset_channels();\r
60         midi_reset_tracks();\r
61         _cli();\r
62         irq0_ticks = ptick = 0;\r
63         _sti();\r
64         midi_playing = 1;\r
65 \r
66         while (1) {\r
67                 unsigned long adv;\r
68 \r
69                 _cli();\r
70                 adv = irq0_ticks - ptick;\r
71                 //adv = ptick;\r
72                 if (adv >= 100UL) adv = 100UL;\r
73                 ptick = irq0_ticks;\r
74                 //ptick++;\r
75                 _sti();\r
76 \r
77                 while (adv != 0) {\r
78                         midi_tick();\r
79                         adv--;\r
80                 }\r
81 \r
82                 if (kbhit()) {\r
83                         c = getch();\r
84                         if (c == 0) c = getch() << 8;\r
85 \r
86                         if (c == 27) {\r
87                                 break;\r
88                         }\r
89                 }\r
90         }\r
91 \r
92         midi_playing = 0;\r
93         //adlib_shut_up();\r
94         shutdown_adlib();\r
95         _dos_setvect(8,old_irq0);\r
96         write_8254_system_timer(0); /* back to normal 18.2Hz */\r
97 \r
98         for (i=0;i < MIDI_MAX_TRACKS;i++) {\r
99                 if (midi_trk[i].raw) {\r
100 #if TARGET_MSDOS == 16 && (defined(__LARGE__) || defined(__COMPACT__))\r
101                         _dos_freemem(FP_SEG(midi_trk[i].raw)); /* NTS: Because we allocated with _dos_allocmem */\r
102 #else\r
103                         free(midi_trk[i].raw);\r
104 #endif\r
105                         midi_trk[i].raw = NULL;\r
106                 }\r
107                 midi_trk[i].fence = NULL;\r
108                 midi_trk[i].read = NULL;\r
109         }\r
110 \r
111         return 0;\r
112 }\r