X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=python%2Fmidi.c;h=0c698ded7054104224927abe6fbe8b2e0968e858;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=23d67eb3b7ad71878526218a026af955b5c14e60;hpb=75eebcb49e52d296b1da3e1074e0825d2c780db4;p=lilypond.git diff --git a/python/midi.c b/python/midi.c index 23d67eb3b7..0c698ded70 100644 --- a/python/midi.c +++ b/python/midi.c @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2008 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -75,47 +75,47 @@ typedef struct message { } message_t; message_t channelVoiceMessages[] = { - 0x80, "NOTE_OFF", - 0x90, "NOTE_ON", - 0xA0, "POLYPHONIC_KEY_PRESSURE", - 0xB0, "CONTROLLER_CHANGE", - 0xC0, "PROGRAM_CHANGE", - 0xD0, "CHANNEL_KEY_PRESSURE", - 0xE0, "PITCH_BEND", - 0,0 + {0x80, "NOTE_OFF"}, + {0x90, "NOTE_ON"}, + {0xA0, "POLYPHONIC_KEY_PRESSURE"}, + {0xB0, "CONTROLLER_CHANGE"}, + {0xC0, "PROGRAM_CHANGE"}, + {0xD0, "CHANNEL_KEY_PRESSURE"}, + {0xE0, "PITCH_BEND"}, + {0,0} }; message_t channelModeMessages[] = { - 0x78, "ALL_SOUND_OFF", - 0x79, "RESET_ALL_CONTROLLERS", - 0x7A, "LOCAL_CONTROL", - 0x7B, "ALL_NOTES_OFF", - 0x7C, "OMNI_MODE_OFF", - 0x7D, "OMNI_MODE_ON", - 0x7E, "MONO_MODE_ON", - 0x7F, "POLY_MODE_ON", - 0,0 + {0x78, "ALL_SOUND_OFF"}, + {0x79, "RESET_ALL_CONTROLLERS"}, + {0x7A, "LOCAL_CONTROL"}, + {0x7B, "ALL_NOTES_OFF"}, + {0x7C, "OMNI_MODE_OFF"}, + {0x7D, "OMNI_MODE_ON"}, + {0x7E, "MONO_MODE_ON"}, + {0x7F, "POLY_MODE_ON"}, + {0,0} }; message_t metaEvents[] = { - 0x00, "SEQUENCE_NUMBER", - 0x01, "TEXT_EVENT", - 0x02, "COPYRIGHT_NOTICE", - 0x03, "SEQUENCE_TRACK_NAME", - 0x04, "INSTRUMENT_NAME", - 0x05, "LYRIC", - 0x06, "MARKER", - 0x07, "CUE_POINT", - 0x20, "MIDI_CHANNEL_PREFIX", - 0x21, "MIDI_PORT", - 0x2F, "END_OF_TRACK", - 0x51, "SET_TEMPO", - 0x54, "SMTPE_OFFSET", - 0x58, "TIME_SIGNATURE", - 0x59, "KEY_SIGNATURE", - 0x7F, "SEQUENCER_SPECIFIC_META_EVENT", - 0xFF, "META_EVENT", - 0,0 + {0x00, "SEQUENCE_NUMBER"}, + {0x01, "TEXT_EVENT"}, + {0x02, "COPYRIGHT_NOTICE"}, + {0x03, "SEQUENCE_TRACK_NAME"}, + {0x04, "INSTRUMENT_NAME"}, + {0x05, "LYRIC"}, + {0x06, "MARKER"}, + {0x07, "CUE_POINT"}, + {0x20, "MIDI_CHANNEL_PREFIX"}, + {0x21, "MIDI_PORT"}, + {0x2F, "END_OF_TRACK"}, + {0x51, "SET_TEMPO"}, + {0x54, "SMTPE_OFFSET"}, + {0x58, "TIME_SIGNATURE"}, + {0x59, "KEY_SIGNATURE"}, + {0x7F, "SEQUENCER_SPECIFIC_META_EVENT"}, + {0xFF, "META_EVENT"}, + {0,0} }; void @@ -135,7 +135,8 @@ get_number (unsigned char ** str, unsigned char * end_str, int length) long sum = 0; int i = 0; - for (; i < length; i++) + for (; i < length && + ((*str) + i < end_str); i++) sum = (sum << 8) + (unsigned char) (*str)[i]; *str += length; @@ -147,7 +148,7 @@ unsigned long int get_variable_length_number (unsigned char **str, unsigned char * end_str) { long sum = 0; - int i = 0; + while (*str < end_str) { unsigned char x = **str; @@ -204,8 +205,8 @@ read_string (unsigned char **track, unsigned char *end) } typedef PyObject* (*Read_midi_event) - (unsigned char **track, unsigned char *end, - unsigned char x); + (unsigned char **track, unsigned char *end, + unsigned char x); static PyObject * @@ -272,7 +273,6 @@ static PyObject * midi_parse_track (unsigned char **track, unsigned char *track_end) { unsigned int time = 0; - unsigned char running_status; unsigned long track_len, track_size; PyObject *pytrack = 0; @@ -299,10 +299,13 @@ midi_parse_track (unsigned char **track, unsigned char *track_end) pytrack = PyList_New (0); - track_end = *track + track_len; + if (*track + track_len < track_end) + track_end = *track + track_len; { PyObject *pytime = PyInt_FromLong (0L); + unsigned char running_status = 0; + while (*track < track_end) { long dt = get_variable_length_number(track, track_end); @@ -328,9 +331,7 @@ static PyObject * pymidi_parse_track (PyObject *self, PyObject *args) { unsigned char *track, *track_end; - unsigned long track_size, track_len; - - PyObject * sobj = PyTuple_GetItem (args, 0); + unsigned long track_size; debug_print ("%s", "\n"); if (!PyArg_ParseTuple (args, "s#", &track, &track_size)) @@ -357,7 +358,6 @@ midi_parse (unsigned char **midi,unsigned char *midi_end) /* Header */ header_len = get_number (midi, *midi + 4, 4); - if (header_len < 6) return midi_error (__FUNCTION__, ": header too short"); @@ -372,7 +372,7 @@ midi_parse (unsigned char **midi,unsigned char *midi_end) if (division < 0) - /* return midi_error ("can't handle non-metrical time"); */ + /* return midi_error (cannot handle non-metrical time"); */ ; *midi += header_len - 6; @@ -391,16 +391,14 @@ static PyObject * pymidi_parse (PyObject *self, PyObject *args) { unsigned char *midi, *midi_end; - unsigned long midi_size, midi_len; + unsigned long midi_size; - PyObject *sobj = PyTuple_GetItem (args, 0); - debug_print ("%s", "\n"); if (!PyArg_ParseTuple (args, "s#", &midi, &midi_size)) return 0; if (memcmp (midi, "MThd", 4)) - return midi_error (__FUNCTION__, ": MThd expected"); + return midi_error (__FUNCTION__, ": MThd expected"); midi += 4; @@ -429,5 +427,10 @@ initmidi (void) add_constants (d); Midi_warning = PyString_FromString ("midi.warning"); PyDict_SetItemString (d, "warning", Midi_warning); + + /* + FIXME. + */ + (void) midi_warning; }