smml 0.1.1 → 0.1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/smml/msm.rb +122 -43
- data/lib/smml/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f74a9766abd50fb796e9df2a78d248b23005f6e
|
4
|
+
data.tar.gz: 0210dcb9aa9e45746f97c03b33d47da43d28065c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2758b65b3eed4fc493e623d5e6ccbb0650b4a0ce408d767e29ff7dd47a5427c16cc7870a97bc63aee1eee6a1f8176b30418341eece1db314a7864d38325a2aae
|
7
|
+
data.tar.gz: 92efb48db8b72f629556a4bd6c633d45b8d3beb528150760ace8dad285a7426f76d9ca84a846e08bdfb642c2e3f382da3c40a10afcd63049c318703610740197
|
data/lib/smml/msm.rb
CHANGED
@@ -5,12 +5,21 @@ require 'optparse'
|
|
5
5
|
|
6
6
|
$debuglevel=0
|
7
7
|
|
8
|
-
def
|
9
|
-
cmd=
|
8
|
+
def hintminimum
|
9
|
+
cmd="smml"
|
10
10
|
puts "Smml v#{Smml::VERSION}"
|
11
11
|
puts <<EOF
|
12
|
-
usage:
|
13
|
-
|
12
|
+
usage:
|
13
|
+
data to mid
|
14
|
+
#{cmd} -d \"cdef gabc cbag rfed c4\" -o outfile.mid
|
15
|
+
file to mid
|
16
|
+
#{cmd} -i infile.txt -o outfile.mid
|
17
|
+
show syntax
|
18
|
+
#{cmd} -s
|
19
|
+
EOF
|
20
|
+
end
|
21
|
+
def showsyntax
|
22
|
+
puts <<EOF
|
14
23
|
|
15
24
|
syntax: ...( will be changed time after time)
|
16
25
|
abcdefg =tone; capital letters are sharps. followed by number as length.
|
@@ -101,6 +110,10 @@ syntax: ...( will be changed time after time)
|
|
101
110
|
and other commands are with parentheses.
|
102
111
|
EOF
|
103
112
|
end
|
113
|
+
def hint
|
114
|
+
hintminimum
|
115
|
+
showsyntax
|
116
|
+
end
|
104
117
|
|
105
118
|
1.round(2) rescue (
|
106
119
|
class Float
|
@@ -118,6 +131,13 @@ class Fixnum
|
|
118
131
|
end
|
119
132
|
end
|
120
133
|
)
|
134
|
+
[].rotate rescue (
|
135
|
+
class Array
|
136
|
+
def rotate
|
137
|
+
self.size>0 ? self[1..-1]+self[0..0] : []
|
138
|
+
end
|
139
|
+
end
|
140
|
+
)
|
121
141
|
def multilineTrim l,com
|
122
142
|
r=[]
|
123
143
|
on=false
|
@@ -145,9 +165,18 @@ class String
|
|
145
165
|
def setcmark c
|
146
166
|
@@cmark=c
|
147
167
|
end
|
168
|
+
def setpagesep c
|
169
|
+
@@pagesep=c
|
170
|
+
end
|
171
|
+
def settracksep c
|
172
|
+
@@tracksep=c
|
173
|
+
end
|
148
174
|
def cmark
|
149
175
|
@@cmark
|
150
176
|
end
|
177
|
+
def pagesep
|
178
|
+
@@pagesep
|
179
|
+
end
|
151
180
|
def commentoff ofs="",com=@@cmark
|
152
181
|
lines=self.split("\n")
|
153
182
|
d=multilineTrim(lines,com)
|
@@ -157,7 +186,7 @@ class String
|
|
157
186
|
def sharp2cmark
|
158
187
|
self.gsub!("#"){@@cmark}
|
159
188
|
end
|
160
|
-
def tracksep pspl
|
189
|
+
def tracksep pspl=@@pagesep
|
161
190
|
tracks={}
|
162
191
|
pages=self.split(/#{pspl}+/)
|
163
192
|
markc=0
|
@@ -167,7 +196,7 @@ class String
|
|
167
196
|
tracks.values.each{|v| v << p }
|
168
197
|
markc+=1
|
169
198
|
else
|
170
|
-
p.split(
|
199
|
+
p.split(@@tracksep).each_with_index{|t,i|
|
171
200
|
if tracks[i]
|
172
201
|
tracks[i] << t
|
173
202
|
else
|
@@ -200,7 +229,7 @@ class Array
|
|
200
229
|
end
|
201
230
|
class Notes < Hash
|
202
231
|
@@rythmChannel=9
|
203
|
-
@@
|
232
|
+
@@notes={
|
204
233
|
"c"=>0,
|
205
234
|
"C"=>1,
|
206
235
|
"d"=>2,
|
@@ -217,17 +246,17 @@ class Notes < Hash
|
|
217
246
|
"s"=>[3,@@rythmChannel],
|
218
247
|
"u"=>[6,@@rythmChannel]
|
219
248
|
}
|
220
|
-
@@invert=@@
|
249
|
+
@@invert=@@notes.invert
|
221
250
|
@@octave=12
|
222
251
|
def initialize
|
223
|
-
@@
|
252
|
+
@@notes.each{|k,v|self[k]=v}
|
224
253
|
end
|
225
|
-
def self.get last,
|
254
|
+
def self.get last,dist=0
|
226
255
|
last=~/(\-*)(\+*)([[:alpha:]])/
|
227
256
|
oct=$1.size*(-1)+$2.size
|
228
257
|
last=$3
|
229
|
-
lastnote=@@
|
230
|
-
num=lastnote+
|
258
|
+
lastnote=@@notes[last]+oct*@@octave
|
259
|
+
num=lastnote+dist.to_i
|
231
260
|
octave= num / @@octave
|
232
261
|
pre=if octave>0
|
233
262
|
"+"*octave
|
@@ -243,6 +272,25 @@ class ScaleNotes < Array
|
|
243
272
|
def setSampleRate c
|
244
273
|
@samplerate=c
|
245
274
|
end
|
275
|
+
def modeinit
|
276
|
+
return if defined?(@@mode)
|
277
|
+
s=[:ionian,:dorian,:phrygian,:lydian,:mixolydian,:aeorian,:locrian,:ionian]
|
278
|
+
@@mode={}
|
279
|
+
@@mode[:ionian]=[0,2,4,5,7,9,11]
|
280
|
+
6.times{|i|
|
281
|
+
tmp=@@mode[s[i]].rotate
|
282
|
+
root=tmp[0]
|
283
|
+
tmp=tmp.map{|t|(t-root+12)%12}
|
284
|
+
@@mode[s[i+1]]=tmp
|
285
|
+
}
|
286
|
+
end
|
287
|
+
def keys
|
288
|
+
@@mode.keys
|
289
|
+
end
|
290
|
+
def setmode first,mode=:ionian
|
291
|
+
self<<first
|
292
|
+
@@mode[mode][1..-1].each{|i|self<<Notes.get(first,"+#{i}")}
|
293
|
+
end
|
246
294
|
# todo: use sample rate
|
247
295
|
def sample
|
248
296
|
self[rand(self.size)]
|
@@ -255,6 +303,7 @@ class ScaleNotes < Array
|
|
255
303
|
end
|
256
304
|
end
|
257
305
|
def reset
|
306
|
+
modeinit
|
258
307
|
initialize
|
259
308
|
end
|
260
309
|
end
|
@@ -769,6 +818,9 @@ class MarkTrack
|
|
769
818
|
@diff
|
770
819
|
end
|
771
820
|
end
|
821
|
+
def guitarTuning
|
822
|
+
%W[-e -a d g b +e]
|
823
|
+
end
|
772
824
|
module MidiHex
|
773
825
|
# 設定のため最初に呼ばなければならない
|
774
826
|
def self.prepare bpm=120,tbase=480,vel=0x40,oct=:near,vfuzzy=2
|
@@ -797,8 +849,9 @@ module MidiHex
|
|
797
849
|
@bendrange=2
|
798
850
|
@bendCent=1
|
799
851
|
@pancenter=64
|
800
|
-
@scalenotes=ScaleNotes.new
|
801
|
-
@
|
852
|
+
@scalenotes=ScaleNotes.new.reset
|
853
|
+
@gtune=guitarTuning
|
854
|
+
@prepareSet=[@tbase,@ch,@velocity,@velocityFuzzy,@basekey,@gateRate,@bendrange,@bendCent,@scalenotes,@gtune]
|
802
855
|
@chmax=15
|
803
856
|
@bendrangemax=127
|
804
857
|
file="midi-programChange-list.txt"
|
@@ -808,6 +861,13 @@ module MidiHex
|
|
808
861
|
pfile=File.expand_path(pfile,base) if not File.exist?(pfile)
|
809
862
|
self.loadProgramChange(file)
|
810
863
|
self.loadPercussionMap(pfile)
|
864
|
+
self.dumpstatus if $DEBUG && $debuglevel>3
|
865
|
+
end
|
866
|
+
def self.dumpstatus
|
867
|
+
self.instance_variables.each{|i|
|
868
|
+
val=self.instance_variable_get(i)
|
869
|
+
p [i, val] if "#{val}".size<100
|
870
|
+
}
|
811
871
|
end
|
812
872
|
def self.setmidiname name
|
813
873
|
@midiname=name
|
@@ -834,7 +894,7 @@ module MidiHex
|
|
834
894
|
@data
|
835
895
|
end
|
836
896
|
def self.setdata d
|
837
|
-
@data=d
|
897
|
+
@data=d.size>0 ? d : false
|
838
898
|
end
|
839
899
|
def self.accent a
|
840
900
|
@accentPlus=a.to_i
|
@@ -863,7 +923,7 @@ module MidiHex
|
|
863
923
|
@bendCent=8192/@bendrange/100.0 if on
|
864
924
|
end
|
865
925
|
def self.trackPrepare tc=0
|
866
|
-
@tbase,@ch,@velocity,@velocityFuzzy,@basekey,@gateRate,@bendrange,@bendCent,@scalenotes=@prepareSet
|
926
|
+
@tbase,@ch,@velocity,@velocityFuzzy,@basekey,@gateRate,@bendrange,@bendCent,@scalenotes,@gtune=@prepareSet
|
867
927
|
@strokespeed=0
|
868
928
|
@preGate=[]
|
869
929
|
@preVelocity=[]
|
@@ -1376,19 +1436,19 @@ module MidiHex
|
|
1376
1436
|
end
|
1377
1437
|
k
|
1378
1438
|
end
|
1379
|
-
def self.basekeySet d
|
1439
|
+
def self.basekeySet d,num=1
|
1380
1440
|
case d
|
1381
1441
|
when "-"
|
1382
|
-
if @basekey<
|
1442
|
+
if @basekey-12*num < 0
|
1383
1443
|
STDERR.puts "octave too low."
|
1384
1444
|
else
|
1385
|
-
@basekey-=12
|
1445
|
+
@basekey-=12*num
|
1386
1446
|
end
|
1387
1447
|
when "+"
|
1388
|
-
if @basekey>0x7f
|
1448
|
+
if @basekey+12*num > 0x7f
|
1389
1449
|
STDERR.puts "octave too high."
|
1390
1450
|
else
|
1391
|
-
@basekey+=12
|
1451
|
+
@basekey+=12*num
|
1392
1452
|
end
|
1393
1453
|
else
|
1394
1454
|
@basekey=d
|
@@ -1417,13 +1477,22 @@ module MidiHex
|
|
1417
1477
|
@scalenotes.reset
|
1418
1478
|
s=s.split(",")
|
1419
1479
|
first=s.first
|
1420
|
-
s
|
1421
|
-
|
1422
|
-
|
1423
|
-
|
1424
|
-
|
1480
|
+
mode=s[1]
|
1481
|
+
if @scalenotes.keys.member?(:"#{mode}")
|
1482
|
+
@scalenotes.setmode(first,:"#{mode}")
|
1483
|
+
else
|
1484
|
+
s.each{|i|
|
1485
|
+
note=i
|
1486
|
+
note=Notes.get(first,i) if i=~/^[-+]+[[:digit:]]+$/
|
1487
|
+
@scalenotes<<note
|
1488
|
+
}
|
1489
|
+
end
|
1425
1490
|
p @scalenotes if $DEBUG
|
1426
1491
|
end
|
1492
|
+
def self.gtuning s
|
1493
|
+
@gtune=s.split(",")
|
1494
|
+
p @gtune
|
1495
|
+
end
|
1427
1496
|
def self.preLength v
|
1428
1497
|
@preLength=v.map{|i|
|
1429
1498
|
case i
|
@@ -1608,7 +1677,7 @@ module MidiHex
|
|
1608
1677
|
accent=false
|
1609
1678
|
sharp=0
|
1610
1679
|
@h<<[:controlChange,"10,#{@panoftrack}"] if @autopan
|
1611
|
-
cmd=rundata.scan(/&\([^)]+\)|\([-+]*[[:digit:]]?\)|:[^\(,]+\([^\)\(]+\),|:[^,]+,|\([^:]*:[^)\(]*\)|_[^!_]+!|_[^_]__[^\?]+\?|v[[:digit:]]+|[<>][[:digit:]]*|\*?[[:digit:]]+\.[[:digit:]]
|
1680
|
+
cmd=rundata.scan(/&\([^)]+\)|\([-+]*[[:digit:]]?\)|:[^\(,]+\([^\)\(]+\),|:[^,]+,|\([^:]*:[^)\(]*\)|_[^!_]+!|_[^_]__[^\?]+\?|v[[:digit:]]+|[<>][[:digit:]]*|\*?[[:digit:]]+\.[[:digit:]]+|[-+][[:digit:]]*|\*?[[:digit:]]+|[[:alpha:]]|\^|`|'|./)
|
1612
1681
|
cmd<<" " # dummy
|
1613
1682
|
p "track hex; start making: ",cmd if $DEBUG
|
1614
1683
|
cmd.each{|i|
|
@@ -1786,6 +1855,8 @@ module MidiHex
|
|
1786
1855
|
@h<<[:soundOff,$1]
|
1787
1856
|
when /^\(scale:(.*)\)/
|
1788
1857
|
@h<<[:call,:scale,$1]
|
1858
|
+
when /^\(gtune:(.*)\)/
|
1859
|
+
@h<<[:call,:gtuning,$1]
|
1789
1860
|
when /^\(chordcenter:(.*)\)/
|
1790
1861
|
@h<<[:call,:chordCenter,$1]
|
1791
1862
|
when /^\(stroke:(.*)\)/
|
@@ -1826,10 +1897,10 @@ module MidiHex
|
|
1826
1897
|
end
|
1827
1898
|
@bpm=@bpm*rate
|
1828
1899
|
@h<<[:tempo,@bpm]
|
1829
|
-
when
|
1830
|
-
|
1831
|
-
|
1832
|
-
@h<<[:call,:basekeySet,
|
1900
|
+
when /([-+])([[:digit:]]+)?/
|
1901
|
+
plus=$1
|
1902
|
+
num=$2 ? $2.to_i : 1
|
1903
|
+
@h<<[:call,:basekeySet,plus,num]
|
1833
1904
|
when /^\*?[0-9]+/
|
1834
1905
|
# (i.to_i-1).times{@h<<@h[-1]}
|
1835
1906
|
when "`"
|
@@ -2009,32 +2080,32 @@ def multiplet d,tbase
|
|
2009
2080
|
else
|
2010
2081
|
total=tbase*rate
|
2011
2082
|
end
|
2012
|
-
r=i.scan(/=|\(\?:[^\]]+\)|\(x:[^\]]+\)|\(chord:[^)]+\)|\(C:[^)]+\)|:[^\(,]+\([^\)]+\),|:[^,]+,|[[:digit:]\.]+|_[^!]+!|~|\([-+]*[[:digit:]]?\)|[
|
2013
|
-
|
2083
|
+
r=i.scan(/=|\(\?:[^\]]+\)|\(x:[^\]]+\)|\(chord:[^)]+\)|\(C:[^)]+\)|:[^\(,]+\([^\)]+\),|:[^,]+,|[[:digit:]\.]+|_[^!]+!|~|\([-+]*[[:digit:]]?\)|[-+]+[[:digit:]]*|[\^`'<>]|./)
|
2084
|
+
lengths=[]
|
2014
2085
|
notes=[]
|
2015
2086
|
mod=[]
|
2016
2087
|
r.each{|i|
|
2017
2088
|
case i
|
2018
2089
|
# modifier
|
2019
|
-
when /^[
|
2090
|
+
when /^[-+]+[[:digit:]]*/,/^[\^`',<>]/,/^\([-+]*[[:digit:]]?\)/
|
2020
2091
|
mod<<i
|
2021
2092
|
# note
|
2022
2093
|
when /^\((\?|x|C|chord):[^\)]+\)|^\^?:[^,]+,|^=/
|
2023
|
-
|
2094
|
+
lengths<<1
|
2024
2095
|
notes<<"#{mod*""}#{i}"
|
2025
2096
|
mod=[]
|
2026
2097
|
# length
|
2027
2098
|
when /^[[:digit:]]+/
|
2028
|
-
|
2099
|
+
lengths[-1]*=i.to_f
|
2029
2100
|
when " "
|
2030
2101
|
else
|
2031
|
-
|
2102
|
+
lengths<<1
|
2032
2103
|
notes<<"#{mod*""}#{i}"
|
2033
2104
|
mod=[]
|
2034
2105
|
end
|
2035
2106
|
}
|
2036
|
-
sum=
|
2037
|
-
ls=
|
2107
|
+
sum=lengths.inject{|s,i|s+i}
|
2108
|
+
ls=lengths.map{|i|(i*1.0/sum*total).round} # .map{|i|i.round(dep)}
|
2038
2109
|
er=(total-ls.inject{|s,i|s+i}).to_i
|
2039
2110
|
if er>0
|
2040
2111
|
er.times{|i|
|
@@ -2052,6 +2123,8 @@ def multiplet d,tbase
|
|
2052
2123
|
result<<notes[i]
|
2053
2124
|
result<<"*#{ls[i]}"
|
2054
2125
|
}
|
2126
|
+
# rest of mod
|
2127
|
+
result+=mod
|
2055
2128
|
p "multiplet: ",total,ls.inject{|s,i|s+i} if $DEBUG && $debuglevel>1
|
2056
2129
|
result*""
|
2057
2130
|
end
|
@@ -2148,7 +2221,7 @@ def tie d,tbase
|
|
2148
2221
|
res=[]
|
2149
2222
|
# if no length word after '~' length is 1
|
2150
2223
|
d.gsub!(/~([^*[:digit:]])?/){$1 ? "~1#{$1}" : $&} while d=~/~[^*[:digit:]]/
|
2151
|
-
li=d.scan(/\$\{[^\}]+\}|\$[^ ;\$_*^`'+-]+|\([^)\(]*\)|:[^\(,]+\([^)]+\),|:[^,]+,|_[^!]+!|_[^_]__[^?]+\?|v[[:digit:]]+|[
|
2224
|
+
li=d.scan(/\$\{[^\}]+\}|\$[^ ;\$_*^`'+-]+|\([^)\(]*\)|:[^\(,]+\([^)]+\),|:[^,]+,|_[^!]+!|_[^_]__[^?]+\?|v[[:digit:]]+|[<>\-+][[:digit:]]*|\*?[[:digit:].]+|\([VGABLN]:[^)]+\)|~|./)
|
2152
2225
|
li.each{|i|
|
2153
2226
|
case i
|
2154
2227
|
when /^(\*)?([[:digit:].]+)/
|
@@ -2334,7 +2407,10 @@ class Smml
|
|
2334
2407
|
attr_accessor :tracknum, :tbase, :rundatas, :rawdatas, :mx
|
2335
2408
|
attr_accessor :bpm, :velocity, :octave, :vfuzzy, :data, :infile, :outfile, :autopan
|
2336
2409
|
def initialize tbase=480,pagesep='///',expfile=false,cmark=';;'
|
2410
|
+
@tracksep='|||'
|
2337
2411
|
String.new.setcmark(cmark)
|
2412
|
+
String.new.setpagesep(pagesep)
|
2413
|
+
String.new.settracksep(@tracksep)
|
2338
2414
|
@mx=MidiHex
|
2339
2415
|
@rundatas=[]
|
2340
2416
|
@rawdatas=[]
|
@@ -2351,6 +2427,9 @@ class Smml
|
|
2351
2427
|
@vfuzzy=2
|
2352
2428
|
@autopan=true
|
2353
2429
|
end
|
2430
|
+
def self.syntax
|
2431
|
+
hintminimum
|
2432
|
+
end
|
2354
2433
|
def pmap
|
2355
2434
|
puts @mx.programList
|
2356
2435
|
end
|
@@ -2368,9 +2447,9 @@ class Smml
|
|
2368
2447
|
@mx.setfile(@infile)
|
2369
2448
|
@mx.setmidiname(@outfile) if @outfile
|
2370
2449
|
@mx.setdata(@data) if ! @mx.getdata
|
2371
|
-
(
|
2450
|
+
(hintminimum;exit) if (! @mx.getdata || ! @mx.getmidiname ) && ! test
|
2372
2451
|
settest if test
|
2373
|
-
@tracks=@mx.getdata.tracksep
|
2452
|
+
@tracks=@mx.getdata.tracksep
|
2374
2453
|
showtracks if $DEBUG && $debuglevel>1
|
2375
2454
|
fuzzy(fz)
|
2376
2455
|
end
|
@@ -2411,7 +2490,7 @@ class Smml
|
|
2411
2490
|
}
|
2412
2491
|
p @macro if$DEBUG
|
2413
2492
|
@rawdatas.flatten!
|
2414
|
-
open(@expfile,"w"){|f|f.puts @rundatas
|
2493
|
+
open(@expfile,"w"){|f|f.puts @rundatas*@tracksep} if @expfile
|
2415
2494
|
@tracknum=@rawdatas.size+@rundatas.size
|
2416
2495
|
@tracknum=@tracks.size
|
2417
2496
|
end
|
data/lib/smml/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.1
|
4
|
+
version: 0.1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tabasano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|