class Xi::MIDI::Stream

Constants

VolcaFm

Attributes

channel[RW]
device[RW]

Public Class Methods

new(name, clock, device: 0, channel: 0, **opts) click to toggle source
Calls superclass method
# File lib/xi/midi/stream.rb, line 8
def initialize(name, clock, device: 0, channel: 0, **opts)
  super

  @device = device
  @channel = channel
  @playing_notes = {}

  midi.open(device) unless midi.open?(device)
  at_exit { kill_playing_notes }
end

Public Instance Methods

set(**params) click to toggle source
Calls superclass method
# File lib/xi/midi/stream.rb, line 19
def set(**params)
  super(gate: :midinote, **params)
end
stop() click to toggle source
Calls superclass method
# File lib/xi/midi/stream.rb, line 23
def stop
  kill_playing_notes
  super
end

Private Instance Methods

cc_parameters() click to toggle source

@override

# File lib/xi/midi/stream.rb, line 89
def cc_parameters
  {}
end
do_gate_off_change(changes) click to toggle source
# File lib/xi/midi/stream.rb, line 60
def do_gate_off_change(changes)
  debug "Gate off change: #{changes}"

  changes.each do |change|
    change.fetch(:so_ids).each do |so_id|
      note = @playing_notes.delete(so_id)
      if note
        debug "MIDI Note off: #{[note[:channel], note[:midinote]]}"
        midi.note_off(@device, note[:channel], note[:midinote])
      end
    end
  end
end
do_gate_on_change(changes) click to toggle source
# File lib/xi/midi/stream.rb, line 39
def do_gate_on_change(changes)
  debug "Gate on change: #{changes}"

  channel = Array(@state[:channel] || 0)
  midinote = Array(@state[:midinote] || 60)
  velocity = Array(@state[:velocity] || 127)

  changes.each do |change|
    change.fetch(:so_ids).each.with_index do |so_id, i|
      channel_i = channel[i % channel.size]
      midinote_i = midinote[i % midinote.size]
      velocity_i = velocity[i % velocity.size]

      debug "MIDI Note on: #{[channel_i, midinote_i, velocity_i]}"
      midi.note_on(@device, channel_i, midinote_i, velocity_i)

      @playing_notes[so_id] = {channel: channel_i, midinote: midinote_i}
    end
  end
end
do_state_change() click to toggle source
# File lib/xi/midi/stream.rb, line 74
def do_state_change
  debug "State change: #{changed_state}"

  changed_state.each do |p, vs|
    cc_id = if p.to_s.start_with?('cc_')
      p.to_s.split('_')[1].to_i
    else
      cc_parameters[p]
    end

    Array(vs).each { |v| midi.cc(@device, channel, cc_id, v.to_i) } if cc_id
  end
end
kill_playing_notes() click to toggle source
# File lib/xi/midi/stream.rb, line 30
def kill_playing_notes
  @mutex.synchronize do
    @playing_notes.each do |_, note|
      midi.note_off(@device, note[:channel], note[:midinote])
    end
    @playing_notes.clear
  end
end
latency_sec() click to toggle source
# File lib/xi/midi/stream.rb, line 97
def latency_sec
  0.04
end
midi() click to toggle source
# File lib/xi/midi/stream.rb, line 93
def midi
  Proxy.instance
end