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, length, volume, pan, reverb) ⇒ Instrument

Returns a new instance of Instrument.



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

def initialize name, tone, length, volume, pan, reverb
  @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



375
376
377
378
379
380
381
382
383
384
385
386
387
388
# File 'lib/picotune.rb', line 375

def decay
  case @reverb
  when 'none'
    0.0
  when 'some'
    0.1
  when 'more'
    0.3
  when 'lots'
    0.5
  else
    0.0
  end
end

#delayObject



371
372
373
# File 'lib/picotune.rb', line 371

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

#frequency_for_note(note) ⇒ Object



418
419
420
421
422
423
424
425
426
427
428
429
430
431
# File 'lib/picotune.rb', line 418

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
334
335
# 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
  else
    1.0
  end
end

#pan_valueObject



354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
# File 'lib/picotune.rb', line 354

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

#reverb?Boolean

Returns:

  • (Boolean)


394
395
396
# File 'lib/picotune.rb', line 394

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

#reverb_offsetObject



390
391
392
# File 'lib/picotune.rb', line 390

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

#samples_per_wave(note) ⇒ Object



413
414
415
416
# File 'lib/picotune.rb', line 413

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

#volume_valueObject



337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
# File 'lib/picotune.rb', line 337

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
  else
    1.0
  end
end

#wave(wave_index, note) ⇒ Object



398
399
400
401
402
403
404
405
406
407
408
409
410
411
# File 'lib/picotune.rb', line 398

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