<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -27,9 +27,9 @@ scale = [ C4, Cs4, D4, Eb4, E4, F4, Fs4, G4, Gs4, A4, Bb4, B4,
           C5, Cs5, D5, Eb5, E5, F5, Fs5, G5, Gs5, A5, Bb5, B5 ]
 
 scale.each do |note|
-	midi.play note
+  midi.play note
 end
 
 scale.reverse.each do |note|
-	midi.play note
+  midi.play note
 end</diff>
      <filename>examples/chromatic_scale.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,15 +28,15 @@
 @tempo = 120.0
 
 if input = ARGV[0]
-	begin
-		@tempo = Float( input )
-	rescue ArgumentError =&gt; e
-		$stderr.puts &quot;'#{input}' is not a valid tempo.\n&quot;
-		$stderr.puts &quot;Please specify the tempo in beats per minute &quot; +
-			&quot;(bpm).  Fractional values are allowed!&quot;
+  begin
+    @tempo = Float( input )
+  rescue ArgumentError =&gt; e
+    $stderr.puts &quot;'#{input}' is not a valid tempo.\n&quot;
+    $stderr.puts &quot;Please specify the tempo in beats per minute &quot; +
+      &quot;(bpm).  Fractional values are allowed!&quot;
 
-		exit 1
-	end
+    exit 1
+  end
 end
 
 require 'rubygems'
@@ -66,10 +66,10 @@ Signal.trap( &quot;INT&quot; ) { @timer.thread.exit! }
 @timer = MIDIator::Timer.new( @interval / 10 )
 
 def register_next_bang( time )
-	@timer.at( time ) do |yielded_time|
-		register_next_bang yielded_time + @interval
-		@midi.play MiddleC
-	end
+  @timer.at( time ) do |yielded_time|
+    register_next_bang yielded_time + @interval
+    @midi.play MiddleC
+  end
 end
 
 puts &quot;Starting metronome running at #{@tempo} bpm.&quot;</diff>
      <filename>examples/metronome.rb</filename>
    </modified>
    <modified>
      <diff>@@ -26,9 +26,9 @@ scale = [ C4, Cs4, D4, Eb4, E4, F4, Fs4, G4, Gs4, A4, Bb4, B4,
           C5, Cs5, D5, Eb5, E5, F5, Fs5, G5, Gs5, A5, Bb5, B5 ]
 
 scale.each do |note|
-	midi.play note
+  midi.play note
 end
 
 scale.reverse.each do |note|
-	midi.play note
+  midi.play note
 end</diff>
      <filename>examples/synth.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,22 +14,22 @@
 #
 
 module MIDIator
-	VERSION = &quot;0.3.0&quot;
+  VERSION = &quot;0.3.0&quot;
 end
 
 #####################################################################
-###	E X T E R N A L   D E P E N D E N C I E S
+###  E X T E R N A L   D E P E N D E N C I E S
 #####################################################################
 require 'rubygems'
 require 'platform'
 
 #####################################################################
-###	C O R E   L I B R A R Y   E X T E N S I O N S
+###  C O R E   L I B R A R Y   E X T E N S I O N S
 #####################################################################
 require 'string_extensions'
 
 #####################################################################
-###	M I D I A T O R   C O R E
+###  M I D I A T O R   C O R E
 #####################################################################
 require 'midiator/driver'
 require 'midiator/driver_registry'</diff>
      <filename>lib/midiator.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,127 +22,127 @@ require 'midiator/driver_registry'
 
 class MIDIator::Driver
 
-	##########################################################################
-	### M I D I   C O M M A N D   C O N S T A N T S
-	##########################################################################
+  ##########################################################################
+  ### M I D I   C O M M A N D   C O N S T A N T S
+  ##########################################################################
 
-	# Note on
-	ON  = 0x90
+  # Note on
+  ON  = 0x90
 
-	# Note off
-	OFF = 0x80
+  # Note off
+  OFF = 0x80
 
-	# Polyphonic aftertouch
-	PA  = 0xa0
+  # Polyphonic aftertouch
+  PA  = 0xa0
 
-	# Control change
-	CC  = 0xb0
+  # Control change
+  CC  = 0xb0
 
-	# Program change
-	PC  = 0xc0
+  # Program change
+  PC  = 0xc0
 
-	# Channel aftertouch
-	CA  = 0xd0
+  # Channel aftertouch
+  CA  = 0xd0
 
-	# Pitch bend
-	PB  = 0xe0
+  # Pitch bend
+  PB  = 0xe0
 
-	##########################################################################
-	### M A G I C   H O O K S
-	##########################################################################
+  ##########################################################################
+  ### M A G I C   H O O K S
+  ##########################################################################
 
-	### Auto-registers subclasses of MIDIator::Driver with the driver registry.
-	def self::inherited( driver_class )
-		driver_name = driver_class.to_s.underscore
-		MIDIator::DriverRegistry.instance.register( driver_name, driver_class )
-	end
+  ### Auto-registers subclasses of MIDIator::Driver with the driver registry.
+  def self::inherited( driver_class )
+    driver_name = driver_class.to_s.underscore
+    MIDIator::DriverRegistry.instance.register( driver_name, driver_class )
+  end
 
 
-	##########################################################################
-	### I N T E R F A C E   A P I
-	##########################################################################
-	# These methods are the same across all drivers and are the interface that
-	# MIDIator::Interface interacts with.
-	##########################################################################
+  ##########################################################################
+  ### I N T E R F A C E   A P I
+  ##########################################################################
+  # These methods are the same across all drivers and are the interface that
+  # MIDIator::Interface interacts with.
+  ##########################################################################
 
-	### Do any pre-open setup necessary.  Often will not be overridden.
-	def initialize
-		open
-	end
+  ### Do any pre-open setup necessary.  Often will not be overridden.
+  def initialize
+    open
+  end
 
 
-	### Shortcut to send a note_on message.
-	def note_on( note, channel, velocity )
-		message( ON | channel, note, velocity )
-	end
+  ### Shortcut to send a note_on message.
+  def note_on( note, channel, velocity )
+    message( ON | channel, note, velocity )
+  end
 
 
-	### Shortcut to send a note_off message.
-	def note_off( note, channel, velocity = 0 )
-		message( OFF | channel, note, velocity )
-	end
+  ### Shortcut to send a note_off message.
+  def note_off( note, channel, velocity = 0 )
+    message( OFF | channel, note, velocity )
+  end
 
 
-	### Shortcut to send a polyphonic aftertouch message for an individual note.
-	def aftertouch( note, channel, pressure )
-		message( PA | channel, note, pressure )
-	end
+  ### Shortcut to send a polyphonic aftertouch message for an individual note.
+  def aftertouch( note, channel, pressure )
+    message( PA | channel, note, pressure )
+  end
 
 
-	### Shortcut to send a control change.
-	def control_change( number, channel, value )
-		message( CC | channel, number, value )
-	end
+  ### Shortcut to send a control change.
+  def control_change( number, channel, value )
+    message( CC | channel, number, value )
+  end
 
 
-	### Shortcut to send a program_change message.
-	def program_change( channel, program )
-		message( PC | channel, program )
-	end
+  ### Shortcut to send a program_change message.
+  def program_change( channel, program )
+    message( PC | channel, program )
+  end
 
 
-	### Shortcut to send a channel aftertouch message.
-	def channel_aftertouch( channel, pressure )
-		message( CA | channel, pressure )
-	end
+  ### Shortcut to send a channel aftertouch message.
+  def channel_aftertouch( channel, pressure )
+    message( CA | channel, pressure )
+  end
 
 
-	### Shortcut to send a pitch bend message.
-	def pitch_bend( channel, value )
-		message( PB | channel, value )
-	end
-	alias bend pitch_bend
+  ### Shortcut to send a pitch bend message.
+  def pitch_bend( channel, value )
+    message( PB | channel, value )
+  end
+  alias bend pitch_bend
 
 
-	##########################################################################
-	### D R I V E R   A P I
-	##########################################################################
-	# subclasses must implement these methods.
-	##########################################################################
-	protected
-	##########################################################################
+  ##########################################################################
+  ### D R I V E R   A P I
+  ##########################################################################
+  # subclasses must implement these methods.
+  ##########################################################################
+  protected
+  ##########################################################################
 
-	### Open the channel to the MIDI service.
-	def open
-		raise NotImplementedError, &quot;You must implement #open in your driver.&quot;
-	end
+  ### Open the channel to the MIDI service.
+  def open
+    raise NotImplementedError, &quot;You must implement #open in your driver.&quot;
+  end
 
 
-	### Close the channel to the MIDI service.
-	def close
-		raise NotImplementedError, &quot;You must implement #close in your driver.&quot;
-	end
+  ### Close the channel to the MIDI service.
+  def close
+    raise NotImplementedError, &quot;You must implement #close in your driver.&quot;
+  end
 
 
-	### Send MIDI message to the MIDI service.
-	def message( *args )
-		raise NotImplementedError, &quot;You must implement #message in your driver.&quot;
-	end
+  ### Send MIDI message to the MIDI service.
+  def message( *args )
+    raise NotImplementedError, &quot;You must implement #message in your driver.&quot;
+  end
 
 
-	### The only non-required method.  Override this to give the user instructions
-	### if necessary.
-	def instruct_user!
-	end
+  ### The only non-required method.  Override this to give the user instructions
+  ### if necessary.
+  def instruct_user!
+  end
 
 end</diff>
      <filename>lib/midiator/driver.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,37 +17,37 @@ require 'singleton'
 require 'midiator'
 
 class MIDIator::DriverRegistry
-	include Singleton
+  include Singleton
 
-	### Stores the given +klass+ in the &lt;tt&gt;@drivers&lt;/tt&gt; hash, keyed by +name+.
-	### Typically called via MIDIator::Driver's +inherited+ hook.
-	def register_driver( name, klass )
-		@drivers ||= {}
+  ### Stores the given +klass+ in the &lt;tt&gt;@drivers&lt;/tt&gt; hash, keyed by +name+.
+  ### Typically called via MIDIator::Driver's +inherited+ hook.
+  def register_driver( name, klass )
+    @drivers ||= {}
 
-		raise ArgumentError, &quot;Attempted to register something that is not a MIDIator::Driver&quot; unless
-			klass &lt; MIDIator::Driver
+    raise ArgumentError, &quot;Attempted to register something that is not a MIDIator::Driver&quot; unless
+      klass &lt; MIDIator::Driver
 
-		@drivers.each do |existing_name, existing_klass|
-			raise ArgumentError, &quot;Already registered #{existing_klass.to_s} as '#{existing_name}'.&quot; if
-				existing_klass == klass
-		end
+    @drivers.each do |existing_name, existing_klass|
+      raise ArgumentError, &quot;Already registered #{existing_klass.to_s} as '#{existing_name}'.&quot; if
+        existing_klass == klass
+    end
 
-		@drivers[ name ] = klass
-	end
-	alias register register_driver
-	alias &lt;&lt;       register_driver
+    @drivers[ name ] = klass
+  end
+  alias register register_driver
+  alias &lt;&lt;       register_driver
 
 
-	### Returns the number of drivers currently registered.
-	def size
-		return @drivers.size
-	end
+  ### Returns the number of drivers currently registered.
+  def size
+    return @drivers.size
+  end
 
 
-	### Included to make the registry quack like a hash. Delegates to the
-	### &lt;tt&gt;@drivers&lt;/tt&gt; hash.
-	def []( name )
-		return @drivers[ name ]
-	end
+  ### Included to make the registry quack like a hash. Delegates to the
+  ### &lt;tt&gt;@drivers&lt;/tt&gt; hash.
+  def []( name )
+    return @drivers[ name ]
+  end
 
 end</diff>
      <filename>lib/midiator/driver_registry.rb</filename>
    </modified>
    <modified>
      <diff>@@ -24,40 +24,40 @@ require 'midiator/driver'
 require 'midiator/driver_registry'
 
 class MIDIator::Driver::ALSA &lt; MIDIator::Driver # :nodoc:
-	# tell the user they need to connect to their output
-	def instruct_user!
-		$stderr.puts &quot;[MIDIator] Please connect the MIDIator output port to your input&quot;
-		$stderr.puts &quot;[MIDIator] of choice.  You can use qjackctl or aconnect to do so.&quot;
-		$stderr.puts &quot;[MIDIator]&quot;
-		$stderr.puts &quot;[MIDIator] Press enter when you're done.&quot;
-
-		gets # wait for the enter
-	end
-
-
-	module C # :nodoc:
-		extend DL::Importable
-		dlload 'libasound.so'
-
-		extern &quot;int snd_rawmidi_open(void*, void*, char*, int)&quot;
-		extern &quot;int snd_rawmidi_close(void*)&quot;
-		extern &quot;int snd_rawmidi_write(void*, void*, int)&quot;
-		extern &quot;int snd_rawmidi_drain(void*)&quot;
-	end
-
-	def open
-		@output = DL::PtrData.new(nil)
-		C.snd_rawmidi_open(nil, @output.ref, &quot;virtual&quot;, 0)
-	end
-
-	def close
-		C.snd_rawmidi_close(@output)
-	end
-
-	def message(*args)
-		format = &quot;C&quot; * args.size
-		bytes = args.pack(format).to_ptr
-		C.snd_rawmidi_write(@output, bytes, args.size)
-		C.snd_rawmidi_drain(@output)
-	end
+  # tell the user they need to connect to their output
+  def instruct_user!
+    $stderr.puts &quot;[MIDIator] Please connect the MIDIator output port to your input&quot;
+    $stderr.puts &quot;[MIDIator] of choice.  You can use qjackctl or aconnect to do so.&quot;
+    $stderr.puts &quot;[MIDIator]&quot;
+    $stderr.puts &quot;[MIDIator] Press enter when you're done.&quot;
+
+    gets # wait for the enter
+  end
+
+
+  module C # :nodoc:
+    extend DL::Importable
+    dlload 'libasound.so'
+
+    extern &quot;int snd_rawmidi_open(void*, void*, char*, int)&quot;
+    extern &quot;int snd_rawmidi_close(void*)&quot;
+    extern &quot;int snd_rawmidi_write(void*, void*, int)&quot;
+    extern &quot;int snd_rawmidi_drain(void*)&quot;
+  end
+
+  def open
+    @output = DL::PtrData.new(nil)
+    C.snd_rawmidi_open(nil, @output.ref, &quot;virtual&quot;, 0)
+  end
+
+  def close
+    C.snd_rawmidi_close(@output)
+  end
+
+  def message(*args)
+    format = &quot;C&quot; * args.size
+    bytes = args.pack(format).to_ptr
+    C.snd_rawmidi_write(@output, bytes, args.size)
+    C.snd_rawmidi_drain(@output)
+  end
 end</diff>
      <filename>lib/midiator/drivers/alsa.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,61 +22,61 @@ require 'midiator/driver'
 require 'midiator/driver_registry'
 
 class MIDIator::Driver::CoreMIDI &lt; MIDIator::Driver # :nodoc:
-	##########################################################################
-	### S Y S T E M   I N T E R F A C E
-	##########################################################################
-	module C # :nodoc:
-		extend DL::Importable
-		dlload '/System/Library/Frameworks/CoreMIDI.framework/Versions/Current/CoreMIDI'
+  ##########################################################################
+  ### S Y S T E M   I N T E R F A C E
+  ##########################################################################
+  module C # :nodoc:
+    extend DL::Importable
+    dlload '/System/Library/Frameworks/CoreMIDI.framework/Versions/Current/CoreMIDI'
 
-		extern &quot;int MIDIClientCreate( void*, void*, void*, void* )&quot;
-		extern &quot;int MIDIClientDispose( void* )&quot;
-		extern &quot;int MIDIGetNumberOfDestinations()&quot;
-		extern &quot;void* MIDIGetDestination( int )&quot;
-		extern &quot;int MIDIOutputPortCreate( void*, void*, void* )&quot;
-		extern &quot;void* MIDIPacketListInit( void* )&quot;
-		extern &quot;void* MIDIPacketListAdd( void*, int, void*, int, int, int, void* )&quot;
-		extern &quot;int MIDISend( void*, void*, void* )&quot;
-	end
+    extern &quot;int MIDIClientCreate( void*, void*, void*, void* )&quot;
+    extern &quot;int MIDIClientDispose( void* )&quot;
+    extern &quot;int MIDIGetNumberOfDestinations()&quot;
+    extern &quot;void* MIDIGetDestination( int )&quot;
+    extern &quot;int MIDIOutputPortCreate( void*, void*, void* )&quot;
+    extern &quot;void* MIDIPacketListInit( void* )&quot;
+    extern &quot;void* MIDIPacketListAdd( void*, int, void*, int, int, int, void* )&quot;
+    extern &quot;int MIDISend( void*, void*, void* )&quot;
+  end
 
-	module CF # :nodoc:
-		extend DL::Importable
-		dlload '/System/Library/Frameworks/CoreFoundation.framework/Versions/Current/CoreFoundation'
+  module CF # :nodoc:
+    extend DL::Importable
+    dlload '/System/Library/Frameworks/CoreFoundation.framework/Versions/Current/CoreFoundation'
 
-		extern &quot;void* CFStringCreateWithCString( void*, char*, int )&quot;
-	end
+    extern &quot;void* CFStringCreateWithCString( void*, char*, int )&quot;
+  end
 
-	##########################################################################
-	### D R I V E R   A P I
-	##########################################################################
+  ##########################################################################
+  ### D R I V E R   A P I
+  ##########################################################################
 
-	def open
-		client_name = CF.cFStringCreateWithCString( nil, &quot;MIDIator&quot;, 0 )
-		@client = DL::PtrData.new( nil )
-		C.mIDIClientCreate( client_name, nil, nil, @client.ref )
+  def open
+    client_name = CF.cFStringCreateWithCString( nil, &quot;MIDIator&quot;, 0 )
+    @client = DL::PtrData.new( nil )
+    C.mIDIClientCreate( client_name, nil, nil, @client.ref )
 
-		port_name = CF.cFStringCreateWithCString( nil, &quot;Output&quot;, 0 )
-		@outport = DL::PtrData.new( nil )
-		C.mIDIOutputPortCreate( @client, port_name, @outport.ref )
+    port_name = CF.cFStringCreateWithCString( nil, &quot;Output&quot;, 0 )
+    @outport = DL::PtrData.new( nil )
+    C.mIDIOutputPortCreate( @client, port_name, @outport.ref )
 
-		number_of_destinations = C.mIDIGetNumberOfDestinations
-		raise MIDIator::NoMIDIDestinations if number_of_destinations &lt; 1
-		@destination = C.mIDIGetDestination( 0 )
-	end
+    number_of_destinations = C.mIDIGetNumberOfDestinations
+    raise MIDIator::NoMIDIDestinations if number_of_destinations &lt; 1
+    @destination = C.mIDIGetDestination( 0 )
+  end
 
-	def close
-		C.mIDIClientDispose( @client )
-	end
+  def close
+    C.mIDIClientDispose( @client )
+  end
 
-	def message( *args )
-		format = &quot;C&quot; * args.size
-		bytes = args.pack( format ).to_ptr
-		packet_list = DL.malloc( 256 )
-		packet_ptr = C.mIDIPacketListInit( packet_list )
+  def message( *args )
+    format = &quot;C&quot; * args.size
+    bytes = args.pack( format ).to_ptr
+    packet_list = DL.malloc( 256 )
+    packet_ptr = C.mIDIPacketListInit( packet_list )
 
-		# Pass in two 32-bit 0s for the 64 bit time
-		packet_ptr = C.mIDIPacketListAdd( packet_list, 256, packet_ptr, 0, 0, args.size, bytes )
+    # Pass in two 32-bit 0s for the 64 bit time
+    packet_ptr = C.mIDIPacketListAdd( packet_list, 256, packet_ptr, 0, 0, args.size, bytes )
 
-		C.mIDISend( @outport, @destination, packet_list )
-	end
+    C.mIDISend( @outport, @destination, packet_list )
+  end
 end</diff>
      <filename>lib/midiator/drivers/core_midi.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,105 +15,105 @@ require 'dl/import'
 require 'dl/struct'
 
 class String
-	def to_bytes
-		bytes = 0
-		self.each_byte do |byte|
-			bytes &lt;&lt;= 8
-			bytes += byte
-		end
-		return bytes
-	end
+  def to_bytes
+    bytes = 0
+    self.each_byte do |byte|
+      bytes &lt;&lt;= 8
+      bytes += byte
+    end
+    return bytes
+  end
 end
 
 class MIDIator::Driver::DLSSynth &lt; MIDIator::Driver # :nodoc:
 
-	attr_accessor :synth
-
-	module AudioToolbox
-		extend DL::Importable 
-		dlload '/System/Library/Frameworks/AudioToolbox.framework/Versions/Current/AudioToolbox'   
-
-		ComponentDescription = struct [ 
-			&quot;int componentType&quot;, 
-			&quot;int componentSubType&quot;, 
-			&quot;int componentManufacturer&quot;, 
-			&quot;int componentFlags&quot;, 
-			&quot;int componentFlagsMask&quot;
-		]
-
-		# to_bytes may not be strictly necessary but these are supposed to be 4 byte numbers
-		AudioUnitManufacturer_Apple    = 'appl'.to_bytes
-		AudioUnitType_MusicDevice      = 'aumu'.to_bytes
-		AudioUnitSubType_DLSSynth      = 'dls '.to_bytes
-		AudioUnitType_Output           = 'auou'.to_bytes
-		AudioUnitSubType_DefaultOutput = 'def '.to_bytes
-
-		extern 'int NewAUGraph(void *)'
-		extern 'int AUGraphAddNode(void *, ComponentDescription *, void *)'
-		extern 'int AUGraphOpen(void *)'
-		extern 'int AUGraphConnectNodeInput(void *, void *, int, void *, int)'
-		extern 'int AUGraphNodeInfo(void *, void *, ComponentDescription *, void *)'
-		extern 'int AUGraphInitialize(void *)'
-		extern 'int AUGraphStart(void *)'      
-		extern 'int AUGraphStop(void *)'
-		extern 'int DisposeAUGraph(void *)'
-
-		extern 'void * CAShow(void *)'
-
-		extern 'void * MusicDeviceMIDIEvent(void *, int, int, int, int)'      
-	end      
-
-	protected
-
-	def require_noerr(action_description, &amp;block)
-		if block.call != 0
-			fail &quot;Failed to #{action_description}&quot;
-		end
-	end
-
-	def open
-		@synth = DL::PtrData.new(nil) 
-		@graph = DL::PtrData.new(nil)
-		synthNode = DL::PtrData.new(nil)
-		outNode = DL::PtrData.new(nil)
-
-		cd = AudioToolbox::ComponentDescription.malloc()
-		cd.componentManufacturer = AudioToolbox::AudioUnitManufacturer_Apple
-		cd.componentFlags = 0
-		cd.componentFlagsMask = 0
-
-		require_noerr('create AUGraph') { AudioToolbox.newAUGraph(@graph.ref) }
-
-		cd.componentType = AudioToolbox::AudioUnitType_MusicDevice
-		cd.componentSubType = AudioToolbox::AudioUnitSubType_DLSSynth
-		require_noerr('add synthNode') { AudioToolbox.aUGraphAddNode(@graph, cd, synthNode.ref) }
-
-		cd.componentType = AudioToolbox::AudioUnitType_Output
-		cd.componentSubType = AudioToolbox::AudioUnitSubType_DefaultOutput
-		require_noerr('add outNode') { AudioToolbox.aUGraphAddNode(@graph, cd, outNode.ref) }
-
-		require_noerr('open graph') { AudioToolbox.aUGraphOpen(@graph) }
-
-		require_noerr('connect synth to out') { AudioToolbox.aUGraphConnectNodeInput(@graph, synthNode, 0, outNode, 0) }
-
-		require_noerr('graph info') { AudioToolbox.aUGraphNodeInfo(@graph, synthNode, nil, @synth.ref) }
-		require_noerr('init graph') { AudioToolbox.aUGraphInitialize(@graph) }
-		require_noerr('start graph') { AudioToolbox.aUGraphStart(@graph) }
-
-		AudioToolbox.cAShow(@graph) if $DEBUG
-	end
-
-	def message(*args)
-		arg0 = args[0] || 0
-		arg1 = args[1] || 0
-		arg2 = args[2] || 0
-		AudioToolbox.musicDeviceMIDIEvent(@synth, arg0, arg1, arg2, 0)
-	end
-
-	def close
-		if @graph
-			AudioToolbox.aUGraphStop(@graph)
-			AudioToolbox.disposeAUGraph(@graph)
-		end
-	end
+  attr_accessor :synth
+
+  module AudioToolbox
+    extend DL::Importable 
+    dlload '/System/Library/Frameworks/AudioToolbox.framework/Versions/Current/AudioToolbox'   
+
+    ComponentDescription = struct [ 
+      &quot;int componentType&quot;, 
+      &quot;int componentSubType&quot;, 
+      &quot;int componentManufacturer&quot;, 
+      &quot;int componentFlags&quot;, 
+      &quot;int componentFlagsMask&quot;
+    ]
+
+    # to_bytes may not be strictly necessary but these are supposed to be 4 byte numbers
+    AudioUnitManufacturer_Apple    = 'appl'.to_bytes
+    AudioUnitType_MusicDevice      = 'aumu'.to_bytes
+    AudioUnitSubType_DLSSynth      = 'dls '.to_bytes
+    AudioUnitType_Output           = 'auou'.to_bytes
+    AudioUnitSubType_DefaultOutput = 'def '.to_bytes
+
+    extern 'int NewAUGraph(void *)'
+    extern 'int AUGraphAddNode(void *, ComponentDescription *, void *)'
+    extern 'int AUGraphOpen(void *)'
+    extern 'int AUGraphConnectNodeInput(void *, void *, int, void *, int)'
+    extern 'int AUGraphNodeInfo(void *, void *, ComponentDescription *, void *)'
+    extern 'int AUGraphInitialize(void *)'
+    extern 'int AUGraphStart(void *)'      
+    extern 'int AUGraphStop(void *)'
+    extern 'int DisposeAUGraph(void *)'
+
+    extern 'void * CAShow(void *)'
+
+    extern 'void * MusicDeviceMIDIEvent(void *, int, int, int, int)'      
+  end      
+
+  protected
+
+  def require_noerr(action_description, &amp;block)
+    if block.call != 0
+      fail &quot;Failed to #{action_description}&quot;
+    end
+  end
+
+  def open
+    @synth = DL::PtrData.new(nil) 
+    @graph = DL::PtrData.new(nil)
+    synthNode = DL::PtrData.new(nil)
+    outNode = DL::PtrData.new(nil)
+
+    cd = AudioToolbox::ComponentDescription.malloc()
+    cd.componentManufacturer = AudioToolbox::AudioUnitManufacturer_Apple
+    cd.componentFlags = 0
+    cd.componentFlagsMask = 0
+
+    require_noerr('create AUGraph') { AudioToolbox.newAUGraph(@graph.ref) }
+
+    cd.componentType = AudioToolbox::AudioUnitType_MusicDevice
+    cd.componentSubType = AudioToolbox::AudioUnitSubType_DLSSynth
+    require_noerr('add synthNode') { AudioToolbox.aUGraphAddNode(@graph, cd, synthNode.ref) }
+
+    cd.componentType = AudioToolbox::AudioUnitType_Output
+    cd.componentSubType = AudioToolbox::AudioUnitSubType_DefaultOutput
+    require_noerr('add outNode') { AudioToolbox.aUGraphAddNode(@graph, cd, outNode.ref) }
+
+    require_noerr('open graph') { AudioToolbox.aUGraphOpen(@graph) }
+
+    require_noerr('connect synth to out') { AudioToolbox.aUGraphConnectNodeInput(@graph, synthNode, 0, outNode, 0) }
+
+    require_noerr('graph info') { AudioToolbox.aUGraphNodeInfo(@graph, synthNode, nil, @synth.ref) }
+    require_noerr('init graph') { AudioToolbox.aUGraphInitialize(@graph) }
+    require_noerr('start graph') { AudioToolbox.aUGraphStart(@graph) }
+
+    AudioToolbox.cAShow(@graph) if $DEBUG
+  end
+
+  def message(*args)
+    arg0 = args[0] || 0
+    arg1 = args[1] || 0
+    arg2 = args[2] || 0
+    AudioToolbox.musicDeviceMIDIEvent(@synth, arg0, arg1, arg2, 0)
+  end
+
+  def close
+    if @graph
+      AudioToolbox.aUGraphStop(@graph)
+      AudioToolbox.disposeAUGraph(@graph)
+    end
+  end
 end</diff>
      <filename>lib/midiator/drivers/dls_synth.rb</filename>
    </modified>
    <modified>
      <diff>@@ -21,15 +21,15 @@ class MIDIator::Driver::Mmj &lt; MIDIator::Driver # :nodoc:
     }.first
   end
   
-	def open( output = 0 )
+  def open( output = 0 )
     @out = MidiSystem.open_midi_output( output )
-	end
+  end
   
-	def message( *args )
+  def message( *args )
     @out.send_midi( args.to_java(:byte) )
-	end
+  end
   
-	def close
+  def close
     MidiSystem.close_midi_system
-	end
+  end
 end</diff>
      <filename>lib/midiator/drivers/mmj.rb</filename>
    </modified>
    <modified>
      <diff>@@ -24,26 +24,26 @@ require 'midiator/driver'
 require 'midiator/driver_registry'
 
 class MIDIator::Driver::WinMM &lt; MIDIator::Driver # :nodoc:
-	module C # :nodoc:
-		extend DL::Importable
-		dlload 'winmm'
+  module C # :nodoc:
+    extend DL::Importable
+    dlload 'winmm'
 
-		extern &quot;int midiOutOpen(HMIDIOUT*, int, int, int, int)&quot;
-		extern &quot;int midiOutClose(int)&quot;
-		extern &quot;int midiOutShortMsg(int, int)&quot;
-	end
+    extern &quot;int midiOutOpen(HMIDIOUT*, int, int, int, int)&quot;
+    extern &quot;int midiOutClose(int)&quot;
+    extern &quot;int midiOutShortMsg(int, int)&quot;
+  end
 
-	def open
-		@device = DL.malloc(DL.sizeof('I'))
-		C.midiOutOpen(@device, -1, 0, 0, 0)
-	end
+  def open
+    @device = DL.malloc(DL.sizeof('I'))
+    C.midiOutOpen(@device, -1, 0, 0, 0)
+  end
 
-	def close
-		C.midiOutClose(@device.ptr.to_i)
-	end
+  def close
+    C.midiOutClose(@device.ptr.to_i)
+  end
 
-	def message(one, two=0, three=0)
-		message = one + (two &lt;&lt; 8) + (three &lt;&lt; 16)
-		C.midiOutShortMsg(@device.ptr.to_i, message)
-	end
+  def message(one, two=0, three=0)
+    message = one + (two &lt;&lt; 8) + (three &lt;&lt; 16)
+    C.midiOutShortMsg(@device.ptr.to_i, message)
+  end
 end</diff>
      <filename>lib/midiator/drivers/winmm.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,24 +16,24 @@
 
 module MIDIator::Drums # this file does not rdoc well, so uhh.... :nodoc:
 
-	##########################################################################
-	### G E N E R A L   M I D I   D R U M   N O T E S
-	##########################################################################
-	BassDrum1     = 36  ;;;  LongGuiro     = 74  ;;;  OpenHiHat     = 46
-	BassDrum2     = 35  ;;;  LongWhistle   = 72  ;;;  OpenHighConga = 63
-	Cabasa        = 69  ;;;  LowAgogo      = 68  ;;;  OpenTriangle  = 81
-	ChineseCymbal = 52  ;;;  LowBongo      = 61  ;;;  PedalHiHat    = 44
-	Claves        = 75  ;;;  LowConga      = 64  ;;;  RideBell      = 53
-	ClosedHiHat   = 42  ;;;  LowTimbale    = 66  ;;;  RideCymbal1   = 51
-	Cowbell       = 56  ;;;  LowTom1       = 43  ;;;  RideCymbal2   = 59
-	CrashCymbal1  = 49  ;;;  LowTom2       = 41  ;;;  ShortGuiro    = 73
-	CrashCymbal2  = 57  ;;;  LowWoodBlock  = 77  ;;;  ShortWhistle  = 71
-	HandClap      = 39  ;;;  Maracas       = 70  ;;;  SideStick     = 37
-	HighAgogo     = 67  ;;;  MidTom1       = 47  ;;;  SnareDrum1    = 38
-	HighBongo     = 60  ;;;  MidTom2       = 45  ;;;  SnareDrum2    = 40
-	HighTimbale   = 65  ;;;  MuteCuica     = 78  ;;;  SplashCymbal  = 55
-	HighTom1      = 50  ;;;  MuteHighConga = 62  ;;;  Tambourine    = 54
-	HighTom2      = 48  ;;;  MuteTriangle  = 80  ;;;  VibraSlap     = 58
-	HighWoodBlock = 76  ;;;  OpenCuica     = 79
+  ##########################################################################
+  ### G E N E R A L   M I D I   D R U M   N O T E S
+  ##########################################################################
+  BassDrum1     = 36  ;;;  LongGuiro     = 74  ;;;  OpenHiHat     = 46
+  BassDrum2     = 35  ;;;  LongWhistle   = 72  ;;;  OpenHighConga = 63
+  Cabasa        = 69  ;;;  LowAgogo      = 68  ;;;  OpenTriangle  = 81
+  ChineseCymbal = 52  ;;;  LowBongo      = 61  ;;;  PedalHiHat    = 44
+  Claves        = 75  ;;;  LowConga      = 64  ;;;  RideBell      = 53
+  ClosedHiHat   = 42  ;;;  LowTimbale    = 66  ;;;  RideCymbal1   = 51
+  Cowbell       = 56  ;;;  LowTom1       = 43  ;;;  RideCymbal2   = 59
+  CrashCymbal1  = 49  ;;;  LowTom2       = 41  ;;;  ShortGuiro    = 73
+  CrashCymbal2  = 57  ;;;  LowWoodBlock  = 77  ;;;  ShortWhistle  = 71
+  HandClap      = 39  ;;;  Maracas       = 70  ;;;  SideStick     = 37
+  HighAgogo     = 67  ;;;  MidTom1       = 47  ;;;  SnareDrum1    = 38
+  HighBongo     = 60  ;;;  MidTom2       = 45  ;;;  SnareDrum2    = 40
+  HighTimbale   = 65  ;;;  MuteCuica     = 78  ;;;  SplashCymbal  = 55
+  HighTom1      = 50  ;;;  MuteHighConga = 62  ;;;  Tambourine    = 54
+  HighTom2      = 48  ;;;  MuteTriangle  = 80  ;;;  VibraSlap     = 58
+  HighWoodBlock = 76  ;;;  OpenCuica     = 79
 
 end</diff>
      <filename>lib/midiator/drums.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,95 +22,95 @@
 require 'midiator'
 
 class MIDIator::Interface
-	attr_reader :driver
-
-	### Automatically select a driver to use
-	def autodetect_driver
-		driver = case Platform::IMPL
-		when :macosx
-			:core_midi
-		when :mswin
-			:winmm
-		when :linux
-			:alsa
+  attr_reader :driver
+
+  ### Automatically select a driver to use
+  def autodetect_driver
+    driver = case Platform::IMPL
+    when :macosx
+      :core_midi
+    when :mswin
+      :winmm
+    when :linux
+      :alsa
     else
       if defined?( Java ) &amp;&amp; Java::java.lang.System.get_property('os.name') == 'Mac OS X'
         :mmj
       else
         raise &quot;No driver is available.&quot;
       end
-		end
+    end
     
-		self.use(driver)
-	end
-
-
-	### Attempts to load the MIDI system driver called +driver_name+.
-	def use( driver_name )
-		driver_path = &quot;midiator/drivers/#{driver_name.to_s}&quot;
-
-		begin
-			require driver_path
-		rescue LoadError =&gt; e
-			raise LoadError,
-				&quot;Could not load driver '#{driver_name}'.&quot;
-		end
-
-		# Fix two side-effects of the camelization process... first, change
-		# instances of Midi to MIDI.  This fixes the acronym form but doesn't
-		# change, for instance, 'timidity'.
-		#
-		# Second, the require path is midiator/drivers/foo, but the module
-		# name is Driver singular, so fix that.
-		driver_class = driver_path.camelize.
-			gsub( /Midi/, 'MIDI' ).
-			sub( /::Drivers::/, '::Driver::')
-
-		# special case for the ALSA driver
-		driver_class.sub!( /Alsa/, 'ALSA' )
-
-		# special case for the WinMM driver
-		driver_class.sub!( /Winmm/, 'WinMM' )
-
-		# special case for the DLSSynth driver
-		driver_class.sub!( /Dls/, 'DLS' )
-
-		# this little trick stolen from ActiveSupport.  It looks for a top-
-		# level module with the given name.
-		@driver = Object.module_eval( &quot;::#{driver_class}&quot; ).new
-	end
-
-
-	### A little shortcut method for playing the given +note+ for the
-	### specified +duration+. If +note+ is an array, all notes in it are
-	### played as a chord.
-	def play( note, duration = 0.1, channel = 0, velocity = 100 )
+    self.use(driver)
+  end
+
+
+  ### Attempts to load the MIDI system driver called +driver_name+.
+  def use( driver_name )
+    driver_path = &quot;midiator/drivers/#{driver_name.to_s}&quot;
+
+    begin
+      require driver_path
+    rescue LoadError =&gt; e
+      raise LoadError,
+        &quot;Could not load driver '#{driver_name}'.&quot;
+    end
+
+    # Fix two side-effects of the camelization process... first, change
+    # instances of Midi to MIDI.  This fixes the acronym form but doesn't
+    # change, for instance, 'timidity'.
+    #
+    # Second, the require path is midiator/drivers/foo, but the module
+    # name is Driver singular, so fix that.
+    driver_class = driver_path.camelize.
+      gsub( /Midi/, 'MIDI' ).
+      sub( /::Drivers::/, '::Driver::')
+
+    # special case for the ALSA driver
+    driver_class.sub!( /Alsa/, 'ALSA' )
+
+    # special case for the WinMM driver
+    driver_class.sub!( /Winmm/, 'WinMM' )
+
+    # special case for the DLSSynth driver
+    driver_class.sub!( /Dls/, 'DLS' )
+
+    # this little trick stolen from ActiveSupport.  It looks for a top-
+    # level module with the given name.
+    @driver = Object.module_eval( &quot;::#{driver_class}&quot; ).new
+  end
+
+
+  ### A little shortcut method for playing the given +note+ for the
+  ### specified +duration+. If +note+ is an array, all notes in it are
+  ### played as a chord.
+  def play( note, duration = 0.1, channel = 0, velocity = 100 )
     [note].flatten.each do |n|
       @driver.note_on( n, channel, velocity )
     end
-		sleep duration
+    sleep duration
     [note].flatten.each do |n|
       @driver.note_off( n, channel, velocity )
     end 
-	end
+  end
 
 
-	### Does nothing for +duration+ seconds.
-	def rest( duration = 0.1 )
-		sleep duration
-	end
+  ### Does nothing for +duration+ seconds.
+  def rest( duration = 0.1 )
+    sleep duration
+  end
 
-	#######
-	private
-	#######
+  #######
+  private
+  #######
 
-	### Checks to see if the currently-loaded driver knows how to do +method+ and
-	### passes the message on if so.  Raises an exception (as normal) if not.
-	def method_missing( method, *args )
-		raise NoMethodError, &quot;Neither MIDIator::Interface nor #{@driver.class} &quot; +
-			&quot;has a '#{method}' method.&quot; unless @driver.respond_to? method
+  ### Checks to see if the currently-loaded driver knows how to do +method+ and
+  ### passes the message on if so.  Raises an exception (as normal) if not.
+  def method_missing( method, *args )
+    raise NoMethodError, &quot;Neither MIDIator::Interface nor #{@driver.class} &quot; +
+      &quot;has a '#{method}' method.&quot; unless @driver.respond_to? method
 
-		return @driver.send( method, *args )
-	end
+    return @driver.send( method, *args )
+  end
 
 end</diff>
      <filename>lib/midiator/interface.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,71 +20,71 @@
 
 module MIDIator::Notes # this file does not rdoc well, so uhh.... :nodoc:
 
-	##########################################################################
-	### O C T A V E   - 1 ;;; O C T A V E    0    ;;; O C T A V E   1
-	##########################################################################
-	Cn1  = 0  ; Bsn1 = 0  ;;; C0  = 12 ; Bs0 = 12 ;;; C1  = 24 ; Bs1 = 24
-	Csn1 = 1  ; Dbn1 = 1  ;;; Cs0 = 13 ; Db0 = 13 ;;; Cs1 = 25 ; Db1 = 25
-	Dn1  = 2  ;           ;;; D0  = 14 ;          ;;; D1  = 26 ;
-	Dsn1 = 3  ; Ebn1 = 3  ;;; Ds0 = 15 ; Eb0 = 15 ;;; Ds1 = 27 ; Eb1 = 27
-	En1  = 4  ; Fbn1 = 4  ;;; E0  = 16 ; Fb0 = 16 ;;; E1  = 28 ; Fb1 = 28
-	Fn1  = 5  ;           ;;; F0  = 17 ;          ;;; F1  = 29 ;
-	Fsn1 = 6  ; Gbn1 = 6  ;;; Fs0 = 18 ; Gb0 = 18 ;;; Fs1 = 30 ; Gb1 = 30
-	Gn1  = 7  ;           ;;; G0  = 19 ;          ;;; G1  = 31 ;
-	Gsn1 = 8  ; Abn1 = 8  ;;; Gs0 = 20 ; Ab0 = 20 ;;; Gs1 = 32 ; Ab1 = 32
-	An1  = 9  ;           ;;; A0  = 21 ;          ;;; A1  = 33 ;
-	Asn1 = 10 ; Bbn1 = 10 ;;; As0 = 22 ; Bb0 = 22 ;;; As1 = 34 ; Bb1 = 34
-	Bn1  = 11 ; Cb0  = 11 ;;; B0  = 23 ; Cb1 = 23 ;;; B1  = 35 ; Cb2 = 35
+  ##########################################################################
+  ### O C T A V E   - 1 ;;; O C T A V E    0    ;;; O C T A V E   1
+  ##########################################################################
+  Cn1  = 0  ; Bsn1 = 0  ;;; C0  = 12 ; Bs0 = 12 ;;; C1  = 24 ; Bs1 = 24
+  Csn1 = 1  ; Dbn1 = 1  ;;; Cs0 = 13 ; Db0 = 13 ;;; Cs1 = 25 ; Db1 = 25
+  Dn1  = 2  ;           ;;; D0  = 14 ;          ;;; D1  = 26 ;
+  Dsn1 = 3  ; Ebn1 = 3  ;;; Ds0 = 15 ; Eb0 = 15 ;;; Ds1 = 27 ; Eb1 = 27
+  En1  = 4  ; Fbn1 = 4  ;;; E0  = 16 ; Fb0 = 16 ;;; E1  = 28 ; Fb1 = 28
+  Fn1  = 5  ;           ;;; F0  = 17 ;          ;;; F1  = 29 ;
+  Fsn1 = 6  ; Gbn1 = 6  ;;; Fs0 = 18 ; Gb0 = 18 ;;; Fs1 = 30 ; Gb1 = 30
+  Gn1  = 7  ;           ;;; G0  = 19 ;          ;;; G1  = 31 ;
+  Gsn1 = 8  ; Abn1 = 8  ;;; Gs0 = 20 ; Ab0 = 20 ;;; Gs1 = 32 ; Ab1 = 32
+  An1  = 9  ;           ;;; A0  = 21 ;          ;;; A1  = 33 ;
+  Asn1 = 10 ; Bbn1 = 10 ;;; As0 = 22 ; Bb0 = 22 ;;; As1 = 34 ; Bb1 = 34
+  Bn1  = 11 ; Cb0  = 11 ;;; B0  = 23 ; Cb1 = 23 ;;; B1  = 35 ; Cb2 = 35
 
-	##########################################################################
-	### O C T A V E   2 ;;; O C T A V E    3    ;;; O C T A V E   4
-	##########################################################################
-	C2  = 36 ; Bs2 = 36 ;;; C3  = 48 ; Bs3 = 48 ;;; C4  = 60 ; Bs4 = 60
-	Cs2 = 37 ; Db2 = 37 ;;; Cs3 = 49 ; Db3 = 49 ;;; Cs4 = 61 ; Db4 = 61
-	D2  = 38 ;          ;;; D3  = 50 ;          ;;; D4  = 62 ;
-	Ds2 = 39 ; Eb2 = 39 ;;; Ds3 = 51 ; Eb3 = 51 ;;; Ds4 = 63 ; Eb4 = 63
-	E2  = 40 ; Fb2 = 40 ;;; E3  = 52 ; Fb3 = 52 ;;; E4  = 64 ; Fb4 = 64
-	F2  = 41 ;          ;;; F3  = 53 ;          ;;; F4  = 65 ;
-	Fs2 = 42 ; Gb2 = 42 ;;; Fs3 = 54 ; Gb3 = 54 ;;; Fs4 = 66 ; Gb4 = 66
-	G2  = 43 ;          ;;; G3  = 55 ;          ;;; G4  = 67 ;
-	Gs2 = 44 ; Ab2 = 44 ;;; Gs3 = 56 ; Ab3 = 56 ;;; Gs4 = 68 ; Ab4 = 68
-	A2  = 45 ;          ;;; A3  = 57 ;          ;;; A4  = 69 ;
-	As2 = 46 ; Bb2 = 46 ;;; As3 = 58 ; Bb3 = 58 ;;; As4 = 70 ; Bb4 = 70
-	B2  = 47 ; Cb3 = 47 ;;; B3  = 59 ; Cb4 = 59 ;;; B4  = 71 ; Cb5 = 71
+  ##########################################################################
+  ### O C T A V E   2 ;;; O C T A V E    3    ;;; O C T A V E   4
+  ##########################################################################
+  C2  = 36 ; Bs2 = 36 ;;; C3  = 48 ; Bs3 = 48 ;;; C4  = 60 ; Bs4 = 60
+  Cs2 = 37 ; Db2 = 37 ;;; Cs3 = 49 ; Db3 = 49 ;;; Cs4 = 61 ; Db4 = 61
+  D2  = 38 ;          ;;; D3  = 50 ;          ;;; D4  = 62 ;
+  Ds2 = 39 ; Eb2 = 39 ;;; Ds3 = 51 ; Eb3 = 51 ;;; Ds4 = 63 ; Eb4 = 63
+  E2  = 40 ; Fb2 = 40 ;;; E3  = 52 ; Fb3 = 52 ;;; E4  = 64 ; Fb4 = 64
+  F2  = 41 ;          ;;; F3  = 53 ;          ;;; F4  = 65 ;
+  Fs2 = 42 ; Gb2 = 42 ;;; Fs3 = 54 ; Gb3 = 54 ;;; Fs4 = 66 ; Gb4 = 66
+  G2  = 43 ;          ;;; G3  = 55 ;          ;;; G4  = 67 ;
+  Gs2 = 44 ; Ab2 = 44 ;;; Gs3 = 56 ; Ab3 = 56 ;;; Gs4 = 68 ; Ab4 = 68
+  A2  = 45 ;          ;;; A3  = 57 ;          ;;; A4  = 69 ;
+  As2 = 46 ; Bb2 = 46 ;;; As3 = 58 ; Bb3 = 58 ;;; As4 = 70 ; Bb4 = 70
+  B2  = 47 ; Cb3 = 47 ;;; B3  = 59 ; Cb4 = 59 ;;; B4  = 71 ; Cb5 = 71
 
-	##########################################################################
-	### O C T A V E   5 ;;; O C T A V E    6    ;;; O C T A V E   7
-	##########################################################################
-	C5  = 72 ; Bs5 = 72 ;;; C6  = 84 ; Bs6 = 84 ;;; C7  = 96  ; Bs7 = 96
-	Cs5 = 73 ; Db5 = 73 ;;; Cs6 = 85 ; Db6 = 85 ;;; Cs7 = 97  ; Db7 = 97
-	D5  = 74 ;          ;;; D6  = 86 ;          ;;; D7  = 98  ;
-	Ds5 = 75 ; Eb5 = 75 ;;; Ds6 = 87 ; Eb6 = 87 ;;; Ds7 = 99  ; Eb7 = 99
-	E5  = 76 ; Fb5 = 76 ;;; E6  = 88 ; Fb6 = 88 ;;; E7  = 100 ; Fb7 = 100
-	F5  = 77 ;          ;;; F6  = 89 ;          ;;; F7  = 101 ;
-	Fs5 = 78 ; Gb5 = 78 ;;; Fs6 = 90 ; Gb6 = 90 ;;; Fs7 = 102 ; Gb7 = 102
-	G5  = 79 ;          ;;; G6  = 91 ;          ;;; G7  = 103 ;
-	Gs5 = 80 ; Ab5 = 80 ;;; Gs6 = 92 ; Ab6 = 92 ;;; Gs7 = 104 ; Ab7 = 104
-	A5  = 81 ;          ;;; A6  = 93 ;          ;;; A7  = 105 ;
-	As5 = 82 ; Bb5 = 82 ;;; As6 = 94 ; Bb6 = 94 ;;; As7 = 106 ; Bb7 = 106
-	B5  = 83 ; Cb6 = 83 ;;; B6  = 95 ; Cb7 = 95 ;;; B7  = 107 ; Cb8 = 107
+  ##########################################################################
+  ### O C T A V E   5 ;;; O C T A V E    6    ;;; O C T A V E   7
+  ##########################################################################
+  C5  = 72 ; Bs5 = 72 ;;; C6  = 84 ; Bs6 = 84 ;;; C7  = 96  ; Bs7 = 96
+  Cs5 = 73 ; Db5 = 73 ;;; Cs6 = 85 ; Db6 = 85 ;;; Cs7 = 97  ; Db7 = 97
+  D5  = 74 ;          ;;; D6  = 86 ;          ;;; D7  = 98  ;
+  Ds5 = 75 ; Eb5 = 75 ;;; Ds6 = 87 ; Eb6 = 87 ;;; Ds7 = 99  ; Eb7 = 99
+  E5  = 76 ; Fb5 = 76 ;;; E6  = 88 ; Fb6 = 88 ;;; E7  = 100 ; Fb7 = 100
+  F5  = 77 ;          ;;; F6  = 89 ;          ;;; F7  = 101 ;
+  Fs5 = 78 ; Gb5 = 78 ;;; Fs6 = 90 ; Gb6 = 90 ;;; Fs7 = 102 ; Gb7 = 102
+  G5  = 79 ;          ;;; G6  = 91 ;          ;;; G7  = 103 ;
+  Gs5 = 80 ; Ab5 = 80 ;;; Gs6 = 92 ; Ab6 = 92 ;;; Gs7 = 104 ; Ab7 = 104
+  A5  = 81 ;          ;;; A6  = 93 ;          ;;; A7  = 105 ;
+  As5 = 82 ; Bb5 = 82 ;;; As6 = 94 ; Bb6 = 94 ;;; As7 = 106 ; Bb7 = 106
+  B5  = 83 ; Cb6 = 83 ;;; B6  = 95 ; Cb7 = 95 ;;; B7  = 107 ; Cb8 = 107
 
-	##########################################################################
-	### O C T A V E   8   ;;; O C T A V E    9
-	##########################################################################
-	C8  = 108 ; Bs8 = 108 ;;; C9  = 120 ; Bs9 = 120
-	Cs8 = 109 ; Db8 = 109 ;;; Cs9 = 121 ; Db9 = 121
-	D8  = 110 ;           ;;; D9  = 122 ;
-	Ds8 = 111 ; Eb8 = 111 ;;; Ds9 = 123 ; Eb9 = 123
-	E8  = 112 ; Fb8 = 112 ;;; E9  = 124 ; Fb9 = 124
-	F8  = 113 ;           ;;; F9  = 125 ;
-	Fs8 = 114 ; Gb8 = 114 ;;; Fs9 = 126 ; Gb9 = 126
-	G8  = 115 ;           ;;; G9  = 127 ;
-	Gs8 = 116 ; Ab8 = 116
-	A8  = 117 ;
-	As8 = 118 ; Bb8 = 118
-	B8  = 119 ; Cb9 = 119
+  ##########################################################################
+  ### O C T A V E   8   ;;; O C T A V E    9
+  ##########################################################################
+  C8  = 108 ; Bs8 = 108 ;;; C9  = 120 ; Bs9 = 120
+  Cs8 = 109 ; Db8 = 109 ;;; Cs9 = 121 ; Db9 = 121
+  D8  = 110 ;           ;;; D9  = 122 ;
+  Ds8 = 111 ; Eb8 = 111 ;;; Ds9 = 123 ; Eb9 = 123
+  E8  = 112 ; Fb8 = 112 ;;; E9  = 124 ; Fb9 = 124
+  F8  = 113 ;           ;;; F9  = 125 ;
+  Fs8 = 114 ; Gb8 = 114 ;;; Fs9 = 126 ; Gb9 = 126
+  G8  = 115 ;           ;;; G9  = 127 ;
+  Gs8 = 116 ; Ab8 = 116
+  A8  = 117 ;
+  As8 = 118 ; Bb8 = 118
+  B8  = 119 ; Cb9 = 119
 
-	# Shortcuts!
-	MiddleC = 84
+  # Shortcuts!
+  MiddleC = 84
 
 end</diff>
      <filename>lib/midiator/notes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,48 +15,48 @@
 #
 
 class MIDIator::Timer
-	attr_reader :resolution, :queue, :thread
+  attr_reader :resolution, :queue, :thread
 
-	### Create a new Timer object that ticks every +resolution+ seconds.
-	def initialize( resolution )
-		@resolution = resolution
-		@queue = []
+  ### Create a new Timer object that ticks every +resolution+ seconds.
+  def initialize( resolution )
+    @resolution = resolution
+    @queue = []
 
-		@thread = Thread.new do
-			loop do
-				dispatch
-				sleep @resolution
-			end
-		end
-	end
+    @thread = Thread.new do
+      loop do
+        dispatch
+        sleep @resolution
+      end
+    end
+  end
 
 
-	### Empty the queue
-	def flush
-		@queue.clear
-	end
+  ### Empty the queue
+  def flush
+    @queue.clear
+  end
 
 
-	### Add a new job to be performed at +time+.
-	def at( time, &amp;block )
-		time = time.to_f if time.kind_of? Time
-		@queue.push [ time, block ]
-	end
+  ### Add a new job to be performed at +time+.
+  def at( time, &amp;block )
+    time = time.to_f if time.kind_of? Time
+    @queue.push [ time, block ]
+  end
 
-	#######
-	private
-	#######
+  #######
+  private
+  #######
 
-	### Check to see if there is work to perform in this timeslice and
-	### do it if so.
-	def dispatch
-		now = Time.now.to_f
+  ### Check to see if there is work to perform in this timeslice and
+  ### do it if so.
+  def dispatch
+    now = Time.now.to_f
 
-		# move &quot;ready&quot; work out of the queue
-		ready, @queue = @queue.partition {|time, proc| time &lt;= now }
+    # move &quot;ready&quot; work out of the queue
+    ready, @queue = @queue.partition {|time, proc| time &lt;= now }
 
-		# call all of the &quot;ready&quot; jobs, passing in the time
-		ready.each {|time, proc| proc.call( time ) }
-	end
+    # call all of the &quot;ready&quot; jobs, passing in the time
+    ready.each {|time, proc| proc.call( time ) }
+  end
 
 end</diff>
      <filename>lib/midiator/timer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,45 +15,45 @@
 #
 
 class String
-	### NOTE: Stolen from ActiveSupport.  They hold the copyright.  Our
-	### modifications are making it a method on String and removing the
-	### lowerCamelCase option since we don't use it.
-	###
-	### +camelize+ converts strings to CamelCase.
-	###
-	### +camelize+ will also convert '/' to '::' which is useful for converting
-	### paths to namespaces.
-	###
-	### Examples
-	###   &quot;active_record&quot;.camelize #=&gt; &quot;ActiveRecord&quot;
-	###   &quot;active_record/errors&quot;.camelize #=&gt; &quot;ActiveRecord::Errors&quot;
-	def camelize
-		return self.gsub( /\/(.?)/ ) {
-			&quot;::&quot; + $1.upcase
-		}.
-		gsub( /(^|_)(.)/ ) {
-			$2.upcase
-		}
-	end
+  ### NOTE: Stolen from ActiveSupport.  They hold the copyright.  Our
+  ### modifications are making it a method on String and removing the
+  ### lowerCamelCase option since we don't use it.
+  ###
+  ### +camelize+ converts strings to CamelCase.
+  ###
+  ### +camelize+ will also convert '/' to '::' which is useful for converting
+  ### paths to namespaces.
+  ###
+  ### Examples
+  ###   &quot;active_record&quot;.camelize #=&gt; &quot;ActiveRecord&quot;
+  ###   &quot;active_record/errors&quot;.camelize #=&gt; &quot;ActiveRecord::Errors&quot;
+  def camelize
+    return self.gsub( /\/(.?)/ ) {
+      &quot;::&quot; + $1.upcase
+    }.
+    gsub( /(^|_)(.)/ ) {
+      $2.upcase
+    }
+  end
 
-	### NOTE: Stolen from ActiveSupport.  They hold the copyright.  The only
-	### modifications were to make it a String instance method instead of a
-	### function.
-	###
-	### The reverse of +camelize+. Makes an underscored form from the expression
-	### in the string.
-	###
-	### Changes '::' to '/' to convert namespaces to paths.
-	###
-	### Examples
-	###   &quot;ActiveRecord&quot;.underscore #=&gt; &quot;active_record&quot;
-	###   &quot;ActiveRecord::Errors&quot;.underscore #=&gt; active_record/errors
-	def underscore
-		return self.gsub( /::/, '/' ).
-		gsub( /([A-Z]+)([A-Z][a-z])/, '\1_\2' ).
-		gsub( /([a-z\d])([A-Z])/    , '\1_\2' ).
-		tr( &quot;-&quot;, &quot;_&quot; ).
-		downcase
-	end
+  ### NOTE: Stolen from ActiveSupport.  They hold the copyright.  The only
+  ### modifications were to make it a String instance method instead of a
+  ### function.
+  ###
+  ### The reverse of +camelize+. Makes an underscored form from the expression
+  ### in the string.
+  ###
+  ### Changes '::' to '/' to convert namespaces to paths.
+  ###
+  ### Examples
+  ###   &quot;ActiveRecord&quot;.underscore #=&gt; &quot;active_record&quot;
+  ###   &quot;ActiveRecord::Errors&quot;.underscore #=&gt; active_record/errors
+  def underscore
+    return self.gsub( /::/, '/' ).
+    gsub( /([A-Z]+)([A-Z][a-z])/, '\1_\2' ).
+    gsub( /([a-z\d])([A-Z])/    , '\1_\2' ).
+    tr( &quot;-&quot;, &quot;_&quot; ).
+    downcase
+  end
 
 end</diff>
      <filename>lib/string_extensions.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,33 +20,33 @@ require 'rake/gempackagetask'
 
 ### Task: gem
 gemspec = Gem::Specification.new do |gem|
-	gem.name    	= &quot;midiator&quot;
-	gem.version 	= MIDIator::VERSION
+  gem.name      = &quot;midiator&quot;
+  gem.version   = MIDIator::VERSION
 
-	gem.summary     = &quot;MIDIator - A a nice Ruby interface to your system's MIDI services.&quot;
-	gem.description = &quot;MIDIator provides an OS-agnostic way to send live MIDI messages to &quot; +
-					  &quot;your machine's MIDI playback system.&quot;
+  gem.summary     = &quot;MIDIator - A a nice Ruby interface to your system's MIDI services.&quot;
+  gem.description = &quot;MIDIator provides an OS-agnostic way to send live MIDI messages to &quot; +
+            &quot;your machine's MIDI playback system.&quot;
 
-	gem.authors  = &quot;Ben Bleything&quot;
-	gem.email    = &quot;ben@bleything.net&quot;
-	gem.homepage = &quot;http://projects.bleything.net/projects/show/midiator&quot;
+  gem.authors  = &quot;Ben Bleything&quot;
+  gem.email    = &quot;ben@bleything.net&quot;
+  gem.homepage = &quot;http://projects.bleything.net/projects/show/midiator&quot;
 
-	gem.rubyforge_project = 'midiator'
+  gem.rubyforge_project = 'midiator'
 
-	gem.has_rdoc = true
+  gem.has_rdoc = true
 
-	gem.files      	= RELEASE_FILES.
-		collect {|f| f.relative_path_from(BASE_DIR).to_s }
-	gem.test_files 	= SPEC_FILES.
-		collect {|f| f.relative_path_from(BASE_DIR).to_s }
+  gem.files        = RELEASE_FILES.
+    collect {|f| f.relative_path_from(BASE_DIR).to_s }
+  gem.test_files   = SPEC_FILES.
+    collect {|f| f.relative_path_from(BASE_DIR).to_s }
 
-	gem.add_dependency 'Platform', [&quot;&gt;= 0.4.0&quot;]
+  gem.add_dependency 'Platform', [&quot;&gt;= 0.4.0&quot;]
 end
 
 Rake::GemPackageTask.new( gemspec ) do |task|
-	task.gem_spec = gemspec
-	task.need_tar = false
-	task.need_tar_gz = true
-	task.need_tar_bz2 = true
-	task.need_zip = true
+  task.gem_spec = gemspec
+  task.need_tar = false
+  task.need_tar_gz = true
+  task.need_tar_bz2 = true
+  task.need_zip = true
 end</diff>
      <filename>misc/rake/packaging.rb</filename>
    </modified>
    <modified>
      <diff>@@ -25,21 +25,21 @@ require 'hanna'
 
 ### Task: rdoc
 Rake::RDocTask.new do |rdoc|
-	rdoc.rdoc_dir = 'docs/rdoc'
-	rdoc.title    = &quot;MIDIator - a nice Ruby interface to your system's MIDI services.&quot;
+  rdoc.rdoc_dir = 'docs/rdoc'
+  rdoc.title    = &quot;MIDIator - a nice Ruby interface to your system's MIDI services.&quot;
 
-	rdoc.options += [
-		'-w', '4',
-		'-SHNa',
-		'-i', BASE_DIR.to_s,
-		# '-f', 'darkfish', # uncomment for darkfish!
-		'-T', 'hanna',    # uncomment for hanna!
-		'-m', 'README',
-		'-W', 'http://projects.bleything.net/repositories/changes/midiator/',
-	  ]
+  rdoc.options += [
+    '-w', '4',
+    '-SHNa',
+    '-i', BASE_DIR.to_s,
+    # '-f', 'darkfish', # uncomment for darkfish!
+    '-T', 'hanna',    # uncomment for hanna!
+    '-m', 'README',
+    '-W', 'http://projects.bleything.net/repositories/changes/midiator/',
+    ]
 
-	rdoc.rdoc_files.include 'README'
-	rdoc.rdoc_files.include 'LICENSE'
-	rdoc.rdoc_files.include 'LICENSE.prp'
-	rdoc.rdoc_files.include LIB_FILES.collect {|f| f.relative_path_from(BASE_DIR).to_s }
+  rdoc.rdoc_files.include 'README'
+  rdoc.rdoc_files.include 'LICENSE'
+  rdoc.rdoc_files.include 'LICENSE.prp'
+  rdoc.rdoc_files.include LIB_FILES.collect {|f| f.relative_path_from(BASE_DIR).to_s }
 end</diff>
      <filename>misc/rake/rdoc.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,16 +17,16 @@ require 'spec/rake/spectask'
 
 desc &quot;Run the RSpec suite&quot;
 Spec::Rake::SpecTask.new( :spec ) do |r|
-	r.libs      = SPEC_FILES
-	r.spec_opts = %w(--format specdoc --color)
+  r.libs      = SPEC_FILES
+  r.spec_opts = %w(--format specdoc --color)
 end
 
 namespace :spec do
-	### Run the specifications and generate coverage information
-	Spec::Rake::SpecTask.new( :coverage ) do |r|
-		r.rcov      = true
-		r.rcov_dir  = 'coverage'
-		r.rcov_opts = %w( -x Library\/Ruby,^spec )
-		r.libs      = SPEC_FILES
-	end
+  ### Run the specifications and generate coverage information
+  Spec::Rake::SpecTask.new( :coverage ) do |r|
+    r.rcov      = true
+    r.rcov_dir  = 'coverage'
+    r.rcov_opts = %w( -x Library\/Ruby,^spec )
+    r.libs      = SPEC_FILES
+  end
 end</diff>
      <filename>misc/rake/testing.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,100 +16,100 @@
 require File.join( File.dirname(__FILE__), 'lib', 'spec_helper.rb' )
 
 describe MIDIator::DriverRegistry do
-	before( :all ) do
-		# alias MIDIator::Driver's inherited method out of the way and
-		# redefine it as a no-op.  This prevents MIDIator::Driver from trying
-		# to auto-register subclasses.
-		MIDIator::Driver.instance_eval {
-			class &lt;&lt; self
-				alias_method :old_inherited, :inherited
-			end
-
-			def self::inherited( klass )
-				# no-op
-			end
-		}
-	end
-
-	after( :all ) do
-		# move MIDIator::Driver's inherited method back into place
-		MIDIator::Driver.instance_eval {
-			class &lt;&lt; self
-				alias_method :inherited, :old_inherited
-			end
-		}
-	end
-
-	before( :each ) do
-		@registry = MIDIator::DriverRegistry.instance
-
-		@driver_fixture = {
-			:a =&gt; &quot;is for apple&quot;,
-			:b =&gt; &quot;is for bunches of apples&quot;
-		}
-	end
-
-	after( :each ) do
-		@registry.instance_variable_set( :@drivers, nil )
-	end
-
-	it &quot;is a Singleton&quot; do
-		lambda { MIDIator::DriverRegistry.new }.should raise_error
-		MIDIator::DriverRegistry.should respond_to( :instance )
-	end
-
-	it &quot;knows how many drivers are registered&quot; do
-		@registry.instance_variable_set( :@drivers, @driver_fixture )
-		@registry.size.should == @driver_fixture.size
-	end
-
-	it &quot;can be dereferenced as though it was a hash&quot; do
-		@registry.instance_variable_set( :@drivers, @driver_fixture )
-		@driver_fixture.keys.each do |key|
-			@registry[ key ].should == @driver_fixture[ key ]
-		end
-	end
-
-	it &quot;aliases #register_driver to #register and #&lt;&lt;&quot; do
-		register_driver = @registry.method( :register_driver )
-
-		@registry.method( :&lt;&lt; ).should == register_driver
-		@registry.method( :register ).should == register_driver
-	end
-
-	it &quot;keeps track of registered drivers by name&quot; do
-		Bees       = Class.new( MIDIator::Driver )
-		Sandwiches = Class.new( MIDIator::Driver )
-		Guns       = Class.new( MIDIator::Driver )
-
-		@registry.register( :bees,       Bees       )
-		@registry.register( :sandwiches, Sandwiches )
-		@registry.register( :guns,       Guns       )
-
-		@registry[ :bees       ].should be( Bees       )
-		@registry[ :sandwiches ].should be( Sandwiches )
-		@registry[ :guns       ].should be( Guns       )
-	end
-
-	it &quot;prevents anything other than a MIDIator::Driver subclass from being registered&quot; do
-		lambda {
-			@registry.register( :failboat, String )
-		}.should raise_error( ArgumentError, &quot;Attempted to register something that is not a MIDIator::Driver&quot; )
-
-		lambda {
-			@registry.register( :great_success, Class.new( MIDIator::Driver ) )
-		}.should_not raise_error
-	end
-
-	it &quot;prevents a single driver from being registered multiple times&quot; do
-		klass = Class.new( MIDIator::Driver )
-
-		lambda {
-			@registry.register( :first_try, klass )
-		}.should_not raise_error
-
-		lambda {
-			@registry.register( :second_try, klass )
-		}.should raise_error( ArgumentError, &quot;Already registered #{klass.to_s} as 'first_try'.&quot; )
-	end
+  before( :all ) do
+    # alias MIDIator::Driver's inherited method out of the way and
+    # redefine it as a no-op.  This prevents MIDIator::Driver from trying
+    # to auto-register subclasses.
+    MIDIator::Driver.instance_eval {
+      class &lt;&lt; self
+        alias_method :old_inherited, :inherited
+      end
+
+      def self::inherited( klass )
+        # no-op
+      end
+    }
+  end
+
+  after( :all ) do
+    # move MIDIator::Driver's inherited method back into place
+    MIDIator::Driver.instance_eval {
+      class &lt;&lt; self
+        alias_method :inherited, :old_inherited
+      end
+    }
+  end
+
+  before( :each ) do
+    @registry = MIDIator::DriverRegistry.instance
+
+    @driver_fixture = {
+      :a =&gt; &quot;is for apple&quot;,
+      :b =&gt; &quot;is for bunches of apples&quot;
+    }
+  end
+
+  after( :each ) do
+    @registry.instance_variable_set( :@drivers, nil )
+  end
+
+  it &quot;is a Singleton&quot; do
+    lambda { MIDIator::DriverRegistry.new }.should raise_error
+    MIDIator::DriverRegistry.should respond_to( :instance )
+  end
+
+  it &quot;knows how many drivers are registered&quot; do
+    @registry.instance_variable_set( :@drivers, @driver_fixture )
+    @registry.size.should == @driver_fixture.size
+  end
+
+  it &quot;can be dereferenced as though it was a hash&quot; do
+    @registry.instance_variable_set( :@drivers, @driver_fixture )
+    @driver_fixture.keys.each do |key|
+      @registry[ key ].should == @driver_fixture[ key ]
+    end
+  end
+
+  it &quot;aliases #register_driver to #register and #&lt;&lt;&quot; do
+    register_driver = @registry.method( :register_driver )
+
+    @registry.method( :&lt;&lt; ).should == register_driver
+    @registry.method( :register ).should == register_driver
+  end
+
+  it &quot;keeps track of registered drivers by name&quot; do
+    Bees       = Class.new( MIDIator::Driver )
+    Sandwiches = Class.new( MIDIator::Driver )
+    Guns       = Class.new( MIDIator::Driver )
+
+    @registry.register( :bees,       Bees       )
+    @registry.register( :sandwiches, Sandwiches )
+    @registry.register( :guns,       Guns       )
+
+    @registry[ :bees       ].should be( Bees       )
+    @registry[ :sandwiches ].should be( Sandwiches )
+    @registry[ :guns       ].should be( Guns       )
+  end
+
+  it &quot;prevents anything other than a MIDIator::Driver subclass from being registered&quot; do
+    lambda {
+      @registry.register( :failboat, String )
+    }.should raise_error( ArgumentError, &quot;Attempted to register something that is not a MIDIator::Driver&quot; )
+
+    lambda {
+      @registry.register( :great_success, Class.new( MIDIator::Driver ) )
+    }.should_not raise_error
+  end
+
+  it &quot;prevents a single driver from being registered multiple times&quot; do
+    klass = Class.new( MIDIator::Driver )
+
+    lambda {
+      @registry.register( :first_try, klass )
+    }.should_not raise_error
+
+    lambda {
+      @registry.register( :second_try, klass )
+    }.should raise_error( ArgumentError, &quot;Already registered #{klass.to_s} as 'first_try'.&quot; )
+  end
 end</diff>
      <filename>spec/driver_registry_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,14 +16,14 @@
 require File.join( File.dirname(__FILE__), 'lib', 'spec_helper.rb' )
 
 describe MIDIator::Driver do
-	it &quot;automatically registers subclasses&quot; do
-		SomeCoolDriver = Class.new
-		SomeCoolDriver.should_receive( :&lt; ).with( MIDIator::Driver ).and_return( true )
+  it &quot;automatically registers subclasses&quot; do
+    SomeCoolDriver = Class.new
+    SomeCoolDriver.should_receive( :&lt; ).with( MIDIator::Driver ).and_return( true )
 
-		# call inherited directly since we can't set up expectations ahead of
-		# time with Class.new( MIDIator::Driver )
-		MIDIator::Driver.inherited( SomeCoolDriver )
+    # call inherited directly since we can't set up expectations ahead of
+    # time with Class.new( MIDIator::Driver )
+    MIDIator::Driver.inherited( SomeCoolDriver )
 
-		MIDIator::DriverRegistry.instance[ &quot;some_cool_driver&quot; ].should be( SomeCoolDriver )
-	end
+    MIDIator::DriverRegistry.instance[ &quot;some_cool_driver&quot; ].should be( SomeCoolDriver )
+  end
 end</diff>
      <filename>spec/driver_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,121 +20,121 @@
 require File.join( File.dirname(__FILE__), 'lib', 'spec_helper.rb' )
 
 describe MIDIator::Interface do
-	before( :each ) do
-		@driver_name = 'i_like_bees'
+  before( :each ) do
+    @driver_name = 'i_like_bees'
 
-		@interface = MIDIator::Interface.new
-		@driver_class = mock( &quot;driver class&quot; )
-	end
+    @interface = MIDIator::Interface.new
+    @driver_class = mock( &quot;driver class&quot; )
+  end
 
-	describe &quot;auto-detects the correct driver for your platform&quot; do
-		before( :all ) do
-			# remember platform so we can reset it later
-			@ruby_platform = Platform::IMPL
+  describe &quot;auto-detects the correct driver for your platform&quot; do
+    before( :all ) do
+      # remember platform so we can reset it later
+      @ruby_platform = Platform::IMPL
 
-			# suppress warnings (http://www.ruby-forum.com/topic/127608)
-			$-v = nil
-		end
-
-		after( :all ) do
-			# reset platform to whatever is correct for our platform
-			Platform::IMPL = @ruby_platform
-
-			# restore warnings (http://www.ruby-forum.com/topic/127608)
-			$-v = false
-		end
-
-		it &quot;selects WinMM for Windows&quot; do
-			Platform::IMPL = :mswin
-			@interface.should_receive( :use ).with( :winmm )
-
-			@interface.autodetect_driver
-		end
-
-		it &quot;selects CoreMIDI for OSX&quot; do
-			Platform::IMPL = :macosx
-			@interface.should_receive( :use ).with( :core_midi )
-
-			@interface.autodetect_driver
-		end
-
-		it &quot;selects ALSA for Linux&quot; do
-			Platform::IMPL = :linux
-			@interface.should_receive( :use ).with( :alsa )
-
-			@interface.autodetect_driver
-		end
-	end
-
-	describe &quot;provides the #use method to load/specify a MIDI driver&quot; do
-		it &quot;requires the driver's file from midiator/drivers&quot; do
-			path = &quot;midiator/drivers/#{@driver_name}&quot;
-			@interface.should_receive( :require ).with( path )
-
-			# stub out the rest of #use
-			Object.should_receive( :module_eval ).and_return( 
-				mock( 'foo', :null_object =&gt; true )
-			)
-
-			@interface.use( @driver_name )
-		end
-
-		it &quot;captures a LoadError and gives the user a slightly better message&quot; do
-			@interface.should_receive( :require ).and_raise( LoadError )
-
-			lambda {
-				@interface.use( @driver_name )
-			}.should raise_error( LoadError, &quot;Could not load driver '#{@driver_name.to_s}'.&quot;)
-		end
-
-		it &quot;instantiates the driver's class&quot; do
-			@interface.stub!( :require )
-
-			Object.should_receive( :module_eval ).with(
-				&quot;::MIDIator::Driver::ILikeBees&quot;
-			).and_return( Class.new )
-
-			@interface.use( @driver_name )
-		end
-
-		it &quot;correctly spells MIDI if the driver name includes it&quot; do
-			@interface.stub!( :require )
-
-			Object.should_receive( :module_eval ).with(
-				&quot;::MIDIator::Driver::SomeClassThatHasMIDIInItsName&quot;
-			).and_return( Class.new )
-
-			@interface.use( &quot;some_class_that_has_midi_in_its_name&quot; )
-		end
-
-		it &quot;correctly spells ALSA when the ALSA driver is requested&quot; do
-			@interface.stub!( :require )
-
-			Object.should_receive( :module_eval ).with(
-				&quot;::MIDIator::Driver::ALSA&quot;
-			).and_return( Class.new )
-
-			@interface.use( :alsa )
-		end
-
-		it &quot;correctly spells WinMM when the WinMM driver is requested&quot; do
-			@interface.stub!( :require )
-
-			Object.should_receive( :module_eval ).with(
-				&quot;::MIDIator::Driver::WinMM&quot;
-			).and_return( Class.new )
-
-			@interface.use( :winmm )
-		end
-		
-		it &quot;correctly spells DLSSynth when the DLSSynth driver is requested&quot; do
-			@interface.stub!( :require )
-			
-			Object.should_receive( :module_eval ).with(
-				&quot;::MIDIator::Driver::DLSSynth&quot; 
-			).and_return( Class.new )
-			
-			@interface.use( :dls_synth )
-		end
-	end
+      # suppress warnings (http://www.ruby-forum.com/topic/127608)
+      $-v = nil
+    end
+
+    after( :all ) do
+      # reset platform to whatever is correct for our platform
+      Platform::IMPL = @ruby_platform
+
+      # restore warnings (http://www.ruby-forum.com/topic/127608)
+      $-v = false
+    end
+
+    it &quot;selects WinMM for Windows&quot; do
+      Platform::IMPL = :mswin
+      @interface.should_receive( :use ).with( :winmm )
+
+      @interface.autodetect_driver
+    end
+
+    it &quot;selects CoreMIDI for OSX&quot; do
+      Platform::IMPL = :macosx
+      @interface.should_receive( :use ).with( :core_midi )
+
+      @interface.autodetect_driver
+    end
+
+    it &quot;selects ALSA for Linux&quot; do
+      Platform::IMPL = :linux
+      @interface.should_receive( :use ).with( :alsa )
+
+      @interface.autodetect_driver
+    end
+  end
+
+  describe &quot;provides the #use method to load/specify a MIDI driver&quot; do
+    it &quot;requires the driver's file from midiator/drivers&quot; do
+      path = &quot;midiator/drivers/#{@driver_name}&quot;
+      @interface.should_receive( :require ).with( path )
+
+      # stub out the rest of #use
+      Object.should_receive( :module_eval ).and_return( 
+        mock( 'foo', :null_object =&gt; true )
+      )
+
+      @interface.use( @driver_name )
+    end
+
+    it &quot;captures a LoadError and gives the user a slightly better message&quot; do
+      @interface.should_receive( :require ).and_raise( LoadError )
+
+      lambda {
+        @interface.use( @driver_name )
+      }.should raise_error( LoadError, &quot;Could not load driver '#{@driver_name.to_s}'.&quot;)
+    end
+
+    it &quot;instantiates the driver's class&quot; do
+      @interface.stub!( :require )
+
+      Object.should_receive( :module_eval ).with(
+        &quot;::MIDIator::Driver::ILikeBees&quot;
+      ).and_return( Class.new )
+
+      @interface.use( @driver_name )
+    end
+
+    it &quot;correctly spells MIDI if the driver name includes it&quot; do
+      @interface.stub!( :require )
+
+      Object.should_receive( :module_eval ).with(
+        &quot;::MIDIator::Driver::SomeClassThatHasMIDIInItsName&quot;
+      ).and_return( Class.new )
+
+      @interface.use( &quot;some_class_that_has_midi_in_its_name&quot; )
+    end
+
+    it &quot;correctly spells ALSA when the ALSA driver is requested&quot; do
+      @interface.stub!( :require )
+
+      Object.should_receive( :module_eval ).with(
+        &quot;::MIDIator::Driver::ALSA&quot;
+      ).and_return( Class.new )
+
+      @interface.use( :alsa )
+    end
+
+    it &quot;correctly spells WinMM when the WinMM driver is requested&quot; do
+      @interface.stub!( :require )
+
+      Object.should_receive( :module_eval ).with(
+        &quot;::MIDIator::Driver::WinMM&quot;
+      ).and_return( Class.new )
+
+      @interface.use( :winmm )
+    end
+    
+    it &quot;correctly spells DLSSynth when the DLSSynth driver is requested&quot; do
+      @interface.stub!( :require )
+      
+      Object.should_receive( :module_eval ).with(
+        &quot;::MIDIator::Driver::DLSSynth&quot; 
+      ).and_return( Class.new )
+      
+      @interface.use( :dls_synth )
+    end
+  end
 end</diff>
      <filename>spec/interface_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,19 +17,19 @@
 require File.join( File.dirname(__FILE__), 'lib', 'spec_helper.rb' )
 
 describe &quot;MIDIator's extensions to Ruby's String class&quot; do
-	it &quot;converts under_scored strings to CamelCase&quot; do
-		&quot;this_is_some_strings&quot;.camelize.should == &quot;ThisIsSomeStrings&quot;
-	end
+  it &quot;converts under_scored strings to CamelCase&quot; do
+    &quot;this_is_some_strings&quot;.camelize.should == &quot;ThisIsSomeStrings&quot;
+  end
 
-	it &quot;converts file path strings to module paths&quot; do
-		&quot;some/file/lives/here&quot;.camelize.should == &quot;Some::File::Lives::Here&quot;
-	end
+  it &quot;converts file path strings to module paths&quot; do
+    &quot;some/file/lives/here&quot;.camelize.should == &quot;Some::File::Lives::Here&quot;
+  end
 
-	it &quot;converts CamelCase strings to under_scored&quot; do
-		&quot;TheseStringsBeCamelly&quot;.underscore.should == &quot;these_strings_be_camelly&quot;
-	end
+  it &quot;converts CamelCase strings to under_scored&quot; do
+    &quot;TheseStringsBeCamelly&quot;.underscore.should == &quot;these_strings_be_camelly&quot;
+  end
 
-	it &quot;converts module path strings to file paths&quot; do
-		&quot;This::Is::A::Module&quot;.underscore.should == &quot;this/is/a/module&quot;
-	end
+  it &quot;converts module path strings to file paths&quot; do
+    &quot;This::Is::A::Module&quot;.underscore.should == &quot;this/is/a/module&quot;
+  end
 end</diff>
      <filename>spec/string_extensions_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0c344fa07cfdcdf63a1d43a255187ea01ed80263</id>
    </parent>
  </parents>
  <author>
    <name>Ben Bleything</name>
    <email>ben@bleything.net</email>
  </author>
  <url>http://github.com/bleything/midiator/commit/16c9e7791e4a53a81109f2b5d3bac59351873c90</url>
  <id>16c9e7791e4a53a81109f2b5d3bac59351873c90</id>
  <committed-date>2009-04-02T17:43:28-07:00</committed-date>
  <authored-date>2009-04-02T17:43:28-07:00</authored-date>
  <message>retab, looking at the files outside an editor was a nightmare</message>
  <tree>7d3fe6cbf240559c1d33cc3aadc799dd9061d268</tree>
  <committer>
    <name>Ben Bleything</name>
    <email>ben@bleything.net</email>
  </committer>
</commit>
