diff --git a/lib/midi_tools/event.ex b/lib/midi_tools/event.ex new file mode 100644 index 0000000..47caed5 --- /dev/null +++ b/lib/midi_tools/event.ex @@ -0,0 +1,27 @@ +defmodule MIDITools.Event do + defmodule Note do + defstruct channel: 0, tone: 0, start_time: 0, end_time: 0, velocity: 0 + + def new(channel, tone, start_time, end_time, velocity) do + %__MODULE__{ + channel: channel, + tone: tone, + start_time: start_time, + end_time: end_time, + velocity: velocity + } + end + end + + def convert(%Note{ + channel: channel, + tone: tone, + start_time: start_time, + end_time: end_time, + velocity: velocity + }) do + note_on = MIDISynth.Command.note_on(channel, tone, velocity) + note_off = MIDISynth.Command.note_off(channel, tone) + [{start_time, note_on}, {end_time, note_off}] + end +end diff --git a/lib/midi_tools/schedule.ex b/lib/midi_tools/schedule.ex new file mode 100644 index 0000000..b762d73 --- /dev/null +++ b/lib/midi_tools/schedule.ex @@ -0,0 +1,10 @@ +defmodule MIDITools.Schedule do + def convert_events(events) do + events + |> Enum.flat_map(&MIDITools.Event.convert/1) + |> Enum.reduce(%{}, fn {time, midi}, acc -> + Map.update(acc, time, midi, &<>) + end) + |> Enum.sort() + end +end