Class: StepSequencer::SoundBuilder::DefaultEffects::Loop

Inherits:
Object
  • Object
show all
Defined in:
lib/step_sequencer/sound_builder/default_effects/loop.rb

Class Method Summary collapse

Class Method Details

.build(sources:, times:) ⇒ Object



5
6
7
8
9
10
11
12
13
# File 'lib/step_sequencer/sound_builder/default_effects/loop.rb', line 5

def self.build(sources:, times:)
  num_full_loops = times.to_i # rounds down
  num_partial_loops = times - num_full_loops.to_f
  outfiles = build_full_loops(sources, num_full_loops)
  if num_partial_loops > 0
    outfiles = build_partial_loops(sources, outfiles, num_partial_loops)
  end
  outfiles
end

.build_full_loops(sources, num_full_loops) ⇒ Object



27
28
29
30
31
# File 'lib/step_sequencer/sound_builder/default_effects/loop.rb', line 27

def build_full_loops(sources, num_full_loops)
  sources.map do |source|
    combine(Array.new(num_full_loops, source))
  end
end

.build_outfile_pathObject



17
18
19
# File 'lib/step_sequencer/sound_builder/default_effects/loop.rb', line 17

def build_outfile_path
  "#{output_dir}/#{SecureRandom.urlsafe_base64}.mp3"
end

.build_partial_loops(sources, outfiles, num_partial_loops) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/step_sequencer/sound_builder/default_effects/loop.rb', line 20

def build_partial_loops(sources, outfiles, num_partial_loops)
  outfiles.map.with_index do |outfile, idx|
    source = sources[idx]
    sliced = slice_source(source, num_partial_loops)
    combine([outfile, sliced])
  end
end

.combine(sources) ⇒ Object



39
40
41
42
43
44
# File 'lib/step_sequencer/sound_builder/default_effects/loop.rb', line 39

def combine(sources)
  builder.build(
    sources: sources,
    effect: :Combine
  )
end

.slice_source(source, num_partial_loops) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/step_sequencer/sound_builder/default_effects/loop.rb', line 32

def slice_source(source, num_partial_loops)
  builder.build(
    sources: [source],
    effect: :Slice,
    args: [{start_pct: 0.0, end_pct: (num_partial_loops * 100) }]
  )[0]
end