Example #1
0
File: midi.c Project: denemo/denemo
//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 ();
        }
    }
}
Example #2
0
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);
}
Example #3
0
File: smf.c Project: Darko8/libsmf
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);
}
Example #4
0
File: ui.c Project: hbkk/sequencer
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;
}
Example #5
0
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);
}
Example #6
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);
}
Example #7
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
         )
      );
   }
}