smf 0.15.12
Sign up to get free protection for your applications and to get access to all the features.
- data/MANUAL +172 -0
- data/MANUAL.en +135 -0
- data/MANUAL.en.html +150 -0
- data/MANUAL.en.rd +144 -0
- data/MANUAL.html +201 -0
- data/MANUAL.rd +179 -0
- data/README +33 -0
- data/README.en +33 -0
- data/lib/smf.rb +736 -0
- data/lib/smf/divert.rb +21 -0
- data/lib/smf/io.rb +1278 -0
- data/lib/smf/toy/beatmap.rb +73 -0
- data/lib/smf/toy/gm.rb +327 -0
- data/lib/smf/toy/groove.rb +34 -0
- data/lib/smf/toy/macro.rb +282 -0
- data/lib/smf/toy/macro/mml.rb +34 -0
- data/lib/smf/toy/macro/mml/parser.rb +545 -0
- data/lib/smf/toy/macro/mml/parser.ry +239 -0
- data/lib/smf/toy/macro/stt.rb +33 -0
- data/lib/smf/toy/morse.rb +126 -0
- data/lib/smf/toy/quantize.rb +32 -0
- data/lib/smf/toy/rmi.rb +29 -0
- data/lib/smf/toy/searchsegment.rb +24 -0
- data/lib/smf/toy/shuffle.rb +39 -0
- data/lib/smf/toy/tempomap.rb +75 -0
- data/lib/smf/toy/text.rb +369 -0
- data/lib/smf/toy/velcomp.rb +42 -0
- data/lib/smf/toy/virtual.rb +118 -0
- data/lib/smf/toy/xml.rb +377 -0
- data/sample/Makefile +58 -0
- data/sample/bwv772.mid +0 -0
- data/sample/bwv772.mml +94 -0
- data/sample/bwv775.mid +0 -0
- data/sample/bwv775.mml +157 -0
- data/sample/bwv787.mid +0 -0
- data/sample/bwv787.mml +129 -0
- data/sample/groove.grv +33 -0
- data/sample/groove.rb +45 -0
- data/sample/ltvddpd2.mid +0 -0
- data/sample/ltvddpd2.stt +60 -0
- data/sample/merge.rb +38 -0
- data/sample/mml-samp.rb +19 -0
- data/sample/mml.rb +36 -0
- data/sample/morse-samp.rb +11 -0
- data/sample/morse.rb +31 -0
- data/sample/play-oss.rb +215 -0
- data/sample/play-oss2.rb +253 -0
- data/sample/play-oss3.rb +150 -0
- data/sample/play-spkr.rb +97 -0
- data/sample/play-win.rb +195 -0
- data/sample/quantize.rb +41 -0
- data/sample/rand1.rb +21 -0
- data/sample/rand2.rb +24 -0
- data/sample/rmi2smf.rb +26 -0
- data/sample/shuffle.rb +43 -0
- data/sample/smf2rmi.rb +26 -0
- data/sample/smf2smf.rb +26 -0
- data/sample/smf2text.rb +27 -0
- data/sample/smf2wav.rb +123 -0
- data/sample/smf2xml.rb +27 -0
- data/sample/split.rb +40 -0
- data/sample/stt-samp.rb +19 -0
- data/sample/stt.rb +36 -0
- data/sample/text2smf.rb +28 -0
- data/sample/velcomp.rb +45 -0
- data/sample/virtual-samp.rb +19 -0
- data/sample/xml2smf.rb +28 -0
- metadata +128 -0
data/sample/groove.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# groove.rb: Written by Tadayoshi Funaba 2005,2006
|
4
|
+
# $Id: groove.rb,v 1.3 2006-11-10 21:57:06+09 tadf Exp $
|
5
|
+
|
6
|
+
require 'smf'
|
7
|
+
require 'smf/toy/groove'
|
8
|
+
require 'gopt'
|
9
|
+
include SMF
|
10
|
+
|
11
|
+
def usage
|
12
|
+
warn 'usage: groove [-o output] [-a amount] groove [input]'
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
|
16
|
+
usage unless opt = Gopt.gopt('o:a:')
|
17
|
+
usage unless $*.size >= 1 && $*.size <= 2
|
18
|
+
|
19
|
+
pat = $*.shift
|
20
|
+
|
21
|
+
ifile = $*.shift
|
22
|
+
ifile = nil if ifile == '-'
|
23
|
+
|
24
|
+
ofile = opt[:o] if opt[:o]
|
25
|
+
ofile ||= File.basename(ifile, '.mid') + '-groove.mid' if ifile
|
26
|
+
ofile = nil if ofile == '-'
|
27
|
+
|
28
|
+
amount = (opt[:a] || '0.5').to_f
|
29
|
+
|
30
|
+
sq = unless ifile then Sequence.read($stdin) else Sequence.load(ifile) end
|
31
|
+
|
32
|
+
sp = IO.read(pat).scan(/\S+/).collect{|x| x.to_f}
|
33
|
+
gr = Groove.new(sq.division, sp)
|
34
|
+
gr.amount = amount
|
35
|
+
|
36
|
+
sq.each do |tr|
|
37
|
+
tr.pop
|
38
|
+
tr.each do |ev|
|
39
|
+
case ev
|
40
|
+
when NoteOff, NoteOn
|
41
|
+
gr.groove(ev)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
unless ofile then sq.write($stdout) else sq.save(ofile) end
|
data/sample/ltvddpd2.mid
ADDED
Binary file
|
data/sample/ltvddpd2.stt
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
"sq:Les trois valses distingu\351es du pr\351cieux d\351go\373t\351 \
|
2
|
+
II. Son binocle"
|
3
|
+
|
4
|
+
{
|
5
|
+
ti=1,4 te=240 gm=1
|
6
|
+
|
7
|
+
q r
|
8
|
+
}
|
9
|
+
|
10
|
+
{
|
11
|
+
ti=1,4 te=80 pr=0 co91=96 oc=4 du=1 ve=4/10
|
12
|
+
|
13
|
+
��'��'���������饷���饷���饷��'��'����'��'����'��'����
|
14
|
+
|
15
|
+
����'���������饽�����ե����������ե����������ե���������������������������
|
16
|
+
|
17
|
+
��'�饷����'��'��'��'�����'��
|
18
|
+
|
19
|
+
�åå�,�ɡ��ߡ��ɡ��ߡ��ɡ��ߡ���
|
20
|
+
|
21
|
+
�ååߥ쥽�ߥ쥽�ߥ졼
|
22
|
+
|
23
|
+
��'��'���������饷���饷���� te*=15/16 ve*=2/3
|
24
|
+
�ե���'��������& ��'��������& �ɡ�''��������& �ե���''��������
|
25
|
+
}&
|
26
|
+
|
27
|
+
{
|
28
|
+
oc=3 du=1 ve=3/10
|
29
|
+
|
30
|
+
��
|
31
|
+
�� ��'��& �ե���'�� ��' ��'��& ��'��
|
32
|
+
�� ��'��& �ե���'�� ��' ��'��& ��'��
|
33
|
+
�� ��'��& �ե���'�� ��' ��'��& ��'��
|
34
|
+
�� ��'��& �ե���'�� ��' ��'��& ��'��
|
35
|
+
|
36
|
+
�� ����& ���'�� �� ����& ��'��
|
37
|
+
�� ����& ���'�� �� ����& ��'��
|
38
|
+
�� ����& ���'�� �� ����& ��'��
|
39
|
+
�� ����& ���'�� �� ����& ��'��
|
40
|
+
|
41
|
+
�ե� ��'��& ��'�� ���� ��'��& �ե�'��
|
42
|
+
�ե� ��'��& ��'�� ���� ��'��& �ե�'��
|
43
|
+
|
44
|
+
{ve*=8/10 ��, �ߡ�& ������ �� �ߡ�& �顼
|
45
|
+
��, �ߡ�& ������ �� �ߡ�& �顼}
|
46
|
+
|
47
|
+
�ե�, �ɡ�& �ߡ� ����, �ɡ�& �ե���
|
48
|
+
�ե�, �ɡ�& �ߡ� ����, �ɡ�& �ե���
|
49
|
+
|
50
|
+
�� ��'��& �ե���'�� ��' ��'��& ��'��
|
51
|
+
�� ��'��& �ե���'�� ��' ��'��& ��'��
|
52
|
+
|
53
|
+
ve*=2/3 ��'��������
|
54
|
+
}
|
55
|
+
|
56
|
+
{
|
57
|
+
ti=1,4 te=240
|
58
|
+
|
59
|
+
q r
|
60
|
+
}
|
data/sample/merge.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# merge.rb: Written by Tadayoshi Funaba 1999-2006
|
4
|
+
# $Id: merge.rb,v 1.10 2006-11-10 21:57:06+09 tadf Exp $
|
5
|
+
|
6
|
+
require 'smf'
|
7
|
+
require 'smf/divert'
|
8
|
+
require 'gopt'
|
9
|
+
include SMF
|
10
|
+
|
11
|
+
def usage
|
12
|
+
warn 'usage: merge [-o output] [input]'
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
|
16
|
+
usage unless opt = Gopt.gopt('o:')
|
17
|
+
usage unless $*.size >= 0 && $*.size <= 1
|
18
|
+
|
19
|
+
ifile = $*.shift
|
20
|
+
ifile = nil if ifile == '-'
|
21
|
+
|
22
|
+
ofile = opt[:o] if opt[:o]
|
23
|
+
ofile ||= File.basename(ifile, '.mid') + '-merge.mid' if ifile
|
24
|
+
ofile = nil if ofile == '-'
|
25
|
+
|
26
|
+
sq = unless ifile then Sequence.read($stdin) else Sequence.load(ifile) end
|
27
|
+
nsq = Sequence.new(0, sq.division, sq.tc)
|
28
|
+
eot = []
|
29
|
+
sq.each do |tr|
|
30
|
+
tr.divert(nsq) do |ev|
|
31
|
+
case ev
|
32
|
+
when EndOfTrack; eot << ev; nil
|
33
|
+
else; 0
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
nsq[0] << eot.max unless eot.empty?
|
38
|
+
unless ofile then nsq.write($stdout) else nsq.save(ofile) end
|
data/sample/mml-samp.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# mml-samp.rb: Written by Tadayoshi Funaba 2005
|
4
|
+
# $Id: mml-samp.rb,v 1.1 2005-07-17 17:16:18+09 tadf Exp $
|
5
|
+
|
6
|
+
require 'smf/toy/macro/mml'
|
7
|
+
include SMF
|
8
|
+
|
9
|
+
sq = Sequence.new
|
10
|
+
mm = MML.new(sq)
|
11
|
+
mm << 'gm=1 r ch=0 pr=0'
|
12
|
+
12.times do
|
13
|
+
mm << "{q c# h c# q r}&"
|
14
|
+
mm << "{q d# h d# q r}&"
|
15
|
+
mm << "{q a h a q r}"
|
16
|
+
mm << "oc += 1/12"
|
17
|
+
end
|
18
|
+
mm.generate
|
19
|
+
sq.save('mml-samp.mid')
|
data/sample/mml.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# mml.rb: Written by Tadayoshi Funaba 1999-2006
|
4
|
+
# $Id: mml.rb,v 1.4 2006-11-10 21:57:06+09 tadf Exp $
|
5
|
+
|
6
|
+
require 'smf/toy/macro/mml'
|
7
|
+
require 'gopt'
|
8
|
+
include SMF
|
9
|
+
|
10
|
+
def usage
|
11
|
+
warn 'usage: mml [-o output] [-e command] [input]'
|
12
|
+
exit 1
|
13
|
+
end
|
14
|
+
|
15
|
+
usage unless opt = Gopt.gopt('o:e:')
|
16
|
+
usage unless $*.size >= 0 && $*.size <= 1
|
17
|
+
|
18
|
+
ifile = $*.shift
|
19
|
+
ifile = nil if ifile == '-'
|
20
|
+
|
21
|
+
ofile = opt[:o] if opt[:o]
|
22
|
+
ofile ||= File.basename(ifile, '.mml') + '.mid' if ifile
|
23
|
+
ofile = nil if ofile == '-'
|
24
|
+
|
25
|
+
so = opt[:e] if opt[:e]
|
26
|
+
so ||= unless ifile then $stdin.read else IO.read(ifile) end
|
27
|
+
sq = Sequence.new(1, 480)
|
28
|
+
mm = MML.new(sq)
|
29
|
+
mm << so
|
30
|
+
begin
|
31
|
+
mm.generate
|
32
|
+
rescue ParseError
|
33
|
+
warn format('%s: %s', (opt[:e] && '-e') || ifile || '(stdin)', $!)
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
unless ofile then sq.write($stdout) else sq.save(ofile) end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# morse-samp.rb: Written by Tadayoshi Funaba 2005
|
2
|
+
# $Id: morse-samp.rb,v 1.2 2005-07-17 17:16:18+09 tadf Exp $
|
3
|
+
|
4
|
+
require 'smf/toy/morse'
|
5
|
+
include SMF
|
6
|
+
|
7
|
+
sq = Sequence.new
|
8
|
+
mo = Morse.new(sq)
|
9
|
+
mo << 'hello world'
|
10
|
+
mo.generate
|
11
|
+
sq.save('morse-samp.mid')
|
data/sample/morse.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# morse.rb: Written by Tadayoshi Funaba 2005,2006
|
4
|
+
# $Id
|
5
|
+
|
6
|
+
require 'smf/toy/morse'
|
7
|
+
require 'gopt'
|
8
|
+
include SMF
|
9
|
+
|
10
|
+
def usage
|
11
|
+
warn 'usage: morse [-o output] [-e message] [input]'
|
12
|
+
exit 1
|
13
|
+
end
|
14
|
+
|
15
|
+
usage unless opt = Gopt.gopt('o:e:')
|
16
|
+
usage unless $*.size >= 0 && $*.size <= 1
|
17
|
+
|
18
|
+
ifile = $*.shift
|
19
|
+
ifile = nil if ifile == '-'
|
20
|
+
|
21
|
+
ofile = opt[:o] if opt[:o]
|
22
|
+
ofile ||= File.basename(ifile, '.txt') + '.mid' if ifile
|
23
|
+
ofile = nil if ofile == '-'
|
24
|
+
|
25
|
+
so = opt[:e] if opt[:e]
|
26
|
+
so ||= unless ifile then $stdin.read else IO.read(ifile) end
|
27
|
+
sq = Sequence.new
|
28
|
+
mo = Morse.new(sq)
|
29
|
+
mo << so
|
30
|
+
mo.generate
|
31
|
+
unless ofile then sq.write($stdout) else sq.save(ofile) end
|
data/sample/play-oss.rb
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# play-oss.rb: Written by Tadayoshi Funaba 1999-2006
|
4
|
+
# $Id: play-oss.rb,v 1.23 2006-11-10 21:57:06+09 tadf Exp $
|
5
|
+
|
6
|
+
require 'smf'
|
7
|
+
require 'smf/toy/tempomap'
|
8
|
+
require 'gopt'
|
9
|
+
include SMF
|
10
|
+
|
11
|
+
module SMF
|
12
|
+
|
13
|
+
class DevSeq < File
|
14
|
+
|
15
|
+
def putbuf(s)
|
16
|
+
@buf ||= ''
|
17
|
+
if @buf.size > 4096
|
18
|
+
dumpbuf
|
19
|
+
end
|
20
|
+
@buf << s
|
21
|
+
end
|
22
|
+
|
23
|
+
def dumpbuf
|
24
|
+
syswrite(@buf)
|
25
|
+
@buf = ''
|
26
|
+
end
|
27
|
+
|
28
|
+
EV_TIMING = 0x81
|
29
|
+
|
30
|
+
def timer_event(ev, parm)
|
31
|
+
putbuf([EV_TIMING, ev, 0, 0, parm].pack('C4I'))
|
32
|
+
end
|
33
|
+
|
34
|
+
private :timer_event
|
35
|
+
|
36
|
+
TMR_START = 4
|
37
|
+
TMR_STOP = 3
|
38
|
+
TMR_WAIT_ABS = 2
|
39
|
+
|
40
|
+
def start_timer() timer_event(TMR_START, 0) end
|
41
|
+
def stop_timer() timer_event(TMR_STOP, 0) end
|
42
|
+
def wait_time(ticks) timer_event(TMR_WAIT_ABS, ticks) end
|
43
|
+
|
44
|
+
SEQ_MIDIPUTC = 5
|
45
|
+
|
46
|
+
def midiout(device, byte)
|
47
|
+
putbuf([SEQ_MIDIPUTC, byte, device, 0].pack('C4'))
|
48
|
+
end
|
49
|
+
|
50
|
+
case RUBY_PLATFORM
|
51
|
+
when /freebsd/
|
52
|
+
SNDCTL_SEQ_CTRLRATE = 0xc0045103
|
53
|
+
SNDCTL_SEQ_NRMIDIS = 0x4004510b
|
54
|
+
SNDCTL_MIDI_INFO = 0xc074510c
|
55
|
+
when /linux/
|
56
|
+
SNDCTL_SEQ_CTRLRATE = 0xc0045103
|
57
|
+
SNDCTL_SEQ_NRMIDIS = 0x8004510b
|
58
|
+
SNDCTL_MIDI_INFO = 0xc074510c
|
59
|
+
else
|
60
|
+
raise 'unknown system'
|
61
|
+
end
|
62
|
+
|
63
|
+
def ctrlrate
|
64
|
+
n = [0].pack('i')
|
65
|
+
ioctl(SNDCTL_SEQ_CTRLRATE, n)
|
66
|
+
n.unpack('i')[0]
|
67
|
+
end
|
68
|
+
|
69
|
+
def nrmidis
|
70
|
+
n = [0].pack('i')
|
71
|
+
ioctl(SNDCTL_SEQ_NRMIDIS, n)
|
72
|
+
n.unpack('i')[0]
|
73
|
+
end
|
74
|
+
|
75
|
+
def midi_info(dev)
|
76
|
+
templ = 'A30x2iLix72'
|
77
|
+
a = [0] * 22
|
78
|
+
a[0] = ''
|
79
|
+
a[1] = dev
|
80
|
+
n = a.pack(templ)
|
81
|
+
ioctl(SNDCTL_MIDI_INFO, n)
|
82
|
+
n.unpack(templ)
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
class Sequence
|
88
|
+
|
89
|
+
class Play < XSCallback
|
90
|
+
|
91
|
+
def initialize(tm, num) @tm, @num = tm, num end
|
92
|
+
|
93
|
+
def header(format, ntrks, division, tc)
|
94
|
+
@sq = DevSeq.open('/dev/sequencer', 'w')
|
95
|
+
puts(@sq.midi_info(@num)[0]) if $VERBOSE
|
96
|
+
unless @num < @sq.nrmidis
|
97
|
+
raise 'device not available'
|
98
|
+
end
|
99
|
+
@ctrlrate = @sq.ctrlrate
|
100
|
+
end
|
101
|
+
|
102
|
+
def track_start() @offset = 0 end
|
103
|
+
|
104
|
+
def delta(delta)
|
105
|
+
@start_timer ||= (@sq.start_timer; true)
|
106
|
+
if delta.nonzero?
|
107
|
+
@offset += delta
|
108
|
+
e = @tm.offset2elapse(@offset)
|
109
|
+
@sq.wait_time((e * @ctrlrate).to_i)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def noteoff(ch, note, vel)
|
114
|
+
@sq.midiout(@num, ch | 0x80)
|
115
|
+
@sq.midiout(@num, note)
|
116
|
+
@sq.midiout(@num, vel)
|
117
|
+
end
|
118
|
+
|
119
|
+
def noteon(ch, note, vel)
|
120
|
+
@sq.midiout(@num, ch | 0x90)
|
121
|
+
@sq.midiout(@num, note)
|
122
|
+
@sq.midiout(@num, vel)
|
123
|
+
end
|
124
|
+
|
125
|
+
def polyphonickeypressure(ch, note, val)
|
126
|
+
@sq.midiout(@num, ch | 0xa0)
|
127
|
+
@sq.midiout(@num, note)
|
128
|
+
@sq.midiout(@num, val)
|
129
|
+
end
|
130
|
+
|
131
|
+
def controlchange(ch, num, val)
|
132
|
+
@sq.midiout(@num, ch | 0xb0)
|
133
|
+
@sq.midiout(@num, num)
|
134
|
+
@sq.midiout(@num, val)
|
135
|
+
end
|
136
|
+
|
137
|
+
def programchange(ch, num)
|
138
|
+
@sq.midiout(@num, ch | 0xc0)
|
139
|
+
@sq.midiout(@num, num)
|
140
|
+
end
|
141
|
+
|
142
|
+
def channelpressure(ch, val)
|
143
|
+
@sq.midiout(@num, ch | 0xd0)
|
144
|
+
@sq.midiout(@num, val)
|
145
|
+
end
|
146
|
+
|
147
|
+
def pitchbendchange(ch, val)
|
148
|
+
@sq.midiout(@num, ch | 0xe0)
|
149
|
+
val += 0x2000
|
150
|
+
lsb = val & 0x7f
|
151
|
+
msb = (val >> 7) & 0x7f
|
152
|
+
@sq.midiout(@num, lsb)
|
153
|
+
@sq.midiout(@num, msb)
|
154
|
+
end
|
155
|
+
|
156
|
+
def channelmodemessage(ch, num, val) controlchange(ch, num, val) end
|
157
|
+
|
158
|
+
private :channelmodemessage
|
159
|
+
|
160
|
+
def allsoundoff(ch) channelmodemessage(ch, 0x78, 0) end
|
161
|
+
def resetallcontrollers(ch) channelmodemessage(ch, 0x79, 0) end
|
162
|
+
def localcontrol(ch, val) channelmodemessage(ch, 0x7a, val) end
|
163
|
+
def allnotesoff(ch) channelmodemessage(ch, 0x7b, 0) end
|
164
|
+
def omnioff(ch) channelmodemessage(ch, 0x7c, 0) end
|
165
|
+
def omnion(ch) channelmodemessage(ch, 0x7d, 0) end
|
166
|
+
def monomode(ch, val) channelmodemessage(ch, 0x7e, val) end
|
167
|
+
def polymode(ch) channelmodemessage(ch, 0x7f, 0) end
|
168
|
+
|
169
|
+
def exclusivefx(data)
|
170
|
+
data.each_byte do |x|
|
171
|
+
@sq.midiout(@num, x)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
private :exclusivefx
|
176
|
+
|
177
|
+
def exclusivef0(data)
|
178
|
+
@sq.midiout(@num, 0xf0)
|
179
|
+
exclusivefx(data)
|
180
|
+
end
|
181
|
+
|
182
|
+
def exclusivef7(data) exclusivefx(data) end
|
183
|
+
|
184
|
+
def result
|
185
|
+
@sq.dumpbuf
|
186
|
+
@sq.stop_timer
|
187
|
+
@sq.close
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
def play(num=0)
|
193
|
+
j = join
|
194
|
+
tm = TempoMap.new(j)
|
195
|
+
WS.new(j, Play.new(tm, num)).read
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
def usage
|
203
|
+
warn 'usage: play-oss [-d num] [input]'
|
204
|
+
exit 1
|
205
|
+
end
|
206
|
+
|
207
|
+
usage unless opt = Gopt.gopt('d:')
|
208
|
+
usage unless $*.size >= 0 && $*.size <= 1
|
209
|
+
file = $*.shift
|
210
|
+
file = nil if file == '-'
|
211
|
+
|
212
|
+
num = (opt[:d] || '0').to_i
|
213
|
+
|
214
|
+
sq = unless file then Sequence.read($stdin) else Sequence.load(file) end
|
215
|
+
sq.play(num)
|