smml 0.1.1 → 0.1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|