Class: PicoTune::Instrument

Inherits:
Object
  • Object
show all
Defined in:
lib/picotune.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, tone = 0, length = 'full', volume = 'full', pan = 'center', reverb = 'none') ⇒ Instrument



311
312
313
314
315
316
317
318
# File 'lib/picotune.rb', line 311

def initialize name, tone = 0, length = 'full', volume = 'full', pan = 'center', reverb = 'none'
  @name = name
  @tone = tone
  @length = length
  @volume = volume
  @pan = pan
  @reverb = reverb
end

Instance Attribute Details

#lengthObject (readonly)

Returns the value of attribute length.



308
309
310
# File 'lib/picotune.rb', line 308

def length
  @length
end

#nameObject (readonly)

Returns the value of attribute name.



308
309
310
# File 'lib/picotune.rb', line 308

def name
  @name
end

#panObject (readonly)

Returns the value of attribute pan.



308
309
310
# File 'lib/picotune.rb', line 308

def pan
  @pan
end

#phraseObject

Returns the value of attribute phrase.



309
310
311
# File 'lib/picotune.rb', line 309

def phrase
  @phrase
end

#reverbObject (readonly)

Returns the value of attribute reverb.



308
309
310
# File 'lib/picotune.rb', line 308

def reverb
  @reverb
end

#toneObject (readonly)

Returns the value of attribute tone.



308
309
310
# File 'lib/picotune.rb', line 308

def tone
  @tone
end

#volumeObject (readonly)

Returns the value of attribute volume.



308
309
310
# File 'lib/picotune.rb', line 308

def volume
  @volume
end

Instance Method Details

#decayObject



369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'lib/picotune.rb', line 369

def decay
  case @reverb
  when 'none'
    0.0
  when 'some'
    0.25
  when 'more'
    0.5
  when 'lots'
    0.75
  else
    0.0
  end
end

#delayObject



365
366
367
# File 'lib/picotune.rb', line 365

def delay
  @reverb == 'none' ? 0.0 : 0.1
end

#frequency_for_note(note) ⇒ Object



412
413
414
415
416
417
418
419
420
421
422
423
424
425
# File 'lib/picotune.rb', line 412

def frequency_for_note note
  parts = note.split ''
  octave = parts.pop.to_i
  name = parts.join.to_sym
  freq = PicoTune::FREQUENCIES[name]

  raise "Bad note: #{name} from #{note}. Valid note names are <C, C# or Db, D, D# or Eb, E, F, F# or Gb, G, G# or Ab, A, A# or Bb, B>" unless freq
  raise "Bad octave: #{octave} from #{note}. Valid octave number is 1..8" unless (1..8).include?(octave)

  octave_shift = PicoTune::TONE_CONSTANT ** 12
  (octave - 1).times { freq = freq * octave_shift }

  freq
end

#length_valueObject



320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'lib/picotune.rb', line 320

def length_value
  case @length
  when 'none'
    0.0
  when 'quarter'
    0.25
  when 'half'
    0.5
  when 'threequarters'
    0.75
  when 'full'
    1.0
  end
end

#pan_valueObject



350
351
352
353
354
355
356
357
358
359
360
361
362
363
# File 'lib/picotune.rb', line 350

def pan_value
  case @pan
  when 'left'
    0
  when 'centerleft'
    1
  when 'center'
    2
  when 'centerright'
    3
  when 'right'
    4
  end
end

#reverb?Boolean



388
389
390
# File 'lib/picotune.rb', line 388

def reverb?
  %w(some more lots).include? @reverb
end

#reverb_offsetObject



384
385
386
# File 'lib/picotune.rb', line 384

def reverb_offset
  (PicoTune::SAMPLE_RATE * delay).floor
end

#samples_per_wave(note) ⇒ Object



407
408
409
410
# File 'lib/picotune.rb', line 407

def samples_per_wave note
  frequency = frequency_for_note note
  (PicoTune::SAMPLE_RATE / frequency).to_i
end

#volume_valueObject



335
336
337
338
339
340
341
342
343
344
345
346
347
348
# File 'lib/picotune.rb', line 335

def volume_value
  case @volume
  when 'none'
    0.0
  when 'quarter'
    0.25
  when 'half'
    0.5
  when 'threequarters'
    0.75
  when 'full'
    1.0
  end
end

#wave(wave_index, note) ⇒ Object



392
393
394
395
396
397
398
399
400
401
402
403
404
405
# File 'lib/picotune.rb', line 392

def wave wave_index, note 
  frequency = frequency_for_note note
  samples_per_wave = (PicoTune::SAMPLE_RATE / frequency).to_i
  sample = PicoTune::WaveSample.new(@tone, samples_per_wave).sample wave_index
  sample.modify_left :*, volume_value * (1 - pan_value / 4.0)
  sample.modify_right :*, volume_value * (pan_value / 4.0)

  if v = phrase&.tune&.volume_factor_for_simultaneous_melodies
    sample.modify_left :*, v
    sample.modify_right :*, v
  end

  sample
end