smml 0.1.8.2 → 0.1.9
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 +123 -32
- data/lib/smml/version.rb +1 -1
- data/tutorial_smml.md +127 -51
- 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: 85649d364edc63918512902fb5a190e1a9ae3bcc
|
4
|
+
data.tar.gz: 0abe67520e10480fe4dee9fd115b7f33ec1805e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8db3bd75b42f437b91c8811f8be7c8beaf7ea057f1a7b04c3bd62c7cebdfcb228561f9deb80b848db00fe625b8336c7dfc4506fde10dd83a6195ec09ed8b794f
|
7
|
+
data.tar.gz: fe2ade57a8a79b77fb085e3a4f7f6cdcc84a5dbb4f6ada084c736af5e66bf5a109acbd2e0e2afc7e6a2197b29c4b5b93ccc09f976a1221eea3b1a09256ca2734
|
data/lib/smml/msm.rb
CHANGED
@@ -192,7 +192,7 @@ module MmlReg
|
|
192
192
|
self.r([:hexraw,:sharp,:chord,:word,:sound,:modifier,:velocity,:tempo,:num,:octave,:note,:mod,:note?,:sound?])
|
193
193
|
end
|
194
194
|
def self.multipletr
|
195
|
-
self.r([:word,:note,:sound,:chord,:num,:sharp,:octave,:mod])
|
195
|
+
self.r([:note2,:word,:note,:sound,:chord,:num,:sharp,:octave,:mod])
|
196
196
|
end
|
197
197
|
def self.macroDefr
|
198
198
|
self::MacroDef
|
@@ -217,6 +217,7 @@ module MmlReg
|
|
217
217
|
:macro,
|
218
218
|
:repStart,
|
219
219
|
:repEnd,
|
220
|
+
:note2,
|
220
221
|
:word,
|
221
222
|
:modifier,
|
222
223
|
:sharp,
|
@@ -249,6 +250,7 @@ module MmlReg
|
|
249
250
|
]
|
250
251
|
@@h[:repmark]="\\.FINE|\\.DS|\\.DC|\\.\\$|\\.toCODA|\\.CODA|\\.SKIP"
|
251
252
|
@@h[:comment]="\\( *comment[^\(\)]*\\)"
|
253
|
+
@@h[:note2]="\\( *tne *:[^\(\)]*\\)"
|
252
254
|
@@h[:word]="\\([^\(\):]*:[^\(\)]*\\)"
|
253
255
|
@@h[:wordStart]="\\([^\(\):]*:"
|
254
256
|
@@h[:sharp]="\\([+-]*[[:digit:]\\.]*\\)"
|
@@ -431,6 +433,8 @@ class Notes < Hash
|
|
431
433
|
"u"=>[6,@@rythmChannel]
|
432
434
|
}
|
433
435
|
@@invert=@@notes.invert
|
436
|
+
12.times{|i|@@notes[":#{i}"]=i}
|
437
|
+
12.times{|i|@@notes[":-#{i+1}"]=-i-1}
|
434
438
|
@@octave=12
|
435
439
|
def initialize
|
436
440
|
@@notes.each{|k,v|self[k]=v}
|
@@ -1027,7 +1031,7 @@ end
|
|
1027
1031
|
module MidiHex
|
1028
1032
|
BendMax=16383
|
1029
1033
|
BendHalf=8192
|
1030
|
-
#
|
1034
|
+
# initialize
|
1031
1035
|
def self.prepare bpm=120,tbase=480,vel=0x40,oct=:near,vfuzzy=2,strict=false
|
1032
1036
|
@ready=true
|
1033
1037
|
@bendHalfMax=BendHalf
|
@@ -1156,6 +1160,7 @@ module MidiHex
|
|
1156
1160
|
self.bendCentReset
|
1157
1161
|
@lastbend=0
|
1158
1162
|
end
|
1163
|
+
# track initialize
|
1159
1164
|
def self.trackPrepare tc=0
|
1160
1165
|
self.getDefault
|
1161
1166
|
@theremin=false
|
@@ -1187,17 +1192,20 @@ module MidiHex
|
|
1187
1192
|
"
|
1188
1193
|
# Standard MIDI File data start
|
1189
1194
|
# header
|
1190
|
-
4D 54 68 64 #
|
1191
|
-
00 00 00 06 #
|
1192
|
-
00 #{format} #
|
1193
|
-
00 #{track} #
|
1194
|
-
#{tbase} #
|
1195
|
+
4D 54 68 64 # header
|
1196
|
+
00 00 00 06 # length of data :6[byte]
|
1197
|
+
00 #{format} # format
|
1198
|
+
00 #{track} # track number
|
1199
|
+
#{tbase} # tiks; division of a beat #{@tbase}
|
1195
1200
|
"
|
1196
1201
|
end
|
1197
|
-
def self.byGate len,g=@gateRate
|
1202
|
+
def self.byGate len,g=@gateRate,lenforgate=false
|
1203
|
+
lenforgate||=len
|
1198
1204
|
g=@preGate.shift if @preGate.size>0
|
1199
|
-
|
1205
|
+
gl=(lenforgate*1.0*g/100).to_i
|
1206
|
+
l=gl+(len-lenforgate)
|
1200
1207
|
r=len-l
|
1208
|
+
l,r=len,0 if len<lenforgate
|
1201
1209
|
[l,r]
|
1202
1210
|
end
|
1203
1211
|
def self.soundOn key=@basekey,velocity=@velocity,ch=@ch,sharp=0
|
@@ -1235,7 +1243,7 @@ module MidiHex
|
|
1235
1243
|
r<<Event.new(:end,start," 8#{ch} #{key} 00 # #{start} sound off only [#{(@nowtime/@tbase).to_i}, #{@nowtime%@tbase}]\n")
|
1236
1244
|
r
|
1237
1245
|
end
|
1238
|
-
def self.thereminNote pos,key,velocity,ch,exp=@
|
1246
|
+
def self.thereminNote pos,key,velocity,ch,exp=@expression
|
1239
1247
|
r=[]
|
1240
1248
|
@expression=exp
|
1241
1249
|
if @expression
|
@@ -1252,20 +1260,21 @@ module MidiHex
|
|
1252
1260
|
end
|
1253
1261
|
def self.oneNote len=@tbase,key=@basekey,velocity=@velocity,ch=@ch,sharp=0
|
1254
1262
|
bendStart=@bendNow
|
1255
|
-
velocity=@preVelocity.shift if @preVelocity.size>0
|
1256
|
-
gate=@gateRate
|
1257
1263
|
ch=[ch,0x0f].min
|
1258
|
-
velocity-=rand(@velocityFuzzy) if @velocityFuzzy>0
|
1259
|
-
velocity=[velocity,0x7f].min
|
1260
1264
|
key+=sharp
|
1261
1265
|
@key=[[key,0x7f].min,0].max
|
1262
1266
|
return self.thereminNote(len,key,velocity,ch) if @theremin
|
1267
|
+
velocity=@preVelocity.shift if @preVelocity.size>0
|
1268
|
+
gate=@gateRate
|
1269
|
+
velocity-=rand(@velocityFuzzy) if @velocityFuzzy>0
|
1270
|
+
velocity=[velocity,0x7f].min
|
1263
1271
|
key=format("%02x",@key)
|
1264
1272
|
ch=format("%01x",ch)
|
1265
1273
|
vel=format("%02x",velocity)
|
1266
1274
|
start=@waitingtime
|
1267
1275
|
@waitingtime=0
|
1268
|
-
slen,rest=self.byGate(len,gate)
|
1276
|
+
slen,rest=self.byGate(len,gate,@lenForGate)
|
1277
|
+
@lenForGate=false
|
1269
1278
|
@nowtime+=start
|
1270
1279
|
r=[]
|
1271
1280
|
r<<Event.new(:e,start," 9#{ch} #{key} #{vel} # #{start} later, sound on note #{@key} velocity #{velocity}\n")
|
@@ -1297,7 +1306,7 @@ module MidiHex
|
|
1297
1306
|
r
|
1298
1307
|
end
|
1299
1308
|
def self.dummyNote key,len,accent=false,sharp=0
|
1300
|
-
vel=@
|
1309
|
+
vel=@veloecity
|
1301
1310
|
vel+=@accentPlus
|
1302
1311
|
if key=="?"
|
1303
1312
|
key=rand(0x7f)
|
@@ -1328,32 +1337,43 @@ module MidiHex
|
|
1328
1337
|
vel+=@accentPlus if accent
|
1329
1338
|
self.oneNote(len,key,vel,@rythmChannel,sharp)
|
1330
1339
|
end
|
1331
|
-
def self.
|
1332
|
-
bendStart=@bendNow
|
1333
|
-
@lastnoteName=c
|
1340
|
+
def self.noteCalc c,last,base
|
1334
1341
|
n=@notes[c]
|
1335
1342
|
if @octmode==:near && n.class != Array
|
1336
|
-
if
|
1337
|
-
n+=12 if
|
1338
|
-
n-=12 if
|
1343
|
+
if last
|
1344
|
+
n+=12 if last-n>6
|
1345
|
+
n-=12 if last-n<-6
|
1339
1346
|
end
|
1340
|
-
|
1341
|
-
(
|
1342
|
-
(
|
1343
|
-
n
|
1347
|
+
last=n
|
1348
|
+
(base+=12;last-=12) if n>=12
|
1349
|
+
(base-=12;last+=12) if n<0
|
1350
|
+
n=last
|
1351
|
+
end
|
1352
|
+
[n,last,base]
|
1353
|
+
end
|
1354
|
+
def self.notes c,l=false,accent=false,sharp=0,sharpFloat=false
|
1355
|
+
if sharpFloat && (sharpFloat!=0)
|
1356
|
+
s=sharp+sharpFloat
|
1357
|
+
sharp=s.to_i
|
1358
|
+
sharpFloat=s-sharp
|
1344
1359
|
end
|
1360
|
+
bendStart=@bendNow
|
1361
|
+
@lastnoteName=c
|
1362
|
+
n,@lastnote,@basekey=self.noteCalc(c,@lastnote,@basekey)
|
1345
1363
|
r=[]
|
1346
1364
|
if sharpFloat && sharpFloat!=0
|
1347
1365
|
v=sharpFloat*@bendHalfMax/@bendrange
|
1348
1366
|
v=sharpFloat*100 if @bendCentOn
|
1349
|
-
v+=bendStart
|
1350
|
-
r<<self.bend(0,v)
|
1351
1367
|
@bendNow=v
|
1368
|
+
v+=bendStart
|
1369
|
+
r<<self.bend(0,v) if not @theremin
|
1352
1370
|
r<<self.notekey(n,l,accent,sharp)
|
1353
|
-
r<<self.bend(0,bendStart)
|
1371
|
+
r<<self.bend(0,bendStart) if not @theremin
|
1354
1372
|
@bendNow=bendStart
|
1355
1373
|
else
|
1356
1374
|
r<<self.notekey(n,l,accent,sharp)
|
1375
|
+
# r<<self.bend(0,bendStart)# if bends
|
1376
|
+
# @bendNow=bendStart
|
1357
1377
|
end
|
1358
1378
|
r
|
1359
1379
|
end
|
@@ -1576,7 +1596,7 @@ module MidiHex
|
|
1576
1596
|
case d
|
1577
1597
|
when "+" ; c+=explus
|
1578
1598
|
when "-" ; c-=explus
|
1579
|
-
else ; c=d
|
1599
|
+
else ; c=d.to_i
|
1580
1600
|
end
|
1581
1601
|
c=midiVround(c)
|
1582
1602
|
@expression=c
|
@@ -1808,6 +1828,12 @@ module MidiHex
|
|
1808
1828
|
end
|
1809
1829
|
@trackName[@tracknum]=n
|
1810
1830
|
end
|
1831
|
+
def self.setlenforgate g
|
1832
|
+
# set temporary len for gaterate; for internal purpose
|
1833
|
+
# (g:70)...f~~ => 70% of 3, gate rest is 30% of 3
|
1834
|
+
# (g:70)...(gl:1.0)f~~ => 70% of 1.0, gate rest is 30% of 1.0
|
1835
|
+
@lenForGate=g.to_f*@tbase
|
1836
|
+
end
|
1811
1837
|
def self.preLength v
|
1812
1838
|
@preLength=v.map{|i|
|
1813
1839
|
case i
|
@@ -1939,6 +1965,62 @@ module MidiHex
|
|
1939
1965
|
@marktrack.set(m,@tracknum,@nowtime)
|
1940
1966
|
Event.new(:mark,m,@tracknum,@nowtime)
|
1941
1967
|
end
|
1968
|
+
def self.calcNoteFloat n,sharp,sharpFloat,base
|
1969
|
+
n=@notes[n] if n.class==String
|
1970
|
+
n+sharp+sharpFloat+base
|
1971
|
+
end
|
1972
|
+
def self.tneMid now,last,len,transitionrate
|
1973
|
+
n0,e0,sharp0,sharpFloat0,base0=last
|
1974
|
+
n,e,sharp,sharpFloat,base=now
|
1975
|
+
e=e.to_i
|
1976
|
+
e0=e0.to_i
|
1977
|
+
stepDefault=10
|
1978
|
+
step=stepDefault
|
1979
|
+
lastv=self.calcNoteFloat(n0,sharp0,sharpFloat0,base0)
|
1980
|
+
n,last,base=self.noteCalc(n,@notes[n0],base)
|
1981
|
+
stepN=self.calcNoteFloat(n,sharp,sharpFloat,base)-lastv
|
1982
|
+
stepE=e-e0
|
1983
|
+
step=1 if stepE==0 && stepN==0
|
1984
|
+
step=stepN.to_i*3 if stepN>stepDefault/3
|
1985
|
+
transitionl=len*transitionrate
|
1986
|
+
restl=len-transitionl
|
1987
|
+
stepL=transitionl*1.0/step
|
1988
|
+
stepE=stepE*1.0/step
|
1989
|
+
stepN=stepN*1.0/step
|
1990
|
+
r=[]
|
1991
|
+
step.times{|i|
|
1992
|
+
r<<self.expre(0,e0+stepE*i.succ) if e!=e0
|
1993
|
+
r<<self.notes(n0,stepL,false,sharp0,sharpFloat0+stepN*i.succ)
|
1994
|
+
}
|
1995
|
+
r<<self.expre(restl,e)
|
1996
|
+
r
|
1997
|
+
end
|
1998
|
+
# transition rate, note, expression
|
1999
|
+
def self.tne arg,t,accent,sharp,sharpFloat
|
2000
|
+
exp=@expression
|
2001
|
+
trans,n,e=arg.split(',')
|
2002
|
+
trans=trans.to_f
|
2003
|
+
trans=0.3 if trans==0
|
2004
|
+
bchange=0
|
2005
|
+
@nowTne=[n,e,sharp,sharpFloat,@basekey]
|
2006
|
+
if @lastTne
|
2007
|
+
n,e,sharp,sharpFloat,base=@lastTne
|
2008
|
+
bchange=@basekey-base
|
2009
|
+
@basekey=base
|
2010
|
+
else
|
2011
|
+
@lastTne=@nowTne
|
2012
|
+
end
|
2013
|
+
r=[]
|
2014
|
+
r<<Event.new(:comment,"# tne #{arg}")
|
2015
|
+
r<<self.expre(0,e)
|
2016
|
+
r<<self.notes(n,0,accent,sharp,sharpFloat)
|
2017
|
+
r<<self.tneMid(@nowTne,@lastTne,t,trans)
|
2018
|
+
r<<self.expre(0,exp)
|
2019
|
+
@lastTne=@nowTne
|
2020
|
+
@basekey+=bchange
|
2021
|
+
@lastTne[-1]=@basekey
|
2022
|
+
r
|
2023
|
+
end
|
1942
2024
|
def self.eventlist2str elist
|
1943
2025
|
@eventlist=[]
|
1944
2026
|
r=@eventlist
|
@@ -1949,6 +2031,7 @@ module MidiHex
|
|
1949
2031
|
r<<Event.new(:raw,self.metaText("#{cmd} #{arg}")) if $DEBUG && $debuglevel>5
|
1950
2032
|
r<<e
|
1951
2033
|
case cmd
|
2034
|
+
when :comment
|
1952
2035
|
when :basekeyPlus
|
1953
2036
|
@basekey+=arg[0]
|
1954
2037
|
when :raw
|
@@ -2060,6 +2143,8 @@ module MidiHex
|
|
2060
2143
|
@h<<[:percussionNote,*arg]
|
2061
2144
|
when :rawsound
|
2062
2145
|
@h<<[:byKey,*arg]
|
2146
|
+
when :tne
|
2147
|
+
@h<<[:tne,*arg2]
|
2063
2148
|
when :sound
|
2064
2149
|
@h<<[:notes,*arg2]
|
2065
2150
|
when :dummyNote
|
@@ -2099,6 +2184,10 @@ module MidiHex
|
|
2099
2184
|
tr=$2.to_i
|
2100
2185
|
tr*=-1 if $1=="-"
|
2101
2186
|
@h<<[:basekeyPlus,tr]
|
2187
|
+
when /^\(tne:(.*)\)/
|
2188
|
+
wait<<[:tne,$1]
|
2189
|
+
when /^\(lg:(.*)\)/
|
2190
|
+
@h<<[:call,:setlenforgate,$1]
|
2102
2191
|
when /^\(theremin:(.*)\)/
|
2103
2192
|
if $1=~/off/
|
2104
2193
|
@h<<[:setTheremin,false]
|
@@ -2294,10 +2383,12 @@ module MidiHex
|
|
2294
2383
|
p "accent" if $DEBUG
|
2295
2384
|
accent=true
|
2296
2385
|
when "="
|
2386
|
+
last=@h[-1]
|
2387
|
+
@h<<[:comment,"= same sound"]
|
2297
2388
|
if lastwait.size>0
|
2298
2389
|
wait+=lastwait
|
2299
2390
|
else
|
2300
|
-
@h
|
2391
|
+
@h<<last
|
2301
2392
|
end
|
2302
2393
|
when "r"
|
2303
2394
|
wait<<[:rest,i]
|
@@ -2484,7 +2575,7 @@ def multiplet d,tbase
|
|
2484
2575
|
when /^[-+]+[[:digit:]]*/,/^[\^`',<>]/,/^\([-+]*[[:digit:]]?\)/
|
2485
2576
|
mod<<i
|
2486
2577
|
# note
|
2487
|
-
when /^\((\?|x|C|chord):[^\)]+\)|^\^?:[^,]+,|^=/
|
2578
|
+
when /^\((\?|x|C|chord|tne):[^\)]+\)|^\^?:[^,]+,|^=/
|
2488
2579
|
lengths<<1
|
2489
2580
|
notes<<"#{mod*""}#{i}"
|
2490
2581
|
mod=[]
|
data/lib/smml/version.rb
CHANGED
data/tutorial_smml.md
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
## note
|
5
|
+
;; after setting up your environment of playing midi music,
|
6
|
+
|
7
|
+
|
5
8
|
;; listen to the sound of a note 'c', at first.
|
6
9
|
|
7
10
|
```
|
@@ -76,6 +79,9 @@ a0.5 c0.25 c0.25
|
|
76
79
|
/: a4 c2 c2 /
|
77
80
|
```
|
78
81
|
|
82
|
+
in fact, ```/a4c2c2/``` is valid too, but it will be confusing later.
|
83
|
+
|
84
|
+
|
79
85
|
## gate time
|
80
86
|
;; real tone length is important sometimes. gate time command is a percentage of tone length. (staccato etc.)
|
81
87
|
|
@@ -148,6 +154,39 @@ c = = = d = = =
|
|
148
154
|
:cmaj7, = = = :G7, = = =
|
149
155
|
```
|
150
156
|
|
157
|
+
currently valid names are
|
158
|
+
|
159
|
+
```
|
160
|
+
c7
|
161
|
+
cm7
|
162
|
+
cmaj7
|
163
|
+
cmmaj7
|
164
|
+
cmaj or c
|
165
|
+
cm
|
166
|
+
c6
|
167
|
+
cm6
|
168
|
+
csus4
|
169
|
+
caug
|
170
|
+
c+
|
171
|
+
cdim
|
172
|
+
cdim7
|
173
|
+
cpower
|
174
|
+
```
|
175
|
+
|
176
|
+
followed by
|
177
|
+
|
178
|
+
```
|
179
|
+
(+5)
|
180
|
+
(-5)
|
181
|
+
(9) or (add9)
|
182
|
+
(+9)
|
183
|
+
(-9)
|
184
|
+
(+11)
|
185
|
+
(13)
|
186
|
+
(-13)
|
187
|
+
```
|
188
|
+
|
189
|
+
|
151
190
|
## tempo
|
152
191
|
;; most commands except note type ones, are inside parenthesis. set the tempo 120 bpm.
|
153
192
|
|
@@ -199,14 +238,26 @@ strange ways of sharp/flat can be affective currently. ```(+4)a``` , ```(-1.2)a`
|
|
199
238
|
{50,54,58}
|
200
239
|
```
|
201
240
|
|
241
|
+
;; use 12 series notation ; :0,:1,:2,:3 ... and :11 as notes c,C,d,D, ... and b.
|
242
|
+
|
243
|
+
```
|
244
|
+
[ {47,56,:0,:1} === + ] 4
|
245
|
+
```
|
246
|
+
|
247
|
+
this multi-tone passage is repeated four times. ```:0``` is 'c' and ```:1``` is '(+)c', so these go to up-octave every passage effected by octave command '+' in the end of it,
|
248
|
+
but other absolute number notes are not affected.
|
249
|
+
|
250
|
+
|
202
251
|
## instrument; program change
|
203
|
-
;; drum sound can be used anywhere, but this is not MIDI way
|
252
|
+
;; drum sound can be used anywhere, but this is not MIDI way, use instrument name.
|
204
253
|
|
205
254
|
```
|
206
255
|
_snare! = = =
|
207
256
|
```
|
208
257
|
|
209
258
|
;; set instrument. automaticaly searched by even not exact name. (MIDI program change command)
|
259
|
+
it depend on map files.
|
260
|
+
|
210
261
|
|
211
262
|
```
|
212
263
|
(p:piano) c d e f (p:guitar) f e d c
|
@@ -218,6 +269,38 @@ _snare! = = =
|
|
218
269
|
(ch:drum) {34} = = = {35} = = =
|
219
270
|
```
|
220
271
|
|
272
|
+
|
273
|
+
## instrument map
|
274
|
+
;; a MIDI Program Change event sets the instrument on a channel.
|
275
|
+
if channel is 10, a note number means each drum instrument.
|
276
|
+
these are decreared in map files;
|
277
|
+
> midi-programChange-list.txt
|
278
|
+
|
279
|
+
|
280
|
+
> midi-percussion-map.txt
|
281
|
+
|
282
|
+
|
283
|
+
when there are same name files on the current directory, these are used. if not, default files in the gem will be set.
|
284
|
+
data in these map text must start with instrument number.
|
285
|
+
without it, the line text is used for section name. if the word 'Guitar' appears, it is included for searching keyword until the next section name line appears.
|
286
|
+
|
287
|
+
```
|
288
|
+
|
289
|
+
Piano Section
|
290
|
+
1 hoge piano
|
291
|
+
2 foo
|
292
|
+
3 bar
|
293
|
+
|
294
|
+
Guitar Section
|
295
|
+
4 one
|
296
|
+
5 two
|
297
|
+
|
298
|
+
```
|
299
|
+
|
300
|
+
so in this list, instrument number 1,2 and 3 match the keyword 'piano'.
|
301
|
+
So '(p:guitar,2)' selects an instrument line '5 two' as the 2nd result of searching 'guitar' and will be used instead of no word 'guitar' on it.
|
302
|
+
|
303
|
+
|
221
304
|
## track
|
222
305
|
;; in SMF, MIDI channel is 1 - 16, and drum is in 10 channel. but currently, these are automaticaly set.
|
223
306
|
;; you don't need to think about it. simply seperate tracks with a command '|||'.
|
@@ -234,18 +317,8 @@ _snare! = = =
|
|
234
317
|
||| (p:guitar) g a b c
|
235
318
|
```
|
236
319
|
|
237
|
-
;; the same track name, the same MIDI channel and setting.
|
238
|
-
|
239
|
-
```
|
240
|
-
(track:foo) (p:organ) aa
|
241
|
-
||| (track:foo) bb
|
242
|
-
||| (track:hoge) cc
|
243
|
-
```
|
244
|
-
|
245
|
-
first two tracks are 'organ' sound by the track names declared.
|
246
|
-
|
247
320
|
|
248
|
-
currenly track names are not used, and tracks continue with apprearing order. so if there are no data in some tracks in mid parts of pages,
|
321
|
+
currenly track names are not used as default, and tracks continue with apprearing order. so if there are no data in some tracks in mid parts of pages,
|
249
322
|
use blank tracks by track seperaters.
|
250
323
|
|
251
324
|
```
|
@@ -258,7 +331,18 @@ use blank tracks by track seperaters.
|
|
258
331
|
||| def ;; track 3
|
259
332
|
```
|
260
333
|
|
261
|
-
|
334
|
+
|
335
|
+
;; the same track name, the same MIDI channel and setting.
|
336
|
+
|
337
|
+
```
|
338
|
+
(track:foo) (p:organ) aa
|
339
|
+
||| (track:foo) bb
|
340
|
+
||| (track:hoge) cc
|
341
|
+
```
|
342
|
+
|
343
|
+
first two tracks are 'organ' sound by the same track names declared.
|
344
|
+
|
345
|
+
|
262
346
|
## page
|
263
347
|
;; then seperate pages by three or longer one line '/'.
|
264
348
|
;; but this command do not adjust time potisions. it simply resets track number increment.
|
@@ -266,18 +350,18 @@ use blank tracks by track seperaters.
|
|
266
350
|
```
|
267
351
|
cdef|||efga|||gabc
|
268
352
|
////////////////////
|
269
|
-
|
353
|
+
c2d2e2f2|||e2f2g2a2|||g2a2b2c2
|
270
354
|
///////////////////
|
271
|
-
|
355
|
+
c3def|||e3fga|||g3abc
|
272
356
|
```
|
273
357
|
|
274
358
|
;; the same to below.
|
275
359
|
|
276
360
|
```
|
277
|
-
cdef
|
361
|
+
cdef c2d2e2f2 c3def ||| efga e2f2g2a2 e3fga ||| gabc g2a2b2c2 g3abc
|
278
362
|
```
|
279
363
|
|
280
|
-
;; if you want to adjust tracks, use a blank page by two lines of page seperaters. the last three 'c' will be played adjusted.
|
364
|
+
;; if you want to adjust tracks, use a blank page by two lines of page seperaters. the last three 'c' will be played adjusted instead each preceding note lengths are different.
|
281
365
|
|
282
366
|
```
|
283
367
|
cd ||| e ||| abcde
|
@@ -292,9 +376,9 @@ c|||c|||c
|
|
292
376
|
```
|
293
377
|
cd ||| e ||| abcde
|
294
378
|
////////////////////
|
295
|
-
(mark:positionName) c
|
296
|
-
||| (mark:positionName) c
|
297
|
-
||| (mark:positionName) c
|
379
|
+
(mark:positionName) c ;; track 1
|
380
|
+
||| (mark:positionName) c ;; track 2
|
381
|
+
||| (mark:positionName) c ;; track 3
|
298
382
|
```
|
299
383
|
|
300
384
|
these are played like this.
|
@@ -314,42 +398,12 @@ these are played like this.
|
|
314
398
|
```
|
315
399
|
|
316
400
|
;; same mark names 'm' in repeated section or one track will be automaticaly substituded by 'm m@2 m@3'. to adjust, use it in other tracks.
|
317
|
-
or use a comma
|
401
|
+
or use a comma as a seperater of a name and a counter; '(mark:hoge@3)' = '(mark:hoge,3)'.
|
318
402
|
|
319
403
|
```
|
320
404
|
a b c (mark:m) a b c (mark:m@2) a b c (mark:m@3)
|
321
405
|
```
|
322
406
|
|
323
|
-
## instrument map
|
324
|
-
;; a MIDI Program Change event sets the instrument on a channel.
|
325
|
-
if channel is 10, a note number means each drum instrument.
|
326
|
-
these are decreared in map files;
|
327
|
-
> midi-programChange-list.txt
|
328
|
-
|
329
|
-
|
330
|
-
> midi-percussion-map.txt
|
331
|
-
|
332
|
-
|
333
|
-
when there are same name files on the current directory, these are used. if not, default files in the gem will be set.
|
334
|
-
data in these map text must start with instrument number.
|
335
|
-
without it, the line text is used for section name. if the word 'Guitar' appears, it is included for searching keyword until the next section name line appears.
|
336
|
-
|
337
|
-
```
|
338
|
-
|
339
|
-
Piano Section
|
340
|
-
1 hoge piano
|
341
|
-
2 foo
|
342
|
-
3 bar
|
343
|
-
|
344
|
-
Guitar Section
|
345
|
-
4 one
|
346
|
-
5 two
|
347
|
-
|
348
|
-
```
|
349
|
-
|
350
|
-
so in this list, instrument number 1,2 and 3 match the keyword 'piano'.
|
351
|
-
So '(p:guitar,2)' selects an instrument line '5 two' as the 2nd result of searching 'guitar' and will be used instead of no word 'guitar' on it.
|
352
|
-
|
353
407
|
## hex data
|
354
408
|
;; until smml syntax is completed, or other reasons, raw hex parts can be used for deep level data and things you don't know how to inprement by smml data.
|
355
409
|
search MIDI format and set valid hex data.
|
@@ -656,6 +710,7 @@ pitch bend 100 of note 'c'.
|
|
656
710
|
```
|
657
711
|
|
658
712
|
'+' relative value. if these are after above, three notes are bend 100 of 'c', bend 200 of 'c' and bend 0 of 'c'.
|
713
|
+
bend data is effective permanently until reseted by ```(bend:0)```.
|
659
714
|
|
660
715
|
|
661
716
|
```
|
@@ -715,10 +770,12 @@ now, note type commands are :
|
|
715
770
|
|
716
771
|
```
|
717
772
|
c ;; single note
|
773
|
+
C ;; c sharp
|
718
774
|
(-)d ;; single note with flat/sharp/natural modifiers
|
719
775
|
{64} ;; single note by absolute note number
|
720
776
|
_snare! ;; drum note by instrument name search keyword 'snare'
|
721
777
|
{d,g,-b} ;; multi note
|
778
|
+
{47,:0} ;; multi note. second note is by 12 series half tone notation
|
722
779
|
:cmaj7, ;; chord name
|
723
780
|
= ;; copy of the latest note type command
|
724
781
|
```
|
@@ -737,6 +794,25 @@ ab /:cde/ f
|
|
737
794
|
|
738
795
|
after on command, data is manipulated as bend data inside smml. not completed about modifiers for this.
|
739
796
|
|
797
|
+
;; easy way to write smooth expression and note transition
|
798
|
+
(experimental; experimental notations may be deleted or hidden to internal purpose only later.)
|
799
|
+
|
800
|
+
|
801
|
+
```
|
802
|
+
(tne:0.3,c,127) 3
|
803
|
+
```
|
804
|
+
|
805
|
+
3 beat lengths of note 'c' with expression level 127 transition time rate 0.3 connected from the last note.
|
806
|
+
|
807
|
+
;; length for gate
|
808
|
+
(experimental)
|
809
|
+
|
810
|
+
```
|
811
|
+
(g:70)
|
812
|
+
f~~(lg:1.0)f~~f~~
|
813
|
+
```
|
814
|
+
|
815
|
+
rest of second 'f' is 30% of one beat instead others are 30% of three beats.
|
740
816
|
|
741
817
|
## preprocess
|
742
818
|
;; some pre-process commands.
|
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.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tabasano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|