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 = 0, length = 'full', volume = 'full', pan = 'center', reverb = 'none') ⇒ 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 = 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
#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
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 |
#delay ⇒ Object
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_value ⇒ Object
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_value ⇒ Object
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_offset ⇒ Object
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_value ⇒ Object
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 |