Skip to content

Instantly share code, notes, and snippets.

@melborne
Created May 27, 2010 14:25
Show Gist options
  • Save melborne/415859 to your computer and use it in GitHub Desktop.
Save melborne/415859 to your computer and use it in GitHub Desktop.
DSL for bloopaphone
require "bloops"
class BloopSong
def self.init(tempo)
@bloops = Bloops.new
@bloops.tempo = tempo
yield self
self
end
def self.play(opt)
score_set = read_score(DATA)
tunes = opt[:tune]
range_max = score_set[tunes.first].length-1
range =
if !opt[:range]
(0..range_max)
elsif opt[:range].end > range_max || opt[:range].end < 0
(opt[:range].begin..range_max)
else
opt[:range]
end
for i in range
tunes.each do |tune|
@bloops.tune send(tune), score_set[tune][i]
end
@bloops.play
sleep 0.01 until @bloops.stopped?
@bloops.clear
end
end
private
def self.define_class_method(name)
(class << self; self end).module_eval { define_method(name) { yield } }
end
def self.sound(name, type)
self.instance_variable_set("@#{name}", @bloops.sound( Bloops.module_eval(type) ))
define_class_method(name) { self.instance_variable_get("@#{name}") }
yield send(name)
@bloops
end
def self.read_score(score)
q = Hash.new([])
flag = nil
score.each_line do |line|
next if line =~ /^\s*$/
case line
when /^:(\w+)/ then flag = $1
else
q[flag.to_sym] += [line]
end
end
q
end
end
#!/usr/local/bin/ruby
# -*- encoding:utf-8 -*-
require_relative "bloopsong"
mario =
BloopSong.init(216) do |b|
b.sound(:lead, :SQUARE) do |s|
s.volume = 0.4
s.punch = 0.441
s.sustain = 0.067
s.decay = 0.297
s.freq = 0.499
end
b.sound(:lead2, :SQUARE) do |s|
s.volume = 0.4
s.punch = 0.441
s.sustain = 0.067
s.decay = 0.297
s.freq = 0.499
end
b.sound(:base, :SQUARE) do |s|
s.volume = 0.4
s.punch = 0.641
s.sustain = 0.197
s.decay = 0.197
s.freq = 0.499
end
end
mario.play(:range => 0..-1, :tune => [:lead, :lead2, :base])
__END__
:lead
8E5 8E5 8 8E5 8 8C5 4E5 4G5 4 4G4 4 4C5 8 8G4 4 4E4 8 4A4 4B4 8A#4 4A4
6G4 6E5 6G5 4A5 8F5 8G5 8 4E5 8C5 8D5 4B4 8 4C5 8 8G4 4 4E4 8 4A4 4B4 8A#4 4A4
6G4 6E5 6G5 4A5 8F5 8G5 8 4E5 8C5 8D5 4B4 8 4 8G5 8F#5 8F5 4D#5 8E5 8 8G#4 8A4 8C5 8 8A4 8C5 8D5
4 8G5 8F#5 8F5 4D#5 8E5 8 4C6 8C6 4C6 4 4 8G5 8F#5 8F5 4D#5 8E5 8 8G#4 8A4 8C5 8 8A4 8C5 8D5
4 4D#5 8 4D5 8 4C5 4 4 4 4 8G5 8F#5 8F5 4D#5 8E5 8 8G#4 8A4 8C5 8 8A4 8C5 8D5
4 8G5 8F#5 8F5 4D#5 8E5 8 4C6 8C6 4C6 4 4 8G5 8F#5 8F5 4D#5 8E5 8 8G#4 8A4 8C5 8 8A4 8C5 8D5
4 4D#5 8 4D5 8 2C5 2 8C5 4C5 8C5 8 8C5 4D5 8E5 4C5 8A4 4G4 4
8C5 4C5 8C5 8 8C5 8D5 8E5 1 8C5 4C5 8C5 8 8C5 4D5 8E5 4C5 8A4 4G4 4
8E5 8E5 8 8E5 8 8C5 4E5 4G5 4 4G4 4 4C5 8 8G4 4 4E4 8 4A4 4B4 8A#4 4A4
6G4 6E5 6G5 4A5 8F5 8G5 8 4E5 8C5 8D5 4B4 8 4C5 8 8G4 4 4E4 8 4A4 4B4 8A#4 4A4
6G4 6E5 6G5 4A5 8F5 8G5 8 4E5 8C5 8D5 4B4 8 8E5 4C5 8G4 4 4G#4 8A4 4F5 8F5 2A4
6B4 6A5 6A5 6A5 6G5 6F5 8E5 4C5 8A4 2G4 8E5 4C5 8G4 4 4G#4 8A4 4F5 8F5 2A4
8B4 4F5 8F5 6F5 6E5 6D5 2C5 4 4C4 8E5 4C5 8G4 4 4G#4 8A4 4F5 8F5 2A4
6B4 6A5 6A5 6A5 6G5 6F5 8E5 4C5 8A4 2G4 8E5 4C5 8G4 4 4G#4 8A4 4F5 8F5 2A4
8B4 4F5 8F5 6F5 6E5 6D5 2C5 4 4C4 8C5 4C5 8C5 8 8C5 4D5 8E5 4C5 8A4 2G4
8C5 4C5 8C5 8 8C5 8D5 8E5 1 8C5 4C5 8C5 8 8C5 4D5 8E5 4C5 8A4 2G4
8E5 8E5 8 8E5 8 8C5 4E5 4G5 4 4G4 4 8E5 4C5 8G4 4 4G#4 8A4 4F5 8F5 2A4
6B4 6A5 6A5 6A5 6G5 6F5 8E5 4C4 8A4 2G4 8E5 4C5 8G4 4 4G#4 8A4 4F5 8F5 2A4
8B4 4F5 8F5 6F5 6E5 6D5 2C5 4 4C4 4C5 8 4G4 8 4E4 6A4 6B4 6A4 6G#4 6A#4 6G#4
1g
:lead2
8F#4 8F#4 8 8F#4 8 8F#4 4F#4 4G4 4 4G4 4 4E4 8 8E4 4 4C4 8 4C4 4D4 8C#4 4C4
6C4 6E4 6B4 4C5 8A4 8B4 8 4A4 8E4 8F4 4D4 8 4E4 8 8E4 4 4C4 8 4C4 4D4 8C#4 4C4
6C4 6E4 6B4 4C5 8A4 8B4 8 4A4 8E4 8F4 4D4 8 4 8E5 8D#5 8D5 4B4 8C5 8 8E4 8F4 8A4 8 8C4 8E4 8F4
4 8E5 8D#5 8D5 4B4 8C5 8 4G5 8G5 4G5 4 4 8E5 8D#5 8D5 4B4 8C5 8 8E4 8F4 8A4 8 8C4 8E4 8F4
4 4G#4 8 4F4 8 4E4 4 4 4 4 8E5 8D#5 8D5 4B4 8C5 8 8E4 8F4 8A4 8 8C4 8E4 8F4
4 8E5 8D#5 8D5 4B4 8C5 8 4G5 8G5 4G5 4 4 8E5 8D#5 8D5 4B4 8C5 8 8E4 8F4 8A4 8 8C4 8E4 8F4
4 4G#4 8 4F4 8 2E4 2 8G#4 4G#4 8G#4 8 8G#4 4A#4 8G4 4E4 8E4 4C4 4
8G#4 4G#4 8G#4 8 8G#4 8A#4 8G4 1 8G#4 4G#4 8G#4 8 8G#4 4A#4 8G4 4E4 8E4 4C4 4
8F#4 8F#4 8 8F#4 8 8F#4 4F#4 4B4 2 4 4E4 8 8E4 4 4C4 8 4C4 4D4 8C#4 4C4
6C4 6G4 6B4 4C5 8A4 8B4 8 4C4 8E4 8F4 4D4 8 4E4 8 8E4 4 4C4 8 4C4 4D4 8C#4 4C4
6C4 6G4 6B4 4C5 8A4 8B4 8 4C4 8E4 8F4 4D4 8 8C5 4A4 8E4 4 4E4 8F4 4C5 8C5 2F4
6G4 6F5 6F5 6F5 6E5 6D5 8C5 4A4 8F4 2E4 8C5 4A4 8E4 4 4E4 8F4 4C5 8C5 2F4
8G4 4D5 8D5 6D5 6C5 6B4 8G4 4E4 8E4 2 8C5 4A4 8E4 4 4E4 8F4 4C5 8C5 2F4
6G4 6F5 6F5 6F5 6E5 6D5 8C5 4A4 8F4 2E4 8C5 4A4 8E4 4 4E4 8F4 4C5 8C5 2F4
8G4 4D5 8D5 6D5 6C5 6B4 8G4 4E4 8E4 2 8G#4 4G#4 8G#4 8 8G#4 4A#4 8G4 4E4 8E4 4C4 4
8G#4 4G#4 8G#4 8 8G#4 8A#4 8G4 1 8G#4 4G#4 8G#4 8 8G#4 4A#4 8G4 4E4 8E4 4C4 4
8F#4 8F#4 8 8F#4 8 8F#4 4F#4 4B4 2 4 8C5 4A4 8E4 4 4E4 8F4 4C5 8C5 2F4
6G4 6F5 6F5 6F5 6E5 6D5 8C5 4A4 8F4 2E4 8C5 4A4 8E4 4 4E4 8F4 4C5 8C5 2F4
8G4 4D5 8D5 6D5 6C5 6B4 8G4 4E4 8E4 2 4E5 8 4E4 8 4C3 2F4 2F4
8E4 8D4 1E4
:base
8D3 8D3 8 8D3 8 8D3 4D3 4G3 4 4G3 4 4G3 8 8E3 4 4C3 8 4F3 4G3 8F#3 4E3
6E3 6C4 6E4 4F4 8D4 8E4 8 4C4 8A3 8B3 4G3 8 4G3 8 8E3 4 4C3 8 4F3 4G3 8F#3 4E3
6E3 6C4 6E4 4F4 8D4 8E4 8 4C4 8A3 8B3 4G3 8 4C3 8 8G3 4 4C4 4F3 8 8C4 4C4 4F3
4C3 8 8E3 4 8G3 8C4 2 4 4G3 4C3 8 8G3 4 4C4 4F3 8 8C4 4C4 4F3
4C3 4G#3 8 4A#3 8 4C4 8 8G3 4G3 4C3 4C3 8 8G3 4 4C4 4F3 8 8C4 4C4 4F3
4C3 8 8E3 4 8G3 8C4 2 4 4G3 4C3 8 8G3 4 4C4 4F3 8 8C4 4C4 4F3
4C3 4G#3 8 4A#3 8 4C4 8 8G3 4G3 4C3 4G#2 8 8D#3 4 4G#3 4G3 8 8C3 4 4G2
4G#2 8 8B#3 4 4G#3 4G3 8 8C3 4 4G2 4G#2 8 8B#3 4 4G#3 4G3 8 8C3 4 4G2
8D3 8D3 8 8D3 8 8D3 4D3 2 4G3 4 4G3 8 8E3 4 4C3 8 4F3 4G3 8F#3 4C3
6E3 6C4 6E4 4F4 8D4 8E4 8 4C4 8A3 8B3 4G3 8 4G3 8 8E3 4 4C3 8 4E3 4G3 8E#3 4E3
6E3 6C4 6E4 4F4 8D4 8E4 8 4C4 8A3 8B3 4G3 8 4C3 8 8E#3 4G3 4C4 4F3 4F3 8C4 8C4 4F3
3D3 6F3 4G3 4B3 4G3 4G3 8C4 8C4 4G3 4C3 8 8F#3 4G3 4C4 4F3 4F3 8C4 8C4 4F3
8G3 4G3 8G3 6G3 6A3 6B3 4C4 4G3 2C3 4C3 8 8F#3 4G3 4C4 4F3 4F3 8C4 8C4 4F3
3D3 6F3 4G3 4B3 4G3 4G3 8C4 8C4 4G3 4C3 8 8F#3 4G3 4C4 4F3 4F3 8C4 8C4 4F3
8G3 4G3 8G3 6G3 6A3 6B3 4C4 4G3 2C3 4G#2 8 8D#3 4 4G#3 4G3 8 8C3 4 4G2
4G#2 8 8D#3 4 4G#3 4G3 8 8C3 4 4G2 4G#2 8 8D#3 4 4G#3 4G3 8 8C3 4 4G2
8D3 8D3 8 8D3 8 8D3 4D3 2 4G3 4 4C3 8 8F#3 4G3 4C4 4F3 4F3 8C4 8C4 4F3
3D3 6F3 4G3 4B3 4G3 4G3 8C4 8C4 4G3 4C3 8 8F#3 4G3 4C4 4F3 4F3 8C4 8C4 4F3
8G3 4G3 8G3 6G3 6A3 6B3 4C4 4G3 2C3 4G3 8 4E3 8 4C3 2F3 2C#3
1C3
require 'bloops'
bases = Dir["../../sounds/*.blu"]
b = Bloops.new
bases.each do |base|
puts "** playing scale using #{base[/\w+.blu/]}"
sound = b.load base
b.tune sound, "c c# d eb e f f# g ab a bb b + c"
b.play
sleep 1 while !b.stopped?
b.clear
end
#!/usr/local/bin/ruby
# -*- encoding:utf-8 -*-
require_relative "bloopsong"
zelda =
BloopSong.init(120) do |b|
b.sound(:lead, :SQUARE) do |s|
s.volume = 0.5
end
b.sound(:lead2, :SQUARE) do |s|
s.volume = 0.5
end
b.sound(:base, :SQUARE) do |s|
s.volume = 0.5
end
end
zelda.play(:range => 0..-1, :tune => [:lead, :lead2, :base])
__END__
:lead
2A# 12 12 12A# 12A# 12A# 12A# 6A# 12G# 4A# 12 12 12A# 12A# 12A# 12A#
6A# 12G# 4A# 12 12 12A# 12A# 12A# 12A# 8A# 16F 16F 8F 16F 16F 8F 16F 16F 8F 8F
4A# 4F 6 12A# 16A# + 16C 16D 16D# 2F 8 8F 12F 12F# 12G#
+ 2A# 12 12A# 12A# 12A# 12G# 12F# 6G# 12F# 2F 4F
+ 8D# 16D# 16F 2F# 8F 8D# 8C# 16C# 16D# 2F 8D# 8C#
+ 8C 16C 16D 2E 4G 8F - 16F 16F 8F 16F 16F 8F 16F 16F 8F 8F
4A# 4F 6 12A# 16A# + 16C 16D 16D# 2F 8 8F 12F 12F# 12G#
+ 2A# 4 + 4C# 4C - 4A 4 4F
+ 2F# 4 4A# 4A 4F 4 4F
+ 2F# 4 4A# 4A 4F 4 4D
+ 2D# 4 4F# 4F 4C# 4 - 4A#
+ 8C 16C 16D 4E 4 4G 8F - 16F 16F 8F 16F 16F 8F 16F 16F 8F 8F
4A# 4F 6 12A# 16A# + 16C 16D 16D# 2F 8 8F 12F 12F# 12G#
+ 2A# 12 12A# 12A# 12A# 12G# 12F# 6G# 12F# 2F 4F
+ 8D# 16D# 16F 2F# 8F 8D# 8C# 16C# 16D# 2F 8D# 8C#
+ 8C 16C 16D 2E 4G 8F - 16F 16F 8F 16F 16F 8F 16F 16F 8F 8F
4A# 4F 6 12A# 16A# + 16C 16D 16D# 2F 8 8F 12F 12F# 12G#
+ 2A# 4 + 4C# 4C - 4A 4 4F
+ 2F# 4 4A# 4A 4F 4 4F
+ 2F# 4 4A# 4A 4F 4 4D
+ 2D# 4 4F# 4F 4C# 4 - 4A#
+ 8C 16C 16D 4E 4 4G 8F - 16F 16F 8F 16F 16F 8F 16F 16F 8F 8F
:lead2
2D 12 12 12D 12D 12D 12D 6C 12C 4C 4 12C 12C 12C
6C# 12C# 4C# 12 12 12C# 12C# 12C# 12C# 8C# - 16A 16A 8A 16A 16A 8A 16A 16A 8A 8A
4D 12D 12D 12C 6D 12D 16D 16D# 16F 16G 6G# 12A# 16A# + 16C 16D 16D# 4F - 12G# 12A# + 12C
+ 6C# - 12F# 16F# 16G# 16A# + 16C 6D 12D 12D 12C - 12A# + 6C# - 12G# 12G# 12G# 12F# 12G# 6G# 12G# 12G 12G#
8F# 16F# 16F 8F# 16F# 16G# 4A# 8G# 8F# 8F 16F 16D# 8F 16F 16F# 4G# 8F# 8F
4E 8E 16E 16F 8G 16G 16A 8A# + 8C - 8A - 16A 16A 8A 16A 16A 8A 16A 16A 8A 8A
4D 12D 12D 12C 6D 12D 16D 16D# 16F 16G 6G# 12A# 16A# + 16C 16D 16D# 4F - 12G# 12A# + 12C
+ 2C# 4 4E 4D# 4C 4 - 4A
2B 4 + 4C# 4C - 4A 4 4A
2B 4 + 4C# 4C - 4A 4 4A
2F# 4 + 4B# - 4A# 4F 4 4C#
4E 8E 16E 16F 8G 16G 16A 8A# + 8C - 8A - 16A 16A 8A 16A 16A 8A 16A 16A 8A 8A
4D 12D 12D 12C 6D 12D 16D 16D# 16F 16G 6G# 12A# 16A# + 16C 16D 16D# 4F - 12G# 12A# + 12C
+ 6C# - 12F# 16F# 16G# 16A# + 16C 6D 12D 12D 12C - 12A# + 6C# - 12G# 12G# 12G# 12F# 12G# 6G# 12G# 12G 12G#
8F# 16F# 16F 8F# 16F# 16G# 4A# 8G# 8F# 8F 16F 16D# 8F 16F 16F# 4G# 8F# 8F
4E 8E 16E 16F 8G 16G 16A 8A# + 8C - 8A - 16A 16A 8A 16A 16A 8A 16A 16A 8A 8A
4D 12D 12D 12C 6D 12D 16D 16D# 16F 16G 6G# 12A# 16A# + 16C 16D 16D# 4F - 12G# 12A# + 12C
+ 2C# 4 4E 4D# 4C 4 - 4A
2B 4 + 4C# 4C - 4A 4 4A
2B 4 + 4C# 4C - 4A 4 4A
2F# 4 + 4B# - 4A# 4F 4 4C#
4E 8E 16E 16F 8G 16G 16A 8A# + 8C - 8A - 16A 16A 8A 16A 16A 8A 16A 16A 8A 8A
:base
- 4A# 12A# 12A# 12A# 4A# 12A# 12A# 12A# 4G# 12G# 12G# 12G# 4G# 12G# 12G# 12G#
- 4F# 12F# 12F# 12F# 4F# 12F# 12F# 12F# 4F 4F 4F 8G 8A
- 4A# 12A# 12A# 12G# 4A# 4A# 4G# 12G# 12G# 12F# 4G# 4G#
- 4F# 12F# 12F# 12E# 4F# 4F# + 4C# 12C# 12C# 12C 4C# 4C#
- 4B 12B 12B 12A# 4B 12B 12B 12B 4A# 12A# 12A# 12G# 4A# 12A# 12A# 12A#
4C 12C 12C - 12B + 4C 12C 12C 12C - 4F 4F 4F 8G 8A
- 4A# 12A# 12A# 12G# 4A# 4A# 4G# 12G# 12G# 12F# 4G# 4G#
- 4F# 12F# 12F# 12E# 4F# 4F# 4F 12F 12F 12D# 4F 4F
- 12E 12A# + 12C# 12E 12A# + 12C# 4E 4 4F -- 12F 12F 12F 4F 4
- 12E 12A# + 12C# 12E 12A# + 12C# 4E 4 4F -- 12F 12F 12F 4F 4
- 4B 12B 12B 12A# 4B 12B 12B 12B 4A# 12A# 12A# 12G# 4A# 12A# 12A# 12A#
4C 12C 12C - 12B + 4C 12C 12C 12C - 4F 4F 4F 8G 8A
- 4A# 12A# 12A# 12G# 4A# 4A# 4G# 12G# 12G# 12F# 4G# 4G#
- 4F# 12F# 12F# 12E# 4F# 4F# + 4C# 12C# 12C# 12C 4C# 4C#
- 4B 12B 12B 12A# 4B 12B 12B 12B 4A# 12A# 12A# 12G# 4A# 12A# 12A# 12A#
4C 12C 12C - 12B + 4C 12C 12C 12C - 4F 4F 4F 8G 8A
- 4A# 12A# 12A# 12G# 4A# 4A# 4G# 12G# 12G# 12F# 4G# 4G#
- 4F# 12F# 12F# 12E# 4F# 4F# 4F 12F 12F 12D# 4F 4F
- 12E 12A# + 12C# 12E 12A# + 12C# 4E 4 4F -- 12F 12F 12F 4F 4
- 12E 12A# + 12C# 12E 12A# + 12C# 4E 4 4F -- 12F 12F 12F 4F 4
- 4B 12B 12B 12A# 4B 12B 12B 12B 4A# 12A# 12A# 12G# 4A# 12A# 12A# 12A#
4C 12C 12C - 12B + 4C 12C 12C 12C - 4F 4F 4F 8G 8A
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment