ruck 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +18 -50
- data/Rakefile +13 -13
- data/VERSION +1 -1
- data/lib/ruck/shreduling.rb +17 -40
- data/lib/ruck.rb +0 -5
- data/ruck.gemspec +4 -57
- metadata +17 -59
- data/bin/ruck_glapp +0 -162
- data/bin/ruck_midi +0 -151
- data/bin/ruck_sleep +0 -47
- data/bin/ruck_ugen +0 -53
- data/examples/glapp/ex01.rb +0 -28
- data/examples/glapp/ex02.rb +0 -57
- data/examples/glapp/ex03.rb +0 -9
- data/examples/midi/ex01.rb +0 -24
- data/examples/midi/ex02.rb +0 -72
- data/examples/ugen/ex01.rb +0 -24
- data/examples/ugen/ex02.rb +0 -2
- data/examples/ugen/ex03.rb +0 -8
- data/examples/ugen/ex04.rb +0 -14
- data/examples/ugen/ex05.rb +0 -9
- data/examples/ugen/ex06.rb +0 -10
- data/examples/ugen/ex07.rb +0 -35
- data/examples/ugen/ex08.rb +0 -28
- data/examples/ugen/ex09.rb +0 -26
- data/examples/ugen/ex10.rb +0 -15
- data/examples/ugen/ex11.rb +0 -10
- data/examples/ugen/ex12.rb +0 -9
- data/lib/ruck/bench.rb +0 -44
- data/lib/ruck/misc/linkage.rb +0 -22
- data/lib/ruck/misc/metaid.rb +0 -18
- data/lib/ruck/misc/pcm_time_helpers.rb +0 -29
- data/lib/ruck/misc/riff.rb +0 -71
- data/lib/ruck/misc/wavparse.rb +0 -35
- data/lib/ruck/ugen/general.rb +0 -408
- data/lib/ruck/ugen/oscillators.rb +0 -106
- data/lib/ruck/ugen/wav.rb +0 -185
data/bin/ruck_midi
DELETED
@@ -1,151 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
3
|
-
|
4
|
-
require "ruck"
|
5
|
-
|
6
|
-
require "rubygems"
|
7
|
-
require "midilib"
|
8
|
-
require "midiator"
|
9
|
-
|
10
|
-
# configuration
|
11
|
-
if ARGV.length < 4
|
12
|
-
puts "ruby midilib_runner.rb MIDI_FILENAME NUM_TRACKS LIVE SCRIPT_FILENAME [...]"
|
13
|
-
exit 1
|
14
|
-
end
|
15
|
-
|
16
|
-
MIDI_FILENAME = ARGV[0]
|
17
|
-
NUM_TRACKS = ARGV[1].to_i
|
18
|
-
ALSO_LIVE = ["yes", "true", "1", "yeah"].include? ARGV[2].downcase
|
19
|
-
FILENAMES = ARGV[3..-1]
|
20
|
-
|
21
|
-
class MIDIShreduler < Ruck::Shreduler
|
22
|
-
def run
|
23
|
-
@start_time = Time.now
|
24
|
-
super
|
25
|
-
end
|
26
|
-
|
27
|
-
def sim_to(new_now)
|
28
|
-
d = new_now - @now
|
29
|
-
TRACK_DELTAS.each_with_index do |delta, i|
|
30
|
-
TRACK_DELTAS[i] = delta + d
|
31
|
-
end
|
32
|
-
|
33
|
-
# sync with wall clock
|
34
|
-
if ALSO_LIVE
|
35
|
-
actual_now = Time.now
|
36
|
-
simulated_now = @start_time + (new_now.to_f / SEQUENCE.ppqn / SEQUENCE.bpm * 60.0)
|
37
|
-
if simulated_now > actual_now
|
38
|
-
sleep(simulated_now - actual_now)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
@now = new_now
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# state
|
47
|
-
SHREDULER = MIDIShreduler.new
|
48
|
-
SEQUENCE = MIDI::Sequence.new
|
49
|
-
TRACKS = (1..NUM_TRACKS).map { MIDI::Track.new(SEQUENCE) }
|
50
|
-
TRACK_DELTAS = TRACKS.map { 0 }
|
51
|
-
if ALSO_LIVE
|
52
|
-
MIDI_PLAYER = MIDIator::Interface.new
|
53
|
-
end
|
54
|
-
|
55
|
-
# midi initialization stuff
|
56
|
-
TRACKS.each do |track|
|
57
|
-
SEQUENCE.tracks << track
|
58
|
-
#track.events << MIDI::Tempo.new(MIDI::Tempo.bpm_to_mpq(120))
|
59
|
-
end
|
60
|
-
if ALSO_LIVE
|
61
|
-
MIDI_PLAYER.use :dls_synth
|
62
|
-
MIDI_PLAYER.instruct_user!
|
63
|
-
end
|
64
|
-
|
65
|
-
# set up some useful time helpers
|
66
|
-
module MIDITime
|
67
|
-
def pulse
|
68
|
-
self
|
69
|
-
end
|
70
|
-
alias_method :pulses, :pulse
|
71
|
-
|
72
|
-
def quarter_note
|
73
|
-
self * SEQUENCE.ppqn
|
74
|
-
end
|
75
|
-
alias_method :quarter_notes, :quarter_note
|
76
|
-
alias_method :beat, :quarter_note
|
77
|
-
alias_method :beats, :quarter_note
|
78
|
-
end
|
79
|
-
|
80
|
-
class Fixnum
|
81
|
-
include MIDITime
|
82
|
-
end
|
83
|
-
|
84
|
-
class Float
|
85
|
-
include MIDITime
|
86
|
-
end
|
87
|
-
|
88
|
-
# stuff accessible in a shred
|
89
|
-
module ShredLocal
|
90
|
-
|
91
|
-
def now
|
92
|
-
SHREDULER.now
|
93
|
-
end
|
94
|
-
|
95
|
-
def spork(name = "unnamed", &shred)
|
96
|
-
SHREDULER.spork(name, &shred)
|
97
|
-
end
|
98
|
-
|
99
|
-
def wait(pulses)
|
100
|
-
SHREDULER.current_shred.yield(pulses)
|
101
|
-
end
|
102
|
-
|
103
|
-
def finish
|
104
|
-
shred = SHREDULER.current_shred
|
105
|
-
SHREDULER.remove_shred shred
|
106
|
-
shred.finish
|
107
|
-
end
|
108
|
-
|
109
|
-
def note_on(note, velocity = 127, channel = 0, track = 0)
|
110
|
-
TRACKS[track].events << MIDI::NoteOnEvent.new(channel, note, velocity, TRACK_DELTAS[track].to_i)
|
111
|
-
TRACK_DELTAS[track] = 0
|
112
|
-
if ALSO_LIVE
|
113
|
-
MIDI_PLAYER.driver.note_on(note, channel, velocity)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def note_off(note, channel = 0, track = 0)
|
118
|
-
TRACKS[track].events << MIDI::NoteOffEvent.new(channel, note, 0, TRACK_DELTAS[track].to_i)
|
119
|
-
TRACK_DELTAS[track] = 0
|
120
|
-
if ALSO_LIVE
|
121
|
-
MIDI_PLAYER.driver.note_on(note, channel, 0)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
def save
|
128
|
-
return if @saved
|
129
|
-
@saved = true
|
130
|
-
File.open(MIDI_FILENAME, "wb") { |file| SEQUENCE.write(file) }
|
131
|
-
end
|
132
|
-
|
133
|
-
FILENAMES.each do |filename|
|
134
|
-
unless File.readable?(filename)
|
135
|
-
LOG.fatal "Cannot read file #{filename}"
|
136
|
-
exit
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
FILENAMES.each do |filename|
|
141
|
-
SHREDULER.spork(filename) do
|
142
|
-
include ShredLocal
|
143
|
-
require filename
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
at_exit { save }
|
148
|
-
|
149
|
-
SHREDULER.run
|
150
|
-
|
151
|
-
save
|
data/bin/ruck_sleep
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
3
|
-
|
4
|
-
require "ruck"
|
5
|
-
|
6
|
-
# stuff accessible in a shred
|
7
|
-
module ShredLocal
|
8
|
-
|
9
|
-
def now
|
10
|
-
SHREDULER.now
|
11
|
-
end
|
12
|
-
|
13
|
-
def spork(name = "unnamed", &shred)
|
14
|
-
SHREDULER.spork(name, &shred)
|
15
|
-
end
|
16
|
-
|
17
|
-
def wait(seconds)
|
18
|
-
SHREDULER.current_shred.yield(seconds)
|
19
|
-
end
|
20
|
-
|
21
|
-
def finish
|
22
|
-
shred = SHREDULER.current_shred
|
23
|
-
SHREDULER.remove_shred shred
|
24
|
-
shred.finish
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
SAMPLE_RATE = 1
|
31
|
-
SHREDULER = Ruck::RealTimeShreduler.new
|
32
|
-
|
33
|
-
filenames = ARGV
|
34
|
-
filenames.each do |filename|
|
35
|
-
unless File.readable?(filename)
|
36
|
-
LOG.fatal "Cannot read file #{filename}"
|
37
|
-
exit
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
filenames.each do |filename|
|
42
|
-
SHREDULER.spork(filename) do
|
43
|
-
include ShredLocal
|
44
|
-
require filename
|
45
|
-
end
|
46
|
-
end
|
47
|
-
SHREDULER.run
|
data/bin/ruck_ugen
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
3
|
-
|
4
|
-
require "ruck"
|
5
|
-
|
6
|
-
# stuff accessible in a shred
|
7
|
-
module ShredLocal
|
8
|
-
|
9
|
-
def blackhole
|
10
|
-
BLACKHOLE
|
11
|
-
end
|
12
|
-
|
13
|
-
def now
|
14
|
-
SHREDULER.now
|
15
|
-
end
|
16
|
-
|
17
|
-
def spork(name = "unnamed", &shred)
|
18
|
-
SHREDULER.spork(name, &shred)
|
19
|
-
end
|
20
|
-
|
21
|
-
def play(samples)
|
22
|
-
SHREDULER.current_shred.yield(samples)
|
23
|
-
end
|
24
|
-
|
25
|
-
def finish
|
26
|
-
shred = SHREDULER.current_shred
|
27
|
-
SHREDULER.remove_shred shred
|
28
|
-
shred.finish
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
SAMPLE_RATE = 22050
|
35
|
-
SHREDULER = Ruck::UGenShreduler.new
|
36
|
-
BLACKHOLE = Ruck::InChannel.new
|
37
|
-
|
38
|
-
filenames = ARGV
|
39
|
-
filenames.each do |filename|
|
40
|
-
unless File.readable?(filename)
|
41
|
-
LOG.fatal "Cannot read file #{filename}"
|
42
|
-
exit
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
filenames.each do |filename|
|
47
|
-
SHREDULER.spork(filename) do
|
48
|
-
include ShredLocal
|
49
|
-
include Ruck::Generators
|
50
|
-
require filename
|
51
|
-
end
|
52
|
-
end
|
53
|
-
SHREDULER.run
|
data/examples/glapp/ex01.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
|
2
|
-
clear
|
3
|
-
|
4
|
-
spork("framerate watcher") do
|
5
|
-
start_time = Time.now
|
6
|
-
frames = 0
|
7
|
-
|
8
|
-
loop do
|
9
|
-
wait_for_frame
|
10
|
-
frames += 1
|
11
|
-
if frames % 100 == 0
|
12
|
-
puts "#{frames.to_f / (Time.now - start_time)}"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
loop do
|
19
|
-
wait 2
|
20
|
-
|
21
|
-
glColor 1, 0, 0
|
22
|
-
glTranslate(0, 0, -5)
|
23
|
-
glutSolidCube(2)
|
24
|
-
|
25
|
-
wait 0.1
|
26
|
-
|
27
|
-
clear
|
28
|
-
end
|
data/examples/glapp/ex02.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
|
2
|
-
require "rubygems"
|
3
|
-
require "midiator"
|
4
|
-
|
5
|
-
$midi = MIDIator::Interface.new
|
6
|
-
$midi.use :dls_synth
|
7
|
-
$midi.instruct_user!
|
8
|
-
|
9
|
-
def note_on(note, velocity = 127, channel = 0)
|
10
|
-
$midi.driver.note_on(note, channel, velocity)
|
11
|
-
end
|
12
|
-
|
13
|
-
def note_off(note, channel = 0)
|
14
|
-
$midi.driver.note_on(note, channel, 0)
|
15
|
-
end
|
16
|
-
|
17
|
-
def star_shifter(key)
|
18
|
-
wait 3
|
19
|
-
@stars.shift
|
20
|
-
note_off(key)
|
21
|
-
end
|
22
|
-
|
23
|
-
spork do
|
24
|
-
while ev = wait_for_key_down
|
25
|
-
note_on(ev.key)
|
26
|
-
|
27
|
-
@stars << Star.new
|
28
|
-
spork { star_shifter ev.key }
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
spork do
|
33
|
-
while ev = wait_for_key_up
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class Star
|
38
|
-
def initialize
|
39
|
-
@x = rand * 2 - 1
|
40
|
-
@y = rand * 2 - 1
|
41
|
-
end
|
42
|
-
|
43
|
-
def draw
|
44
|
-
glPushMatrix
|
45
|
-
glTranslate @x, @y, -5
|
46
|
-
glutSolidCube(0.1)
|
47
|
-
glPopMatrix
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
clear
|
52
|
-
|
53
|
-
@stars = []
|
54
|
-
while wait_for_frame
|
55
|
-
clear
|
56
|
-
@stars.each { |star| star.draw }
|
57
|
-
end
|
data/examples/glapp/ex03.rb
DELETED
data/examples/midi/ex01.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
|
2
|
-
def maybe
|
3
|
-
rand >= 0.5
|
4
|
-
end
|
5
|
-
|
6
|
-
TRACKS[0].events << MIDI::Controller.new(10, 32, 1) # channel, controller, value
|
7
|
-
TRACKS[0].events << MIDI::ProgramChange.new(10, 26) # channel, program
|
8
|
-
MIDI_PLAYER.control_change 32, 10, 1 # number, channel, value
|
9
|
-
MIDI_PLAYER.program_change 10, 26 # channel, program
|
10
|
-
|
11
|
-
def play(note, dur = 1.quarter_note)
|
12
|
-
return if maybe
|
13
|
-
note_on note, 100, 10
|
14
|
-
wait dur
|
15
|
-
note_off note, 10
|
16
|
-
end
|
17
|
-
|
18
|
-
10.times do
|
19
|
-
spork { play(rand(30) + 40, rand * 3.quarter_notes + 3.quarter_notes) }
|
20
|
-
wait 0.5.quarter_note
|
21
|
-
end
|
22
|
-
|
23
|
-
wait 2.quarter_notes; note_off 0 # end padding
|
24
|
-
|
data/examples/midi/ex02.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
|
2
|
-
def maybe
|
3
|
-
rand >= 0.5
|
4
|
-
end
|
5
|
-
|
6
|
-
@base = 43
|
7
|
-
@scale = 0
|
8
|
-
@chord = 0
|
9
|
-
|
10
|
-
major_scale = [0, 2, 4, 5, 7, 9, 11]
|
11
|
-
minor_scale = [0, 2, 3, 5, 7, 8, 11]
|
12
|
-
@scales = [major_scale, minor_scale]
|
13
|
-
|
14
|
-
def scale(note, scale)
|
15
|
-
len = scale.length
|
16
|
-
oct = note / len
|
17
|
-
off = note % len
|
18
|
-
while off < 0
|
19
|
-
off += len
|
20
|
-
oct -= 1
|
21
|
-
end
|
22
|
-
oct * 12 + scale[off]
|
23
|
-
end
|
24
|
-
|
25
|
-
def play(note, dur = 1.beat)
|
26
|
-
midi_note = @base + scale(note, @scales[@scale])
|
27
|
-
note_on midi_note, 100
|
28
|
-
wait dur
|
29
|
-
note_off midi_note
|
30
|
-
end
|
31
|
-
|
32
|
-
def change_chords
|
33
|
-
loop do
|
34
|
-
wait 4.beats
|
35
|
-
@chord = rand(7)
|
36
|
-
if rand <= 0.1
|
37
|
-
@scale = (@scale + 1) % @scales.length
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def play_chord(dur)
|
43
|
-
spork { play(@chord, dur) }
|
44
|
-
spork { play(@chord + 2, dur) }
|
45
|
-
spork { play(@chord + 4, dur) }
|
46
|
-
end
|
47
|
-
|
48
|
-
def play_chords
|
49
|
-
loop do
|
50
|
-
if maybe && maybe
|
51
|
-
play_chord 2.beats
|
52
|
-
wait 2.beats
|
53
|
-
play_chord 2.beats
|
54
|
-
wait 2.beats
|
55
|
-
else
|
56
|
-
play_chord 4.beats
|
57
|
-
wait 4.beats
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def play_melody
|
63
|
-
loop do
|
64
|
-
len = ((rand(2) + 1) / 2.0).beats
|
65
|
-
play(@chord + 7 + 2 * rand(4), len)
|
66
|
-
wait len
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
spork { change_chords }
|
71
|
-
spork { play_chords }
|
72
|
-
spork { play_melody }
|
data/examples/ugen/ex01.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
def beep(wav, chan)
|
2
|
-
(s = SawOsc.new(:freq => 440, :gain => 0.25)) >> wav.in(chan)
|
3
|
-
10.times do
|
4
|
-
play 0.1.seconds
|
5
|
-
s.freq *= 1.2
|
6
|
-
end
|
7
|
-
s << wav
|
8
|
-
end
|
9
|
-
|
10
|
-
wav = WavOut.new(:filename => "ex01.wav", :num_channels => 2)
|
11
|
-
SinOsc.new(:freq => 440, :gain => 0.25) >> wav
|
12
|
-
SinOsc.new(:freq => 880, :gain => 0.25) >> wav
|
13
|
-
|
14
|
-
wav >> blackhole
|
15
|
-
|
16
|
-
chan = 0
|
17
|
-
|
18
|
-
10.times do
|
19
|
-
play 0.7.seconds
|
20
|
-
chan = (chan + 1) % 2
|
21
|
-
spork("beep") { beep(wav, chan) }
|
22
|
-
end
|
23
|
-
|
24
|
-
play 2.seconds
|
data/examples/ugen/ex02.rb
DELETED
data/examples/ugen/ex03.rb
DELETED
data/examples/ugen/ex04.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
(wav = WavOut.new(:filename => "ex04.wav")) >> blackhole
|
2
|
-
s = SawOsc.new(:freq => 440, :gain => 0.5)
|
3
|
-
adsr = ADSR.new(:attack_time => 50.ms,
|
4
|
-
:attack_gain => 1.0,
|
5
|
-
:decay_time => 50.ms,
|
6
|
-
:sustain_gain => 0.5,
|
7
|
-
:release_time => 1.second)
|
8
|
-
s >> adsr >> wav
|
9
|
-
|
10
|
-
play 1.second
|
11
|
-
adsr.on
|
12
|
-
play 2.seconds
|
13
|
-
adsr.off
|
14
|
-
play 2.seconds
|
data/examples/ugen/ex05.rb
DELETED
data/examples/ugen/ex06.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
# run ex01.rb first
|
2
|
-
|
3
|
-
spoken = WavIn.new(:filename => "ex01.wav")
|
4
|
-
wav = WavOut.new(:filename => "ex06.wav")
|
5
|
-
spoken.out(0) >> wav >> blackhole
|
6
|
-
|
7
|
-
(sin = SinOsc.new(:freq => 3, :gain => 0.1)) >> blackhole
|
8
|
-
spoken.rate = L{ 1.0 + sin.last }
|
9
|
-
|
10
|
-
play spoken.duration
|
data/examples/ugen/ex07.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
@bpm = 130.0
|
2
|
-
@one_beat = (1.0 / @bpm).minutes
|
3
|
-
|
4
|
-
(@wav = WavOut.new(:filename => "ex07.wav")) >> blackhole
|
5
|
-
|
6
|
-
def smash(len = @one_beat)
|
7
|
-
(n = Noise.new(:gain => 0.4)) >> (a = ADSR.new) >> @wav
|
8
|
-
a.release_time = len
|
9
|
-
a.on; play @one_beat / 1.5
|
10
|
-
a.off; play len
|
11
|
-
a << @wav
|
12
|
-
end
|
13
|
-
|
14
|
-
def beat
|
15
|
-
(thump = SawOsc.new(:freq => 220, :gain => 0.7)) >> (a = ADSR.new) >> @wav
|
16
|
-
a.on; play @one_beat / 2.0
|
17
|
-
a.off; play a.release_time
|
18
|
-
a << @wav
|
19
|
-
end
|
20
|
-
|
21
|
-
4.times do
|
22
|
-
spork("beat 1") { beat }; spork("smash") { smash }
|
23
|
-
play @one_beat
|
24
|
-
|
25
|
-
spork("beat 2") { beat }
|
26
|
-
play @one_beat
|
27
|
-
|
28
|
-
spork("beat 3") { beat }
|
29
|
-
play @one_beat
|
30
|
-
|
31
|
-
spork("beat 4") { beat }
|
32
|
-
play @one_beat
|
33
|
-
end
|
34
|
-
|
35
|
-
smash(5.seconds)
|
data/examples/ugen/ex08.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# An experiment with formants
|
2
|
-
# http://en.wikipedia.org/wiki/Formant
|
3
|
-
|
4
|
-
wav = WavOut.new(:filename => "ex08.wav")
|
5
|
-
ramps = (1..4).map { Ramp.new(:duration => 50.ms) }
|
6
|
-
oscillators = (1..4).map { SinOsc.new }
|
7
|
-
[oscillators >> wav, ramps] >> blackhole
|
8
|
-
|
9
|
-
(0..3).each { |i| oscillators[i].freq = L{ ramps[i].last } }
|
10
|
-
|
11
|
-
#vowel_ah = [1000, 1400]
|
12
|
-
#vowel_eh = [500, 2300]
|
13
|
-
#vowel_oh = [500, 1000]
|
14
|
-
vowel_ee = [[320, 1.0], [2500, 1.0], [3200, 1.0], [4600, 0.6]]
|
15
|
-
vowel_oo = [[320, 1.0], [800, 0.3], [2500, 0.1], [3300, 0.1]]
|
16
|
-
|
17
|
-
5.times do
|
18
|
-
[vowel_ee, vowel_oo].each do |vowel|
|
19
|
-
puts "doing #{vowel.inspect}"
|
20
|
-
(0..3).each do |i|
|
21
|
-
ramps[i].reset
|
22
|
-
ramps[i].from = ramps[i].to
|
23
|
-
ramps[i].to = vowel[i].first
|
24
|
-
oscillators[i].gain = vowel[i].last / 4.0
|
25
|
-
end
|
26
|
-
play 1.second
|
27
|
-
end
|
28
|
-
end
|
data/examples/ugen/ex09.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# run ex01.rb first (or, preferably, use way better input than ex01.wav)
|
2
|
-
|
3
|
-
=begin
|
4
|
-
https://lists.cs.princeton.edu/pipermail/chuck-users/2008-May/002983.html
|
5
|
-
|
6
|
-
> One way of subjectively "widening" a stereo image is to do the following:
|
7
|
-
> feed the left channel back to the right with a short delay, inverted;
|
8
|
-
> feed the right channel back to the left with a short delay, inverted;
|
9
|
-
=end
|
10
|
-
|
11
|
-
mix = 0.5
|
12
|
-
|
13
|
-
wavin = WavIn.new :filename => "ex01.wav", :gain => (1.0 - mix)
|
14
|
-
wavout = WavOut.new :filename => "ex09.wav", :num_channels => 2
|
15
|
-
|
16
|
-
wavin.out(0) >> (delayed_left = Delay.new :time => 10.ms, :gain => mix)
|
17
|
-
wavin.out(1) >> (delayed_right = Delay.new :time => 10.ms, :gain => mix)
|
18
|
-
inverted_left = Step.new :value => L{ -delayed_left.next(now) }
|
19
|
-
inverted_right = Step.new :value => L{ -delayed_right.next(now) }
|
20
|
-
|
21
|
-
wavout >> blackhole
|
22
|
-
[wavin.out(0), inverted_right] >> wavout.in(0)
|
23
|
-
[wavin.out(1), inverted_left ] >> wavout.in(1)
|
24
|
-
|
25
|
-
play wavin.duration
|
26
|
-
puts "processed #{wavin.duration/SAMPLE_RATE} seconds"
|
data/examples/ugen/ex10.rb
DELETED
data/examples/ugen/ex11.rb
DELETED
data/examples/ugen/ex12.rb
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
# adds 60 Hz hum to a stereo wav file
|
2
|
-
|
3
|
-
wavin = WavIn.new :filename => "ex11.wav", :gain => 0.5
|
4
|
-
wavout = WavOut.new :filename => "ex12.wav", :num_channels => 2
|
5
|
-
wavin >> wavout
|
6
|
-
SinOsc.new(:freq => 60, :gain => 0.5) >> wavout
|
7
|
-
wavout >> blackhole
|
8
|
-
|
9
|
-
play 3.seconds
|
data/lib/ruck/bench.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
|
2
|
-
SAMPLE_RATE = 44100
|
3
|
-
|
4
|
-
if ARGV.include? "bench.rb"
|
5
|
-
# benchmark UGens with shreduling
|
6
|
-
|
7
|
-
TIME = 1.seconds
|
8
|
-
count = 0
|
9
|
-
puts "Simulating #{TIME / 1.second} seconds"
|
10
|
-
loop do
|
11
|
-
Step.new >> blackhole
|
12
|
-
count += 1
|
13
|
-
|
14
|
-
start = Time.now
|
15
|
-
play TIME
|
16
|
-
time = Time.now - start
|
17
|
-
puts "#{count}: #{time}"
|
18
|
-
|
19
|
-
break if time > (TIME / 1.second)
|
20
|
-
end
|
21
|
-
else
|
22
|
-
# benchmark UGens without shreduling
|
23
|
-
|
24
|
-
require "ruck"
|
25
|
-
TIME = 1.seconds
|
26
|
-
dac = Ruck::InChannel.new
|
27
|
-
count = 0
|
28
|
-
@now = 0
|
29
|
-
puts "Simulating #{TIME / 1.second} seconds"
|
30
|
-
loop do
|
31
|
-
Ruck::Generators::Step.new >> dac
|
32
|
-
count += 1
|
33
|
-
|
34
|
-
start = Time.now
|
35
|
-
TIME.to_i.times do
|
36
|
-
dac.next(@now)
|
37
|
-
@now += 1
|
38
|
-
end
|
39
|
-
time = Time.now - start
|
40
|
-
puts "#{count}: #{time}"
|
41
|
-
|
42
|
-
break if time > (TIME / 1.second)
|
43
|
-
end
|
44
|
-
end
|