module Diamond::MIDI::Input
Methods dealing with MIDI
input
Public Class Methods
included(base)
click to toggle source
# File lib/diamond/midi.rb, line 9 def self.included(base) base.send(:extend, Forwardable) base.send(:def_delegators, :@midi, :input, :inputs, :omni_on, :rx_channel, :receive_channel, :rx_channel=, :receive_channel=) end
Public Instance Methods
add(*args)
click to toggle source
Add MIDI
input notes @param [Array<MIDIMessage>, MIDIMessage, *MIDIMessage] args @return [Array<MIDIMessage>]
# File lib/diamond/midi.rb, line 24 def add(*args) @midi.input << args end
Also aliased as: <<
enable_note_control(arpeggiator)
click to toggle source
Initialize adding and removing MIDI
notes from the sequence @param [Arpeggiator] arpeggiator @return [Boolean]
# File lib/diamond/midi.rb, line 40 def enable_note_control(arpeggiator) @midi.input.receive(:class => MIDIMessage::NoteOn) do |event| message = event[:message] if @midi.input.channel.nil? || @midi.input.channel == message.channel puts "[DEBUG] MIDI: add note from input #{message.name} channel: #{message.channel}" if @debug arpeggiator.sequence.add(message) end end @midi.input.receive(:class => MIDIMessage::NoteOff) do |event| message = event[:message] if @midi.input.channel.nil? || @midi.input.channel == message.channel puts "[DEBUG] MIDI: remove note from input #{message.name} channel: #{message.channel}" if @debug arpeggiator.sequence.remove(message) end end true end
enable_parameter_control(arpeggiator, map)
click to toggle source
Initialize a user-defined map of control change messages @param [Arpeggiator] arpeggiator @param [Array<Hash>] map @return [Boolean]
# File lib/diamond/midi.rb, line 62 def enable_parameter_control(arpeggiator, map) midi_cc_range = 0..127 @midi.input.receive(:class => MIDIMessage::ControlChange) do |event| message = event[:message] if @midi.input.channel.nil? || @midi.input.channel == message.channel index = message.index mapping = map.find { |mapping| mapping[:index] == index } property = mapping[:property] parameter_range = apeggiator.parameter.constraints(property) value = message.value value = Scale.transform(value).from(midi_cc_range).to(parameter_range) puts "[DEBUG] MIDI: #{property}= #{value} channel: #{message.channel}" if @debug arpeggiator.parameter.send("#{property}=", value) end end end
remove(*args)
click to toggle source
Add note offs to cancel input @param [Array<MIDIMessage>, MIDIMessage, *MIDIMessage] args @return [Array<MIDIMessage>]
# File lib/diamond/midi.rb, line 32 def remove(*args) messages = MIDIInstrument::Message.to_note_offs(*args) @midi.input.add(messages.compact) end
Private Instance Methods
initialize_input(inputs, options = {})
click to toggle source
@param [Array<UniMIDI::Input>] inputs @param [Hash] options @option options [Fixnum] :channel The receive channel (also: :rx_channel)
# File lib/diamond/midi.rb, line 84 def initialize_input(inputs, options = {}) @midi.input.devices.concat(inputs) @midi.input.channel = options[:receive_channel] end