midi_player/lib/midi_tools/schedule.ex

25 lines
657 B
Elixir
Raw Normal View History

defmodule MIDITools.Schedule do
2020-10-11 11:40:12 +00:00
@moduledoc """
Functions for using a MIDI schedule.
"""
@typedoc """
A list of tuples which indicate that the MIDI binary should play at the given time.
"""
@type t :: [{non_neg_integer(), binary()}]
@doc """
Convert a list of events to MIDI schedule.
See `MIDITools.Event` for creating these events.
"""
@spec convert_events([MIDITools.Event.t()]) :: t()
def convert_events(events) do
events
|> Enum.flat_map(&MIDITools.Event.convert/1)
|> Enum.reduce(%{}, fn {time, midi}, acc ->
2020-10-11 10:34:11 +00:00
Map.update(acc, time, midi, &<<&1::binary, midi::binary>>)
end)
|> Enum.sort()
end
end