3 Ann Hell Ex Machina - Music Software
4 Copyright (C) 2003/2007 Angel Ortega <angel@triptico.com>
6 midiin.c - Code for testing the libraries
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 http://www.triptico.com
32 #include <sys/types.h>
43 #define MIDI_NOTE_OFF 0x80
44 #define MIDI_NOTE_ON 0x90
45 #define MIDI_AFTERTOUCH 0xA0
46 #define MIDI_PARAMETER 0xB0
47 #define MIDI_PROGRAM 0xC0
48 #define MIDI_PRESSURE 0xD0
49 #define MIDI_PITCHWHEEL 0xE0
50 #define MIDI_SYSEX 0xF0
54 char midi_dev
[150] = "/dev/midi";
58 char instrument
[150] = "samples/acpiano.pat";
60 /* the MIDI message */
61 unsigned char midimsg
[128];
64 /* use the instruments in ss_ins */
65 extern struct ss_ins ss_song_ins
[256];
71 void print_note(int note
)
73 static int octave
= -1;
76 "c", "c#", "d", "d#", "e", "f",
77 "f#", "g", "g#", "a", "a#", "b"
83 if (octave
== -1 || (d
= (octave
- o
)) > 1 || d
< -1) {
84 /* first time or octave too far; set it */
90 printf("%s%s ", notestr
[n
], (d
== -1 ? "'" : (d
== 1 ? "," : "")));
96 void process_MIDI(void)
98 /* strip MIDI channel */
101 if (midimsg
[0] == MIDI_NOTE_OFF
)
102 ss_ins_note_off(&ss_song_ins
[0], midimsg
[1]);
103 else if (midimsg
[0] == MIDI_NOTE_ON
) {
104 ss_ins_note_on(&ss_song_ins
[0], midimsg
[1],
105 ((float) midimsg
[2]) / 127.0, midimsg
[1]);
107 print_note(midimsg
[1]);
116 unsigned char midibuf
[128];
121 /* read from MIDI device */
122 c
= read(midi_fd
, midibuf
, sizeof(midibuf
));
125 for (n
= 0; n
< c
; n
++) {
126 /* if 7bit of input is set,
127 it's a start of MIDI message */
128 if ((midibuf
[n
] & 0x80) && i_msg
)
131 midimsg
[i_msg
++] = midibuf
[n
];
135 ss_output_init_frame(sample
);
136 ss_ins_frame(&ss_song_ins
[0], sample
);
137 ss_output_write(sample
);
142 int main(int argc
, char *argv
[])
146 ss_interpolation
= 1;
147 ss_frequency
= 44100;
148 ss_master_volume
= 1;
151 libpath_add("~/ahxmlib", 0);
153 /* default converters */
154 transconv_add(".flac", ".wav", "flac -d -s -o '%s' '%s'");
155 transconv_add(".mp3", ".wav", "mpg321 -q -w '%s' '%s'");
159 printf("midiin [instrument.pat] [midi device]\n");
164 strcpy(instrument
, argv
[1]);
167 strcpy(midi_dev
, argv
[2]);
171 /* loads the instrument or bangs */
172 ss_ins_init(&ss_song_ins
[0]);
174 if ((ext
= strchr(instrument
, '.')) == NULL
) {
175 printf("The instrument '%s' doesn't have an extension\n", instrument
);
179 if (strcmp(ext
, ".pat") == 0 || strcmp(ext
, ".PAT") == 0) {
180 if (ss_load_pat_file(&ss_song_ins
[0], instrument
) < 0) {
181 printf("Error loading '%s'\n", instrument
);
186 if (compile_ahs(instrument
))
189 if (ss_song_render(0, "default", NULL
))
193 /* opens the MIDI channel */
194 if ((midi_fd
= open(midi_dev
, O_RDONLY
| O_NONBLOCK
)) == -1) {
195 printf("Error opening midi device '%s'\n", midi_dev
);