Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
409 lines (352 sloc) 6.4 KB
#
# -=) warp-o-mat (=-
# tune coded/composed by freQvibez
# (c) 2009 Alex Brem
#
# exclusively for why's BloopSaphone
#
# from Farbrausch with ♥
#
module LousyBloopMachine
class Tune
BPM = 67
###
### sequences
###
SEQUENCES = {
:bass => %w^
01 02 01 02 01 02 01 02
01 02 01 02 01 02 01 02
01 02 01 02 01 02 01 02
01 02 01 02 01 02 01 02
^,
:base => %w^
00 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01
^,
:snare => %w^
00 00 00 00 01 01 01 02
01 01 01 02 01 01 01 02
01 01 01 02 01 01 01 02
01 01 01 02 01 01 01 02
^,
:hihat => %w^
00 00 01 01 01 01 01 01
01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01
^,
:rhodes_1 => %w^
00 00 00 00
01 02 03 04
01 02 03 04
01 02 03 04
^,
:rhodes_2 => %w^
00 00 00 00
01 02 03 04
01 02 03 04
01 02 03 04
^,
:rhodes_3 => %w^
00 00 00 00
01 02 03 04
01 02 03 04
01 02 03 04
^,
:rhodes_4 => %w^
00 00 00 00
01 02 03 04
01 02 03 04
01 02 03 04
^,
:silent => %w^
00
00
01
01
^,
:naughty => %w^
00
00
00
01
^
}
###
### patterns
###
PATTERNS = {
:bass => {
01 => %q^
32a1[attack 0.1][sustain 0.05] 32a
32a 32a
32a 32a2
32a1 32a
32a[sustain 0.1] 32a
32a 32a
32a[sustain 0.15] 32a
32a2[sustain 0.1] 32a1
^,
02 => %q^
8 16a[attack 0.2][psweep 0.5][square 0.2] 16a[attack 0.1]
8 16a 16
16a 8 16a
16 16a 16 16a
8 16a 32a 16a 32a
32a 32 16a 32
^
},
:base => {
00 => %q^
1
^,
01 => %q^
8d2 8d 8d 8d
8d 8d 8d 8d
^
},
:snare => {
00 => %q^
1
^,
01 => %q^
8 8a 8 8a
8 8a 8 8a
^,
02 => %q^
8 8a 8 8a
16 16 8a 32 32a[volume 0.05] 16 8a[volume 0.25]
^
},
:hihat => {
00 => %q^
1
^,
01 => %q^
16 16a 16 16a 16 16a 16 16a
16 16a 16 16a 16 16a 16 16a
^
},
:rhodes_1 => {
00 => %q^
1 1
^,
01 => %q^
1c4 1e4
^,
02 => %q^
1c4 1e4
^,
03 => %q^
1d4 1c4
^,
04 => %q^
1e4 1eb4
^
},
:rhodes_2 => {
00 => %q^
1 1
^,
01 => %q^
1e4 1g4
^,
02 => %q^
1e4 1g4
^,
03 => %q^
1g4 1d4
^,
04 => %q^
1gb4 1gb4
^
},
:rhodes_3 => {
00 => %q^
1 1
^,
01 => %q^
1g4 1b4
^,
02 => %q^
1g4 1b4
^,
03 => %q^
1a4 1g4
^,
04 => %q^
1g4 1g4
^
},
:rhodes_4 => {
00 => %q^
1 1
^,
01 => %q^
1b4 1d4
^,
02 => %q^
1b4 1d4
^,
03 => %q^
1c4 1b4
^,
04 => %q^
1c4 1b4
^
},
:silent => {
00 => %q^
1 1 1 1
1 1 1 1
^,
01 => %q^
1b4 1d5
2b4 2g4 1e4
1c4 2gb5 2b4
1c4 1b3
^
},
:naughty => {
00 => %q^
1 1 1 1
1 1 1 1
^,
01 => %q^
2
1b4 1e4
2b3 2d4 2b4
1a4 2gb4 2a3
1eb4 1gb4
^
}
}
end
###
### playroutine
###
require 'yaml'
require './bloops'
extend self
def init
@bloops ||= Bloops.new
@bloops.tempo = Tune::BPM
return if @sounds
@sounds = {}
YAML.load(DATA.read).each do |track,instrument|
@sounds[track] = @bloops.sound instrument['sound'].split("::").inject(Object) { |c1,c2| c1.const_get(c2) }
instrument.reject{|k,v| k == 'sound'}.each do |sound,value|
@sounds[track].send "#{sound}=", value
end
end
Tune::SEQUENCES.each do |track,sequences|
instr = track.to_s.split('_')[0]
next unless @sounds[instr]
next unless Tune::PATTERNS[track]
notes = ''
sequences.each do |seq|
seq = seq.to_i
next unless Tune::PATTERNS[track][seq]
notes << Tune::PATTERNS[track][seq]
end
@bloops.tune @sounds[instr], notes
end
end
def play
init unless @bloops
@bloops.play
sleep 0.05 while !@bloops.stopped?
end
def play_endless
while true do play; end
end
end
LousyBloopMachine.play_endless if $0 == __FILE__
###
### instruments
###
__END__
bass:
sound: Bloops::SQUARE
volume: 0.9
attack: 0.1
decay: 0.15
sustain: 0.05
square: 0.05
phase: 0.5
psweep: -0.255
base:
sound: Bloops::SINE
volume: 0.6
attack: 0.0
decay: 0.25
sustain: 0.15
lpf: 0.45
resonance: 0.4
dslide: -0.3
snare:
sound: Bloops::NOISE
volume: 0.25
attack: 0.01
decay: 0.305
sustain: 0
hpf: 0.65
resonance: 0.24
dslide: -0.452
hihat:
sound: Bloops::NOISE
volume: 0.25
attack: 0.150
decay: 0.105
sustain: 0.205
hpf: 0.95
rhodes:
sound: Bloops::SAWTOOTH
volume: 0.09
attack: 0.55
decay: 1.0
sustain: 0.45
lpf: 0.55
lsweep: -0.005
resonance: 0.35
vibe: 0.035
vspeed: 0.292
phase: 0.305
psweep: -0.025
vdelay: 0.9
silent:
sound: Bloops::SINE
volume: 0.45
attack: 0.35
decay: 0.95
sustain: 0.85
lpf: 0.25
lsweep: -0.025
hpf: 0.25
hsweep: -0.025
resonance: 0.75
vibe: 0.055
vspeed: -0.325
phase: 0.505
psweep: -0.025
naughty:
sound: Bloops::SQUARE
volume: 0.15
attack: 0.45
decay: 0.95
sustain: 0.85
lpf: 0.25
lsweep: -0.025
hpf: 0.25
hsweep: -0.025
resonance: 0.65
vibe: 0.065
vspeed: -0.325
phase: 0.305
psweep: -0.025
square: 0.75
phase: 0.0
psweep: 0.555