smml 0.1.11 → 0.1.11.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 922842aff19418ca5f712d524dd4c6260bba7b05
4
- data.tar.gz: 88c1dd28f5c1f2ac2b1501dffae83e5a767e40c0
3
+ metadata.gz: bc386302aaef1ecc9aea9dc8a5a3cf2ae35b6535
4
+ data.tar.gz: 7c506e05aac70336b2d9c474492ece2993f77523
5
5
  SHA512:
6
- metadata.gz: cb7ec5dc247cad1eed654dda4fa955bf609dbd393872037812269d5e073fb400f4cc25dd6a20e8f1d50ef098858ceacd0b686a477d35046b5bd001f07eef1c64
7
- data.tar.gz: f7791a499278203e5684c6a740ac8ac1b45cdd186954e294be8016eac45f98c2f29aa9763564a26d9c19c59cc21ec772bb02d19180937d4c03e947be05648c37
6
+ metadata.gz: 393656c916d75e843e40541370272454def0751d134f6526eafddf328b883f868279ce0783de05da6ef5b0991cfca90a7a700a6af870b975c4e822bd6b7a96f2
7
+ data.tar.gz: f817a17d7f50c215db348642e471765fa9e67fabaff70729b2ca0e463b3abc2f1cf926ff1a754599a31b01f148f776ca6941c03c4db04cc2278d057b97f56798
@@ -147,6 +147,103 @@ class Array
147
147
  end
148
148
  end
149
149
  )
150
+ # MyLength.new(1,"2j")
151
+ # num and fixed mark word, for swing rythm
152
+ class MyLength < Numeric
153
+ def initialize *a
154
+ p [:in,a,a.size] if $DEBUG
155
+ a=a[0] if a.size==1
156
+ r=[]
157
+ case a
158
+ when String
159
+ a=~/\?\?([^\?]*)\?\?/
160
+ a=$1 if $1
161
+ r=a.split("+")
162
+ when Array
163
+ r=a
164
+ when MyLength
165
+ r=a.s,a.j
166
+ else
167
+ r=[a]
168
+ end
169
+ @s=Float(r[0])
170
+ @j=([r[1]]-[nil]).flatten||[]
171
+ p [:i,@s,@j,r,a] if $DEBUG
172
+ end
173
+ def s
174
+ @s
175
+ end
176
+ def j
177
+ @j
178
+ end
179
+ def + (other)
180
+ p "#{@s} #{other} +!" if $DEBUG
181
+ o=MyLength.new(other)
182
+ s=@s+o.s
183
+ j=@j
184
+ j=o.j if j.size<1
185
+ MyLength.new(s,j)
186
+ end
187
+ def - (other)
188
+ p "#{@s} #{other} -!" if $DEBUG
189
+ o=MyLength.new(other)
190
+ s=@s-o.s
191
+ j=@j
192
+ MyLength.new(s,j)
193
+ end
194
+ def * (other)
195
+ p "#{@s} #{other} *!" if $DEBUG
196
+ o=MyLength.new(other)
197
+ s=@s*o.s
198
+ j=@j
199
+ j=o.j if j.size<1
200
+ MyLength.new(s,j)
201
+ end
202
+ def / (other)
203
+ p "#{@s} #{other} /!" if $DEBUG
204
+ o=MyLength.new(other)
205
+ s=@s/o.s
206
+ j=@j
207
+ MyLength.new(s,j)
208
+ end
209
+ def coerce(other)
210
+ p [:c] if $DEBUG
211
+ if other.kind_of?(Float)
212
+ return MyLength.new(other), self
213
+ elsif other.kind_of?(Fixnum)
214
+ return MyLength.new(other), self
215
+ elsif other.kind_of?(String)
216
+ return self,MyLength.new(other)
217
+ else
218
+ super
219
+ end
220
+ end
221
+ def round
222
+ MyLength.new(@s.round,@j)
223
+ end
224
+ def inspect
225
+ "#{@s}(#{@j})!?"
226
+ end
227
+ def to_s int=true
228
+ j=@j.inject(""){|s,i|s+(i||"")}
229
+ (int ? @s.to_i.to_s : @s.to_s)+ (j.size>0 ? "_#{j}" : "")
230
+ end
231
+ def to_f
232
+ self.to_s(false)
233
+ end
234
+ def to_l
235
+ @s
236
+ end
237
+ def to_i
238
+ @s.to_i
239
+ end
240
+ end
241
+ class Numeric
242
+ def to_myl
243
+ MyLength.new(self)
244
+ end
245
+ end
246
+
150
247
  def multilineTrim l,com
151
248
  r=[]
152
249
  on=false
@@ -185,14 +282,17 @@ module MmlReg
185
282
  puts "Regex part,arg bug",[key-@@keys]
186
283
  raise
187
284
  end
285
+ def self.rr key, sort=true, pre=""
286
+ /#{self.r(key,sort,pre)}/
287
+ end
188
288
  def self.rPlusPre key, pre, sort=true
189
289
  self.r(key,sort,pre)
190
290
  end
191
291
  def self.trackr
192
- self.r([:hexraw,:sharp,:chord,:word,:sound,:modifier,:velocity,:tempo,:num,:octave,:note2,:note,:mod,:note?,:sound?])
292
+ self.r([:hexraw,:sharp,:chord,:word,:sound,:tieNote,:register,:modifier,:velocity,:tempo,:num,:octave,:note2,:note,:mod,:note?,:sound?])
193
293
  end
194
294
  def self.multipletr
195
- self.r([:note2,:word,:note,:sound,:chord,:num,:sharp,:octave,:mod])
295
+ self.r([:note2,:word,:note,:sound,:tieNote,:register,:chord,:numswing,:num,:sharp,:octave,:mod])
196
296
  end
197
297
  def self.macroDefr
198
298
  self::MacroDef
@@ -203,6 +303,7 @@ module MmlReg
203
303
  @@h={} # mml regex key hash. order is in @@keys
204
304
  @@keys=[
205
305
  :comment,
306
+ :keyword,
206
307
  :macrodefAStart,
207
308
  :macrodefA,
208
309
  :macrodefStart,
@@ -226,9 +327,12 @@ module MmlReg
226
327
  :chord,
227
328
  :velocity,
228
329
  :sound,
330
+ :tieNote,
331
+ :register,
229
332
  :tempo,
230
333
  :mod,
231
334
  :octave,
335
+ :numswing,
232
336
  :num,
233
337
  :blank,
234
338
  :valueSep,
@@ -261,7 +365,9 @@ module MmlReg
261
365
  @@h[:note?]="[BE]"
262
366
  @@h[:dummyNote]="o"
263
367
  @@h[:randNote]="\\?"
264
- @@h[:sound]="_[^!]+!|=|~|w"
368
+ @@h[:sound]="_[^!]+!|="
369
+ @@h[:tieNote]="~|w"
370
+ @@h[:register]="\\\"[[:digit:]]+"
265
371
  @@h[:sound?]="[[:alpha:]]"
266
372
  @@h[:DCmark?]="\\.[[:alpha:]]+"
267
373
  @@h[:tempo]="[><][[:digit:]]*"
@@ -274,14 +380,16 @@ module MmlReg
274
380
  @@h[:repEnd]="\\]"
275
381
  @@h[:multipletStart]="\\/\\*?[[:digit:]\\.]*:"
276
382
  @@h[:multipletmark]="\\/"
277
- @@h[:num]="[-+*]?[[:digit:]]+\\.[[:digit:]]+|[-+*]?[[:digit:]]+"
383
+ @@h[:numswing]="[[:digit:]],"
384
+ @@h[:num]="[-+*]?[[:digit:]]+_[[:digit:]]+j,|[-+*]?[[:digit:]]+\\.[[:digit:]]+|[-+*]?[[:digit:]]+"
278
385
  @@h[:hexraw]="&\\([^()]*\\)"
279
386
  @@h[:hexrawStart]="&\\("
387
+ @@h[:keyword]="macro +"
280
388
  @@h[:macroA]="\\$\\{[^}]+\\}\\[[^\\]]+\\]|\\$[^}\\$\\{\\(\\)]+\\[[^\\]]+\\]"
281
389
  @@h[:macro]="\\$[[:alnum:]]+\\([^)]*\\)|\\$[[:alnum:]]+|\\$\\{[^}]+\\}"
282
- @@h[:macrodefAStart]="[[:alnum:]]+\\([,[:alpha:]]+\\):= *\\( *[;\\z]"
390
+ @@h[:macrodefAStart]="[[:alnum:]]+\\([,[:alpha:]]+\\):= *\\( *[;]"
283
391
  @@h[:macrodefA]= "[[:alnum:]]+\\([,[:alpha:]]+\\):= *[^\\(;\\n][^;\\n]*"
284
- @@h[:macrodefStart]="[[:alnum:]]+:= *\\( *[;\\z]"
392
+ @@h[:macrodefStart]="[[:alnum:]]+:= *\\( *[;]"
285
393
  @@h[:macrodef]= "[[:alnum:]]+:= *[^\\(;\\n][^;\\n]+"
286
394
  @@h[:blank]="[[:blank:]]+"
287
395
  @@h[:valueSep]=","
@@ -325,7 +433,7 @@ module MmlReg
325
433
  /#{r}|./
326
434
  end
327
435
  def self.blanks
328
- [:comment,:blank,:lineSep]
436
+ [:comment,:blank,:lineSep,:keyword]
329
437
  end
330
438
  end
331
439
 
@@ -1065,6 +1173,8 @@ module MidiHex
1065
1173
  @gateRate=100
1066
1174
  @nowtime=0
1067
1175
  @onlist=[]
1176
+ @registerHash={}
1177
+ @swingHash={1=>1.2,2=>1.8}
1068
1178
  @waitingtime=0
1069
1179
  @rythmChannel=9
1070
1180
  @notes=Notes.new
@@ -1103,11 +1213,11 @@ module MidiHex
1103
1213
  end
1104
1214
  def self.setDefault
1105
1215
  @prepareSet=[
1106
- @tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef
1216
+ @tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef,@registerHash,@swingHash
1107
1217
  ]
1108
1218
  end
1109
1219
  def self.getDefault
1110
- @tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef=
1220
+ @tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef,@registerHash,@swingHash=
1111
1221
  @prepareSet
1112
1222
  end
1113
1223
  def self.dumpstatus
@@ -1172,8 +1282,8 @@ module MidiHex
1172
1282
  cent= @bendCentOn ? 100.0 : 1
1173
1283
  @bendCent=@bendHalfMax/@bendrange/cent
1174
1284
  end
1175
- def self.vibratoMode m
1176
- @vibratoMode=
1285
+ def self.vibratoType m
1286
+ @vibratoType=
1177
1287
  case m
1178
1288
  when /^expre/
1179
1289
  "expre"
@@ -1208,6 +1318,7 @@ module MidiHex
1208
1318
  # track initialize
1209
1319
  def self.trackPrepare tc=0
1210
1320
  self.getDefault
1321
+ @basekeybend=0
1211
1322
  @theremin=false
1212
1323
  @strokespeed=0
1213
1324
  @strokeUpDown=1
@@ -1217,6 +1328,7 @@ module MidiHex
1217
1328
  @preLength=[]
1218
1329
  @preBefore=[]
1219
1330
  @preAfter=[]
1331
+ @registered=[]
1220
1332
  @tracknum=tc+1
1221
1333
  tc+=1 if tc>=@rythmChannel # ch10 is drum kit channel
1222
1334
  tc=@chmax if tc>@chmax
@@ -1304,7 +1416,8 @@ module MidiHex
1304
1416
  r<<self.bend(pos,depth.to_s,ch)
1305
1417
  r
1306
1418
  end
1307
- def self.oneNote len=@tbase,key=@basekey,velocity=@velocity,ch=@ch,sharp=0
1419
+ def self.oneNote len=@tbase,key=@basekey,velocity=@velocity,ch=@ch,sharp=0,swing=false
1420
+ len+=len*self.getswing(swing)
1308
1421
  bendStart=@bendNow
1309
1422
  ch=[ch,0x0f].min
1310
1423
  key+=sharp
@@ -1312,6 +1425,10 @@ module MidiHex
1312
1425
  return self.thereminNote(len,key,velocity,ch) if @theremin
1313
1426
  velocity=@preVelocity.shift if @preVelocity.size>0
1314
1427
  gate=@gateRate
1428
+ if @registered.member?(:staccato)
1429
+ @registered-=[:staccato]
1430
+ gate=10
1431
+ end
1315
1432
  velocity-=rand(@velocityFuzzy) if @velocityFuzzy>0
1316
1433
  velocity=[velocity,0x7f].min
1317
1434
  key=format("%02x",@key)
@@ -1354,7 +1471,8 @@ module MidiHex
1354
1471
  end
1355
1472
  r
1356
1473
  end
1357
- def self.dummyNote key,len,accent=false,sharp=0
1474
+ def self.dummyNote key,len,accent=false,sharp=0,swing=false
1475
+ len+=len*self.getswing(swing)
1358
1476
  vel=@veloecity
1359
1477
  vel+=@accentPlus
1360
1478
  if key=="?"
@@ -1365,12 +1483,12 @@ module MidiHex
1365
1483
  len=@preLength.shift if @preLength.size>0
1366
1484
  self.oneNote(len,key,vel,sharp)
1367
1485
  end
1368
- def self.byKey key,len,accent=false,sharp=0
1486
+ def self.byKey key,len,accent=false,sharp=0,swing=false
1369
1487
  vel=@velocity
1370
1488
  vel+=@accentPlus
1371
- self.oneNote(len,key,vel,@ch,sharp)
1489
+ self.oneNote(len,key,vel,@ch,sharp,swing)
1372
1490
  end
1373
- def self.notekey key,length=false,accent=false,sharp=0
1491
+ def self.notekey key,length=false,accent=false,sharp=0,swing=false
1374
1492
  len,velocity,ch=[@tbase,@velocity,@ch]
1375
1493
  velocity+=@accentPlus if accent
1376
1494
  len=length if length
@@ -1379,12 +1497,12 @@ module MidiHex
1379
1497
  key,ch=key
1380
1498
  end
1381
1499
  key=key+@basekey
1382
- self.oneNote(len,key,velocity,ch,sharp)
1500
+ self.oneNote(len,key,velocity,ch,sharp,swing)
1383
1501
  end
1384
- def self.percussionNote key,len=@tbase,accent=false,sharp=0
1502
+ def self.percussionNote key,len=@tbase,accent=false,sharp=0,swing=false
1385
1503
  vel=@velocity
1386
1504
  vel+=@accentPlus if accent
1387
- self.oneNote(len,key,vel,@rythmChannel,sharp)
1505
+ self.oneNote(len,key,vel,@rythmChannel,sharp,swing)
1388
1506
  end
1389
1507
  def self.noteCalc c,last,base
1390
1508
  n=@notes[c]
@@ -1400,7 +1518,14 @@ module MidiHex
1400
1518
  end
1401
1519
  [n,last,base]
1402
1520
  end
1403
- def self.notes c,l=false,accent=false,sharp=0,sharpFloat=false
1521
+ def self.float2bend f
1522
+ v=f*@bendHalfMax/@bendrange
1523
+ if @bendCentOn
1524
+ v=f*100
1525
+ end
1526
+ v
1527
+ end
1528
+ def self.notes c,l=false,accent=false,sharp=0,sharpFloat=false,swing=false
1404
1529
  if sharpFloat && (sharpFloat!=0)
1405
1530
  s=sharp+sharpFloat
1406
1531
  sharp=s.to_i
@@ -1412,16 +1537,15 @@ module MidiHex
1412
1537
  n,@lastnote,@basekey=self.noteCalc(c,@lastnote,@basekey)
1413
1538
  r=[]
1414
1539
  if sharpFloat && sharpFloat!=0
1415
- v=sharpFloat*@bendHalfMax/@bendrange
1416
- v=sharpFloat*100 if @bendCentOn
1540
+ v=float2bend(sharpFloat)
1417
1541
  @bendNow=v
1418
1542
  v+=bendStart
1419
1543
  r<<self.bend(0,v) if not @theremin
1420
- r<<self.notekey(n,l,accent,sharp)
1544
+ r<<self.notekey(n,l,accent,sharp,swing)
1421
1545
  r<<self.bend(0,bendStart) if not @theremin
1422
1546
  @bendNow=bendStart
1423
1547
  else
1424
- r<<self.notekey(n,l,accent,sharp)
1548
+ r<<self.notekey(n,l,accent,sharp,swing)
1425
1549
  # r<<self.bend(0,bendStart)# if bends
1426
1550
  # @bendNow=bendStart
1427
1551
  end
@@ -1433,7 +1557,8 @@ module MidiHex
1433
1557
  chord=chord.orotate(1) while chord[0]<base-limit
1434
1558
  chord
1435
1559
  end
1436
- def self.chordName c,l=false,accent=false,sharp=0
1560
+ def self.chordName c,l=false,accent=false,sharp=0,swing=false
1561
+ l+=l*self.getswing(swing)
1437
1562
  c=~/(.)([^(]*)(\((.*)\))?/
1438
1563
  root=$1
1439
1564
  type=$2
@@ -1536,7 +1661,8 @@ module MidiHex
1536
1661
  cc=c.map{|i|(i-r)%12}.sort.map{|i|i+r}
1537
1662
  cc
1538
1663
  end
1539
- def self.chord c,l=false,accent=false,sharp=0
1664
+ def self.chord c,l=false,accent=false,sharp=0,swing=false
1665
+ l+=l*self.getswing(swing)
1540
1666
  r=[]
1541
1667
  sspeed=@strokespeed
1542
1668
  c=c.reverse if @strokeUpDown<0
@@ -1552,7 +1678,7 @@ module MidiHex
1552
1678
  r+=self.soundOff(i,@ch,sharp)
1553
1679
  }
1554
1680
  self.strokeUpDownReset
1555
- r+=self.rest(rest) if rest>0
1681
+ r+=self.rest(rest,false,@ch) if rest>0
1556
1682
  r
1557
1683
  end
1558
1684
  def self.strokeUpDownReset
@@ -1561,7 +1687,7 @@ module MidiHex
1561
1687
  def self.setExpressionRest v
1562
1688
  @expressionRest=v.to_i
1563
1689
  end
1564
- def self.rest len=@tbase,ch=@ch
1690
+ def self.rest len,swing=false,ch=@ch
1565
1691
  chx=format("%01x",ch)
1566
1692
  @nowtime+=len
1567
1693
  r=[]
@@ -1576,7 +1702,7 @@ module MidiHex
1576
1702
  r
1577
1703
  end
1578
1704
  def self.restHex len=@tbase,ch=@ch
1579
- r=self.rest(len,ch)
1705
+ r=self.rest(len,false,ch)
1580
1706
  r[0]
1581
1707
  end
1582
1708
  # d : hex data
@@ -1811,6 +1937,7 @@ module MidiHex
1811
1937
  depth=@lastbend+depth
1812
1938
  end
1813
1939
  @lastbend=depth
1940
+ depth+=@basekeybend
1814
1941
  pos+=@waitingtime
1815
1942
  @waitingtime=0
1816
1943
  @nowtime+=pos
@@ -1866,6 +1993,10 @@ module MidiHex
1866
1993
  @basekey=d
1867
1994
  end
1868
1995
  end
1996
+ def self.basekeyReset
1997
+ self.basekeySet(@basekeyOrg)
1998
+ @basekeybend=0
1999
+ end
1869
2000
  def self.chordCenter c
1870
2001
  case c
1871
2002
  when "reset"
@@ -1966,7 +2097,7 @@ module MidiHex
1966
2097
  }
1967
2098
  end
1968
2099
  def self.revertPre d
1969
- mode=@vibratoMode
2100
+ mode=@vibratoType
1970
2101
  d.gsub(/_b__([^?]*)\?/){"(bend:#{$1.split("_")*","})"}.
1971
2102
  gsub(/_e__([^?]*)\?/){"(expre:#{$1.split("_")*","})"}.
1972
2103
  gsub(/_p__([^?]*)\?/){"(panpot:#{$1.split("_")*","})"}.
@@ -2085,17 +2216,18 @@ module MidiHex
2085
2216
  r<<self.expre(restl,e)
2086
2217
  r
2087
2218
  end
2088
- def self.noteExpression arg,t,accent,sharp,sharpFloat
2219
+ def self.noteExpression arg,t,accent,sharp,sharpFloat,swing
2089
2220
  lexpression=@expression
2090
2221
  n,e=arg.split(',')
2091
2222
  r=[]
2092
2223
  r<<self.expre(0,e)
2093
- r<<self.notes(n,t,accent,sharp,sharpFloat)
2224
+ r<<self.notes(n,t,accent,sharp,sharpFloat,swing)
2094
2225
  r<<self.expre(0,lexpression)
2095
2226
  r
2096
2227
  end
2097
2228
  # transition rate, note, expression
2098
- def self.tne arg,t,accent,sharp,sharpFloat
2229
+ def self.tne arg,t,accent,sharp,sharpFloat,swing
2230
+ t+=t*self.getswing(swing)
2099
2231
  exp=@expression
2100
2232
  trans,n,e=arg.split(',')
2101
2233
  trans=0.3 if trans.size==0
@@ -2124,6 +2256,20 @@ module MidiHex
2124
2256
  @lastTne[-1]=@basekey
2125
2257
  r
2126
2258
  end
2259
+ def self.register v
2260
+ r=@registerHash[v.to_i]
2261
+ if r
2262
+ @registered<<r.to_sym
2263
+ else
2264
+ STDERR.puts "register: no data"
2265
+ end
2266
+ end
2267
+ def self.setSwing k,v
2268
+ @swingHash[k.to_i]=v.to_f
2269
+ end
2270
+ def self.setRegister k,v
2271
+ @registerHash[k.to_i]=v
2272
+ end
2127
2273
  def self.broken v
2128
2274
  v=~/off/
2129
2275
  @broken= $& ? false : true
@@ -2139,6 +2285,11 @@ module MidiHex
2139
2285
  puts "bad name '#{v}'"
2140
2286
  end
2141
2287
  end
2288
+ def self.key2bend k
2289
+ v=k.class==Float ? @bendCent*(k-k.to_i) : 0
2290
+ v*=100 if @bendCentOn
2291
+ v
2292
+ end
2142
2293
  def self.eventlist2str elist
2143
2294
  @eventlist=[]
2144
2295
  r=@eventlist
@@ -2151,7 +2302,8 @@ module MidiHex
2151
2302
  case cmd
2152
2303
  when :comment
2153
2304
  when :basekeyPlus
2154
- @basekey+=arg[0]
2305
+ @basekey+=arg[0].to_i
2306
+ @basekeybend+=self.key2bend(arg[0])
2155
2307
  when :raw
2156
2308
  r<<Event.new(:raw,arg[0])
2157
2309
  when :ahead
@@ -2229,9 +2381,92 @@ module MidiHex
2229
2381
  # Array of String or Event class instance
2230
2382
  rr
2231
2383
  end
2384
+ def self.getswing v,hs=@swingHash
2385
+ r=v ? hs[v.to_i] : false
2386
+ if r
2387
+ (r-v.to_i)/v.to_i
2388
+ else
2389
+ 0
2390
+ end
2391
+ end
2392
+ def self.tie d,tbase,swingHash
2393
+ res=[]
2394
+ # if no length word after '~' length is 1
2395
+ li=[]
2396
+ li0=d.scan(MmlReg::RwAll)
2397
+ li0.size.times{|i|
2398
+ li<<li0[i]
2399
+ case li0[i]
2400
+ when "~","w"
2401
+ li<<"1" if li0[i+1] !~ /^(\*)?[[:digit:]]/
2402
+ else
2403
+ end
2404
+ }
2405
+ li.each{|i|
2406
+ case i
2407
+ when /^\(setSwing:(.*)\)/
2408
+ k,v=$1.split(',')
2409
+ swingHash[k.to_i]=v.to_f
2410
+ res<<[:modifier,i]
2411
+ when /^(\*)?([[:digit:].]+)(_([[:digit:]]+)j,)?/
2412
+ tick=$1? $2.to_f : $2.to_f*tbase
2413
+ tick+=tick*self.getswing($4,swingHash)
2414
+ if res[-1][0]==:tick
2415
+ res[-1][1]+=tick
2416
+ else
2417
+ res<<[:tick,tick]
2418
+ end
2419
+ when "~"
2420
+ res<<[:tick,tbase] if res[-1][0]==:e
2421
+ # add vibrato data
2422
+ when "w"
2423
+ lasttick=0
2424
+ lasttick=res[-1][1] if res[-1][0]==:tick
2425
+ res<<[:tick,tbase] if res[-1][0]==:e
2426
+ m="m"
2427
+ d=innerdata(m,["100_start#{lasttick}_vibrato"])
2428
+ res.insert(-3,[:modifier,"(A:#{d})"])
2429
+ when /^\([VGABLN]:[^)]+/
2430
+ res<<[:modifier,i]
2431
+ else
2432
+ res<<[:e,i]
2433
+ end
2434
+ }
2435
+ line=""
2436
+ frest=0
2437
+ (res.size-1).times{|i|
2438
+ next if res[i][0]!=:modifier
2439
+ next if res[i+1][0]!=:tick
2440
+ # if tick after modifier, it must be by tie mark
2441
+ n=i-1
2442
+ n-=1 while res[n][0]!=:tick
2443
+ res[n][1]+=res[i+1][1]
2444
+ res[i+1][0]=:omit
2445
+ }
2446
+ res.each{|mark,data|
2447
+ case mark
2448
+ when :e , :modifier
2449
+ line<<data
2450
+ when :tick
2451
+ tick=data.to_i
2452
+ frest+=data-tick
2453
+ (tick+=frest;puts "frest:#{frest}" if $DEBUG && $debuglevel>1;frest=0) if frest>1
2454
+ line<<"*#{tick}"
2455
+ when :omit
2456
+ puts "# shift tick data by tie part" if $DEBUG
2457
+ else
2458
+ STDERR.puts "tie?"
2459
+ end
2460
+ }
2461
+ p res,line if $DEBUG && $debuglevel>1
2462
+ line
2463
+ end
2232
2464
  def self.makefraze mmldata,tc
2233
2465
  return "" if not mmldata
2234
2466
  self.trackPrepare(tc)
2467
+ p [:beforeTie,mmldata] if $DEBUG
2468
+ mmldata=self.tie(mmldata,@tbase,@swingHash)
2469
+ p [:afterTie,mmldata] if $DEBUG
2235
2470
  @systemWait=120
2236
2471
  @h=[]
2237
2472
  wait=[]
@@ -2250,8 +2485,9 @@ module MidiHex
2250
2485
  cmd.each{|i|
2251
2486
  if wait.size>0
2252
2487
  t=@tbase
2253
- i=~/^(\*)?([[:digit:]]+(\.[[:digit:]]+)?)/
2488
+ i=~/^(\*)?([[:digit:]]+(\.[[:digit:]]+)?)(_([[:digit:]]+)j,)?/
2254
2489
  tickmode=$1
2490
+ swing=$5
2255
2491
  t=$2.to_f if $&
2256
2492
  if $&
2257
2493
  if tickmode
@@ -2268,8 +2504,8 @@ module MidiHex
2268
2504
  end
2269
2505
  end
2270
2506
  wait.each{|m,c|
2271
- arg=[c,t,accent,sharp]
2272
- arg2=[c,t,accent,sharp,sharpFloat]
2507
+ arg=[c,t,accent,sharp,swing]
2508
+ arg2=[c,t,accent,sharp,sharpFloat,swing]
2273
2509
  case m
2274
2510
  when :percussion
2275
2511
  @h<<[:percussionNote,*arg]
@@ -2288,7 +2524,7 @@ module MidiHex
2288
2524
  when :chordName
2289
2525
  @h<<[:chordName,*arg]
2290
2526
  when :rest
2291
- @h<<[:rest,t]
2527
+ @h<<[:rest,t,swing]
2292
2528
  end
2293
2529
  }
2294
2530
  lastwait=wait
@@ -2314,10 +2550,21 @@ module MidiHex
2314
2550
  plus=s1 ? s1[0..0] : "+"
2315
2551
  sharpFloat*=-1 if plus=="-"
2316
2552
  sharp="#{plus}#{n}".to_i
2317
- when /^\(key:(-?)\+?([[:digit:]]+)\)/
2318
- tr=$2.to_i
2553
+ when /^\(key:(-?)\+?([[:digit:].]+)\)/
2554
+ num=$2
2555
+ tr=num.to_i
2556
+ tr=num.to_f if num=~/\./
2319
2557
  tr*=-1 if $1=="-"
2320
2558
  @h<<[:basekeyPlus,tr]
2559
+ when MmlReg.rr([:register])
2560
+ i=~/[[:digit:]]+/
2561
+ @h<<[:call,:register,$&]
2562
+ when /^\(set":(.*)\)/
2563
+ d=$1.split(",")
2564
+ @h<<[:call,:setRegister,*d]
2565
+ when /^\(setSwing:(.*)\)/
2566
+ d=$1.split(",")
2567
+ @h<<[:call,:setSwing,*d]
2321
2568
  when /^\(broken:(.*)\)/
2322
2569
  @h<<[:call,:broken,$1]
2323
2570
  when /^\(tne:(.*)\)/
@@ -2362,8 +2609,8 @@ module MidiHex
2362
2609
  @h<<[:call,:preBefore,s]
2363
2610
  when /^\(roll:(.*)\)/
2364
2611
  @shiftbase=$1.to_i
2365
- when /^\(vibratoMode:(.*)\)/
2366
- @h<<[:call,:vibratoMode,$1]
2612
+ when /^\(vibratoType:(.*)\)/
2613
+ @h<<[:call,:vibratoType,$1]
2367
2614
  when /^\(vibrato:(.*)\)/
2368
2615
  v=$1
2369
2616
  @h<<[:setFloat,:vibratoRate,v]
@@ -2379,7 +2626,7 @@ module MidiHex
2379
2626
  oct=($2.to_i+2)*12
2380
2627
  @h<<[:call,:basekeySet,oct]
2381
2628
  when /^\(key:reset\)/
2382
- @h<<[:call,:basekeySet,@basekeyOrg]
2629
+ @h<<[:call,:basekeyReset]
2383
2630
  when /^\(p:(([[:digit:]]+),)?(([[:digit:]]+)|([\?[:alnum:]]+)(,([[:digit:]]))?)\)/
2384
2631
  channel=$1 ? $2.to_i : false
2385
2632
  subNo=false
@@ -2726,13 +2973,19 @@ def multiplet d,tbase
2726
2973
  r.each{|i|
2727
2974
  case i
2728
2975
  # modifier
2729
- when /^[-+]+[[:digit:]]*/,/^[\^`',<>]/,/^\([-+]*[[:digit:]]?\)/
2976
+ when /^[-+]+[[:digit:]]*/,/^[\^`',<>]/,/^\([-+]*[[:digit:]]?\)/,MmlReg.rr([:register])
2730
2977
  mod<<i
2731
2978
  # note
2732
2979
  when /^\((\?|x|C|chord|tne):[^\)]+\)|^\^?:[^,]+,|^=|\([[:alpha:]\\-\\+]+,[^,]*\)/
2733
2980
  lengths<<1
2734
2981
  notes<<"#{mod*""}#{i}"
2735
2982
  mod=[]
2983
+ # length swing
2984
+ when /^([[:digit:]]+),/
2985
+ n=$1.to_i
2986
+ s=n.to_myl
2987
+ s+=MyLength.new(0,"#{n}j,")
2988
+ lengths[-1]*=s
2736
2989
  # length
2737
2990
  when /^[[:digit:]]+/
2738
2991
  lengths[-1]*=i.to_f
@@ -2740,11 +2993,12 @@ def multiplet d,tbase
2740
2993
  when /^\([^\(\):,]*:.*\)/
2741
2994
  mod<<i
2742
2995
  else
2743
- lengths<<1
2996
+ lengths<<1.to_myl
2744
2997
  notes<<"#{mod*""}#{i}"
2745
2998
  mod=[]
2746
2999
  end
2747
3000
  }
3001
+ p [:multipletle,lengths] if $DEBUG
2748
3002
  sum=lengths.inject{|s,i|s+i}
2749
3003
  ls=lengths.map{|i|(i*1.0/sum*total).round} # .map{|i|i.round(dep)}
2750
3004
  er=(total-ls.inject{|s,i|s+i}).to_i
@@ -2859,72 +3113,7 @@ def nestsearch d,macro
2859
3113
  p "nest? #{a} #{b} #{c} #{chord}",r,macro if $DEBUG
2860
3114
  a||b||c||chord
2861
3115
  end
2862
- def tie d,tbase
2863
- res=[]
2864
- # if no length word after '~' length is 1
2865
- li=[]
2866
- li0=d.scan(MmlReg::RwAll)
2867
- li0.size.times{|i|
2868
- li<<li0[i]
2869
- case li0[i]
2870
- when "~","w"
2871
- li<<"1" if li0[i+1] !~ /^(\*)?[[:digit:]]/
2872
- else
2873
- end
2874
- }
2875
- li.each{|i|
2876
- case i
2877
- when /^(\*)?([[:digit:].]+)/
2878
- tick=$1? $2.to_f : $2.to_f*tbase
2879
- if res[-1][0]==:tick
2880
- res[-1][1]+=tick
2881
- else
2882
- res<<[:tick,tick]
2883
- end
2884
- when "~"
2885
- res<<[:tick,tbase] if res[-1][0]==:e
2886
- when "w"
2887
- lasttick=0
2888
- lasttick=res[-1][1] if res[-1][0]==:tick
2889
- res<<[:tick,tbase] if res[-1][0]==:e
2890
- m="m"
2891
- d=innerdata(m,["100_start#{lasttick}_vibrato"])
2892
- res.insert(-3,[:modifier,"(A:#{d})"])
2893
- when /^\([VGABLN]:[^)]+/
2894
- res<<[:modifier,i]
2895
- else
2896
- res<<[:e,i]
2897
- end
2898
- }
2899
- line=""
2900
- frest=0
2901
- (res.size-1).times{|i|
2902
- next if res[i][0]!=:modifier
2903
- next if res[i+1][0]!=:tick
2904
- # if tick after modifier, it must be by tie mark
2905
- n=i-1
2906
- n-=1 while res[n][0]!=:tick
2907
- res[n][1]+=res[i+1][1]
2908
- res[i+1][0]=:omit
2909
- }
2910
- res.each{|mark,data|
2911
- case mark
2912
- when :e , :modifier
2913
- line<<data
2914
- when :tick
2915
- tick=data.to_i
2916
- frest+=data-tick
2917
- (tick+=frest;puts "frest:#{frest}" if $DEBUG && $debuglevel>1;frest=0) if frest>1
2918
- line<<"*#{tick}"
2919
- when :omit
2920
- puts "# shift tick data by tie part" if $DEBUG
2921
- else
2922
- STDERR.puts "tie?"
2923
- end
2924
- }
2925
- p res,line if $DEBUG && $debuglevel>1
2926
- line
2927
- end
3116
+
2928
3117
  # repeat block analysis: no relation with MIDI format
2929
3118
  # '(:..)' => '(lastcmd:..)'
2930
3119
  def repCalc line,macro,tbase
@@ -3032,7 +3221,7 @@ def repCalc line,macro,tbase
3032
3221
  p res if $DEBUG && $debuglevel>1
3033
3222
  # 空白
3034
3223
  res=res.split.join
3035
- res=tie(res,tbase)
3224
+ res
3036
3225
  end
3037
3226
  def loadCalc d
3038
3227
  if d=~/\(loadf:(.+)(,(.+))?\)/
@@ -1,3 +1,3 @@
1
1
  class Smml
2
- VERSION = "0.1.11"
2
+ VERSION = "0.1.11.5"
3
3
  end
@@ -782,7 +782,7 @@ now, note type commands are :
782
782
 
783
783
  and other commands are with parentheses.
784
784
 
785
- ```'~'``` seems likely note type, but it is compressed to preceding note as calculated note length. most commands cannot be set inside of ```'c~~~'.```
785
+ ```~``` or ```w``` seems likely note type, but it is compressed to preceding note as calculated note length. most commands cannot be set inside of ```'c~~~'.```
786
786
 
787
787
  ;; theremin like sound,
788
788
 
@@ -817,10 +817,11 @@ rest of second 'f' is 30% of one beat instead others are 30% of three beats.
817
817
  ;; vibrato
818
818
 
819
819
  ```
820
+ (vibratoType:bend)
820
821
  f~~ww~~
821
822
  ```
822
823
 
823
- note f then vibrato. bend or expression, under construction.
824
+ note f then vibrato. bend, panpot or expression, under construction.
824
825
 
825
826
  ;; _REPEAT_ variable
826
827
 
@@ -835,6 +836,26 @@ as if uncontrolled
835
836
  (broken:on) (broken:off)
836
837
  ```
837
838
 
839
+ ;; swing
840
+ easy way to express fuzzy swing rythm.
841
+
842
+ ```
843
+ /:a2b1/
844
+ (setSwing:2,2.4)(setSwing:1,0.6)/:a2,b1,/
845
+ (setSwing:2,1.8)(setSwing:1,1.2)/:a2,b1,/
846
+ ```
847
+
848
+ just 2:1, first longer, first shorter. broken if setting part is wrong.
849
+
850
+ ;; register of modifiers
851
+
852
+ ```
853
+ (set":1,staccato) "1e
854
+ ```
855
+
856
+ ```"1``` sets modifier number 1 as staccato for note```e```. now there are no other modes. reserved for simple presetting modifier for one note.
857
+
858
+
838
859
  ## preprocess
839
860
  ;; some pre-process commands.
840
861
  set it in the top of file.
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.11
4
+ version: 0.1.11.5
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-12 00:00:00.000000000 Z
11
+ date: 2014-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler