Class: RoadToRubykaigi::Audio::SequencerBase

Inherits:
Object
  • Object
show all
Defined in:
lib/road_to_rubykaigi/audio/sequencer.rb

Direct Known Subclasses

BassSequencer, FanfareSequencer, MelodySequencer

Constant Summary collapse

BPM =
100
NOTES =
{
  REST: 0.0,
  C4: 261.63, C4s: 277.18, # ド
  D4: 293.66, D4s: 311.13,
  E4: 329.63,
  F4: 349.23, F4s: 369.99,
  G4: 392.00, G4s: 415.30, # ソ
  A4: 440.00, A4s: 466.16,
  B4: 493.88,
  C5: 523.25, C5s: 554.37,
  D5: 587.33, D5s: 622.25,
  E5: 659.25,
  F5: 698.46, F5s: 739.99,
  G5: 783.99, G5s: 830.61,
  A5: 880.00, A5s: 932.33,
  B5: 987.77,
  C6: 1046.50,
}
ENVELOPE =
{
  bass:        { a: 0.2, d: 0.2, s: 0.6, sl: 0.6, rl: 0.9 },
  bass_short:  { a: 0.2, d: 0.2, s: 0.05, sl: 0.6, rl: 0.9 },
  melody:      { a: 0.05, d: 0.1, s: 0.1, sl: 0.75, rl: 1.35 },
  melody_long: { a: 0.5, d: 0.2, s: 0.7, sl: 0.6, rl: 1.0 },
  fanfare:     { a: 0.2, d: 0.1, s: 0.35, sl: 0.6, rl: 1.5 },
}

Instance Method Summary collapse

Instance Method Details

#finished?Boolean



56
57
58
# File 'lib/road_to_rubykaigi/audio/sequencer.rb', line 56

def finished?
  !loop? && @current_note_index >= @notes.size
end

#gainObject



48
49
50
# File 'lib/road_to_rubykaigi/audio/sequencer.rb', line 48

def gain
  @generator.gain
end

#generateObject



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/road_to_rubykaigi/audio/sequencer.rb', line 31

def generate
  process
  env = envelope
  sample = if (current_note[:frequency] != [:REST]) &&
      (@current_note_sample_count < (@samples_per_note * staccato_ratio))
    @generator.generate(frequencies: current_frequencies)
  else
    0.0
  end
  increment_current_note_sample_count
  sample * env
end

#rewindObject



52
53
54
# File 'lib/road_to_rubykaigi/audio/sequencer.rb', line 52

def rewind
  self
end

#sample_rateObject



44
45
46
# File 'lib/road_to_rubykaigi/audio/sequencer.rb', line 44

def sample_rate
  @generator.sample_rate
end