-template<typename Time>
-void
-SMF<Time>::write_chunk_header(const char id[4], uint32_t length)
-{
- const uint32_t length_be = GUINT32_TO_BE(length);
+ uint8_t const c = buf[0] & 0xf0;
+ bool const store_id = (
+ c == MIDI_CMD_NOTE_ON ||
+ c == MIDI_CMD_NOTE_OFF ||
+ c == MIDI_CMD_PGM_CHANGE ||
+ (c == MIDI_CMD_CONTROL && (buf[1] == MIDI_CTL_MSB_BANK || buf[1] == MIDI_CTL_LSB_BANK))
+ );
+
+ if (store_id && note_id >= 0) {
+ int idlen;
+ int lenlen;
+ uint8_t idbuf[16];
+ uint8_t lenbuf[16];
+
+ event = smf_event_new ();
+ assert(event != NULL);
+
+ /* generate VLQ representation of note ID */
+ idlen = smf_format_vlq (idbuf, sizeof(idbuf), note_id);
+
+ /* generate VLQ representation of meta event length,
+ which is the idlen + 2 bytes (Evoral type ID plus Note ID type)
+ */
+
+ lenlen = smf_format_vlq (lenbuf, sizeof(lenbuf), idlen+2);
+
+ event->midi_buffer_length = 2 + lenlen + 2 + idlen;
+ /* this should be allocated by malloc(3) because libsmf will
+ call free(3) on it
+ */
+ event->midi_buffer = (uint8_t*) malloc (sizeof (uint8_t*) * event->midi_buffer_length);