Class: PicoTune::Instrument
- Inherits:
-
Object
- Object
- PicoTune::Instrument
- Defined in:
- lib/picotune.rb
Instance Attribute Summary collapse
-
#length ⇒ Object
readonly
Returns the value of attribute length.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#pan ⇒ Object
readonly
Returns the value of attribute pan.
-
#phrase ⇒ Object
Returns the value of attribute phrase.
-
#reverb ⇒ Object
readonly
Returns the value of attribute reverb.
-
#tone ⇒ Object
readonly
Returns the value of attribute tone.
-
#volume ⇒ Object
readonly
Returns the value of attribute volume.
Instance Method Summary collapse
- #decay ⇒ Object
- #delay ⇒ Object
- #frequency_for_note(note) ⇒ Object
-
#initialize(name, tone, length, volume, pan, reverb) ⇒ Instrument
constructor
A new instance of Instrument.
- #length_value ⇒ Object
- #pan_value ⇒ Object
- #reverb? ⇒ Boolean
- #reverb_offset ⇒ Object
- #samples_per_wave(note) ⇒ Object
- #volume_value ⇒ Object
- #wave(wave_index, note) ⇒ Object
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
#length ⇒ Object (readonly)
Returns the value of attribute length.
308 309 310 |
# File 'lib/picotune.rb', line 308 def length @length end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
308 309 310 |
# File 'lib/picotune.rb', line 308 def name @name end |
#pan ⇒ Object (readonly)
Returns the value of attribute pan.
308 309 310 |
# File 'lib/picotune.rb', line 308 def pan @pan end |
#phrase ⇒ Object
Returns the value of attribute phrase.
309 310 311 |
# File 'lib/picotune.rb', line 309 def phrase @phrase end |
#reverb ⇒ Object (readonly)
Returns the value of attribute reverb.
308 309 310 |
# File 'lib/picotune.rb', line 308 def reverb @reverb end |
#tone ⇒ Object (readonly)
Returns the value of attribute tone.
308 309 310 |
# File 'lib/picotune.rb', line 308 def tone @tone end |
#volume ⇒ Object (readonly)
Returns the value of attribute volume.
308 309 310 |
# File 'lib/picotune.rb', line 308 def volume @volume end |
Instance Method Details
#decay ⇒ Object
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 |
#delay ⇒ Object
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_value ⇒ Object
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_value ⇒ Object
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
394 395 396 |
# File 'lib/picotune.rb', line 394 def reverb? %w(some more lots).include? @reverb end |
#reverb_offset ⇒ Object
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_value ⇒ Object
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 |