class MTK::IO::DLSSynthDevice

An output device for Apple’s built-in “DLS” synthesizer on OS X

Public Instance Methods

close() click to toggle source
# File lib/mtk/io/dls_synth_device.rb, line 135
def close
  if @graph
    AudioToolbox.AUGraphStop(@graph)
    AudioToolbox.DisposeAUGraph(@graph)
  end
end
message(*args) click to toggle source
# File lib/mtk/io/dls_synth_device.rb, line 127
def message(*args)
  arg0 = args[0] || 0
  arg1 = args[1] || 0
  arg2 = args[2] || 0
  AudioToolbox.MusicDeviceMIDIEvent(@synth, arg0, arg1, arg2, 0)
end
name() click to toggle source
# File lib/mtk/io/dls_synth_device.rb, line 77
def name
  'Apple DLS Synthesizer'
end
open() click to toggle source
# File lib/mtk/io/dls_synth_device.rb, line 89
def open
  synth_pointer = FFI::MemoryPointer.new(:pointer)
  graph_pointer = FFI::MemoryPointer.new(:pointer)
  synth_node_pointer = FFI::MemoryPointer.new(:pointer)
  out_node_pointer = FFI::MemoryPointer.new(:pointer)

  cd = AudioToolbox::ComponentDescription.new
  cd[:componentManufacturer] = AudioToolbox::AUDIO_UNIT_MANUFACTURER_APPLE
  cd[:componentFlags] = 0
  cd[:componentFlagsMask] = 0

  require_noerr('create AUGraph') { AudioToolbox.NewAUGraph(graph_pointer) }
  @graph = graph_pointer.get_pointer(0)

  cd[:componentType] = AudioToolbox::AUDIO_UNIT_TYPE_MUSIC_DEVICE
  cd[:componentSubType] = AudioToolbox::AUDIO_UNIT_SUBTYPE_DLS_SYNTH
  require_noerr('add synthNode') { AudioToolbox.AUGraphAddNode(@graph, cd, synth_node_pointer) }
  synth_node = synth_node_pointer.get_pointer(0)

  cd[:componentType] = AudioToolbox::AUDIO_UNIT_TYPE_OUTPUT
  cd[:componentSubType] = AudioToolbox::AUDIO_UNIT_SUBTYPE_DEFAULT_OUTPUT
  require_noerr('add outNode') { AudioToolbox.AUGraphAddNode(@graph, cd, out_node_pointer) }
  out_node = out_node_pointer.get_pointer(0)

  require_noerr('open graph') { AudioToolbox.AUGraphOpen(@graph) }

  require_noerr('connect synth to out') { AudioToolbox.AUGraphConnectNodeInput(@graph, synth_node, 0, out_node, 0) }

  require_noerr('graph info') { AudioToolbox.AUGraphNodeInfo(@graph, synth_node, nil, synth_pointer) }
  @synth = synth_pointer.get_pointer(0)

  require_noerr('init graph') { AudioToolbox.AUGraphInitialize(@graph) }
  require_noerr('start graph') { AudioToolbox.AUGraphStart(@graph) }

  # AudioToolbox.CAShow(@graph) # for debugging
end
require_noerr(action_description, &block) click to toggle source
# File lib/mtk/io/dls_synth_device.rb, line 82
def require_noerr(action_description, &block)
  if block.call != 0
    fail "Failed to #{action_description}"
  end
end