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

<<(*args)
Alias for: add
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