//Add the passed midi to a recording in Denemo.project->movement static void record_midi (gchar * buf, gdouble time) { buf[0] |= 0xF; //here force the channel to 15 smf_event_t *event = smf_event_new_from_pointer (buf, 3); if (event && smf_event_is_valid (event)) { if (Denemo.project->movement->recorded_midi_track && ((smf_track_t *) Denemo.project->movement->recorded_midi_track)->smf) { smf_track_add_event_seconds (Denemo.project->movement->recorded_midi_track, event, time); if(Denemo.project->movement->recording && noteon_key(event)) { DenemoRecordedNote *note = g_malloc0(sizeof(DenemoRecordedNote)); note->timing = event->time_seconds * Denemo.project->movement->recording->samplerate; notenum2enharmonic (noteon_key(event), &(note->mid_c_offset), &(note->enshift), &(note->octave)); note->event = event; Denemo.project->movement->recording->notes = g_list_append (Denemo.project->movement->recording->notes, note); } } else { smf_event_delete (event); gdk_beep (); } } }
CAMLprim value ocaml_smf_track_add_event_seconds(value track, value event, value seconds) { CAMLparam3(track, event, seconds); float secs; secs = (float)Int_val(seconds); secs /= 1000.0f; smf_track_add_event_seconds(Track_val(track), get_event(event), secs); CAMLreturn(Val_unit); }
int smf_track_add_eot_seconds(smf_track_t *track, double seconds) { smf_event_t *event, *last_event; last_event = smf_track_get_last_event(track); if (last_event != NULL) { if (last_event->time_seconds > seconds) return (-2); } event = smf_event_new_from_bytes(0xFF, 0x2F, 0x00); if (event == NULL) return (-1); smf_track_add_event_seconds(track, event, seconds); return (0); }
static int note_event_save(note_t *note, smf_track_t *track, unsigned char type, double seconds) { unsigned char midi_buffer[3]; smf_event_t *event; midi_buffer[0] = type; midi_buffer[1] = note->key; midi_buffer[2] = note->vel; event = smf_event_new_from_pointer(midi_buffer, 3); if (!event) { return 0; } smf_track_add_event_seconds(track, event, seconds); return 1; }
static int cmd_text(char *str) { double seconds, type; char *time, *typestr, *end; if (selected_track == NULL) { g_critical("Please select a track first, using 'track <number>' command."); return (-1); } if (str == NULL) { g_critical("Usage: text <time-in-seconds> <event-type> <text-itself>"); return (-2); } /* Extract the time. Don't use strsep(3), it doesn't work on SunOS. */ time = str; str = strchr(str, ' '); if (str != NULL) { *str = '\0'; str++; } seconds = strtod(time, &end); if (end - time != strlen(time)) { g_critical("Time is supposed to be a number, without trailing characters."); return (-3); } /* Called with one parameter? */ if (str == NULL) { g_critical("Usage: text <time-in-seconds> <event-type> <text-itself>"); return (-4); } /* Extract the event type. */ typestr = str; str = strchr(str, ' '); if (str != NULL) { *str = '\0'; str++; } type = strtod(typestr, &end); if (end - typestr != strlen(typestr)) { g_critical("Type is supposed to be a number, without trailing characters."); return (-4); } if (type < 1 || type > 9) { g_critical("Valid values for type are 1 - 9, inclusive."); return (-5); } /* Called with one parameter? */ if (str == NULL) { g_critical("Usage: text <time-in-seconds> <event-type> <text-itself>"); return (-4); } selected_event = smf_event_new_textual(type, str); if (selected_event == NULL) { g_critical("smf_event_new_textual() failed, event not created."); return (-6); } assert(smf_event_is_valid(selected_event)); smf_track_add_event_seconds(selected_track, selected_event, seconds); g_message("Event created."); return (0); }
static int cmd_eventadd(char *str) { int midi_buffer_length; double seconds; unsigned char *midi_buffer; char *time, *endtime; if (selected_track == NULL) { g_critical("Please select a track first, using 'track <number>' command."); return (-1); } if (str == NULL) { eventadd_usage(); return (-2); } /* Extract the time. Don't use strsep(3), it doesn't work on SunOS. */ time = str; str = strchr(str, ' '); if (str != NULL) { *str = '\0'; str++; } seconds = strtod(time, &endtime); if (endtime - time != strlen(time)) { g_critical("Time is supposed to be a number, without trailing characters."); return (-3); } /* Called with one parameter? */ if (str == NULL) { eventadd_usage(); return (-4); } if (decode_hex(str, &midi_buffer, &midi_buffer_length)) { eventadd_usage(); return (-5); } selected_event = smf_event_new(); if (selected_event == NULL) { g_critical("smf_event_new() failed, event not created."); return (-6); } selected_event->midi_buffer = midi_buffer; selected_event->midi_buffer_length = midi_buffer_length; if (smf_event_is_valid(selected_event) == 0) { g_critical("Event is invalid from the MIDI specification point of view, not created."); smf_event_delete(selected_event); selected_event = NULL; return (-7); } smf_track_add_event_seconds(selected_track, selected_event, seconds); g_message("Event created."); return (0); }
G_MODULE_EXPORT void on_doIt_clicked( GtkButton *button, gpointer data ) { printf("button clicked\n"); smf_t* smf = smf_new(); smf_track_t* track = smf_track_new(); smf_add_track(smf, track); smf_event_t* event; gboolean prevFrame[NUMBER_OF_KEYS] = { FALSE }; // Start video from beginning currentFrame = startFrame; //upper 9 notes have lyrics //2920 start while (currentFrame <= stopFrame) { int i = 0; if ( currentFrame == stopFrame ) { for (i = 0; i < NUMBER_OF_KEYS; i++ ) { noteOn[i] = FALSE; } } else { redrawFrame(); } // Why NUMBER_OF_KEYS - 10? Well, the lyrics in my example are printed across // the upper 10 notes and were being detected as notes themselves, causing odd // trilling when they scrolled past. This was a quick hack to make that stop. for ( i = 0; i < NUMBER_OF_KEYS - 10; i++ ) { char note = 0xd + i; char eventBytes[3] = { 0 }; eventBytes[1] = note; // which note to play eventBytes[2] = 0x7f; // full velocity (may toy with later) if (prevFrame[i] && (!noteOn[i])) { // Time to generate a note-off eventBytes[0] = 0x80; printf("note-off: %x, at frame %f\n", i + 0xd, currentFrame); } if ((!prevFrame[i]) && noteOn[i]) { // Time to generate a note-on eventBytes[0] = 0x90; printf("note-on: %x, at frame %f\n", i + 0xd, currentFrame); } prevFrame[i] = noteOn[i]; if ( eventBytes[0] ) { event = smf_event_new_from_pointer(eventBytes, 3); smf_track_add_event_seconds(track, event, currentFrame / 30.0); } } currentFrame++; gtk_main_iteration_do( FALSE ); } smf_save(smf, "output.mid"); }
void process_midi_input (jack_nframes_t nframes) { static int time_of_first_event = -1; int /*read,*/ events, i, channel; jack_midi_event_t event; int last_frame_time = jack_last_frame_time(jack_client); void * port_buffer = jack_port_get_buffer(input_port, nframes); if (port_buffer == NULL) { warn_from_jack_thread_context ( "jack_port_get_buffer failed, cannot receive anything." ); return; } #ifdef JACK_MIDI_NEEDS_NFRAMES events = jack_midi_get_event_count(port_buffer, nframes); #else events = jack_midi_get_event_count(port_buffer); #endif for (i = 0; i < events; ++i) { smf_event_t * smf_event; #ifdef JACK_MIDI_NEEDS_NFRAMES int read = jack_midi_event_get(&event, port_buffer, i, nframes); #else int read = jack_midi_event_get(&event, port_buffer, i); #endif if (read) { warn_from_jack_thread_context("jack_midi_event_get failed, RECEIVED NOTE LOST."); continue; } if (event.buffer[0] >= 0xF8) /* Ignore realtime messages. */ continue; if (time_of_first_event == -1) /* First event received? */ time_of_first_event = last_frame_time + event.time; smf_event = smf_event_new_from_pointer(event.buffer, event.size); if (smf_event == NULL) { warn_from_jack_thread_context ( "smf_event_from_pointer failed, RECEIVED NOTE LOST." ); continue; } // assert(smf_event->midi_buffer_length >= 1); channel = smf_event->midi_buffer[0] & 0x0F; smf_track_add_event_seconds ( tracks[channel], smf_event, nframes_to_seconds ( jack_last_frame_time(jack_client) + event.time - time_of_first_event ) ); } }