smml 0.1.3.1 → 0.1.4

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: 3f60c5da7faf59812d18845c1ae2a5454bc9444f
4
- data.tar.gz: 832b1493ec1af0deb3f22df0e9348db0f47ef257
3
+ metadata.gz: 3adeb15710c27d8fffde8600d6566f00530fd1e2
4
+ data.tar.gz: 5589cb7b1d51a32246176a770d8ac4ccdbaa1275
5
5
  SHA512:
6
- metadata.gz: 6b792328cd68182ac47d0bce2c98aa725e2b9b58389525dc7226c667e8f473efdc76a6f091122bda92610e68eec4e4bf4e15ed1d4828e441c343f73ca16da4cc
7
- data.tar.gz: 29caddd563afe13f38f6616a21dd64658c7d7fab6b34b6ddcd8d5d75c5f31566ee3a00aa39aca84a49888bbac8b06d3d71925a3617e8de58a3ac82d4665a0bd8
6
+ metadata.gz: 51def6b77027288a689991fca86e9b276b2a490fd82418f82284ba4c00e799a1eaa1060c7cf723894ca98484082539b983f03bbd62fecf1d6929a9ce9d1c6b65
7
+ data.tar.gz: 8f393f35c258a5e8791d426dab9db5d72d3d105d944cf0fb063b7e52aac316e3c7b644dce4f06bdea6d957783ba46884555b1e1f2b8cd5a069635c9712f83a50
data/lib/smml/msm.rb CHANGED
@@ -16,6 +16,7 @@ usage:
16
16
  #{cmd} -i infile.txt -o outfile.mid
17
17
  show syntax
18
18
  #{cmd} -s
19
+ for farther details, see tutorial_smml.md in gem
19
20
  EOF
20
21
  end
21
22
  def showsyntax
@@ -495,6 +496,9 @@ def hext2hex d
495
496
  r=ar if hex
496
497
  r
497
498
  end
499
+ def midiVround v
500
+ [[v,0x7f].min,0].max
501
+ end
498
502
  def rolandcheck d
499
503
  return d if $ignoreChecksum
500
504
  if d[1]=="41"
@@ -599,7 +603,7 @@ def apply d,macro
599
603
  }*""
600
604
  end
601
605
  def rawHexPart d,macro={}
602
- li=d.scan(/\$se\([^)]*\)|\$delta\([^)]*\)|\$bend\([^)]*\)|\(bend:[^)]*\)|\(expre:[^)]*\)|./)
606
+ li=d.scan(/\$se\([^)]*\)|\$delta\([^)]*\)|\$bend\([^)]*\)|\(bend:[^)]*\)|\(expression:[^)]*\)|\(expre:[^)]*\)|./)
603
607
  res=[]
604
608
  li.map{|i|
605
609
  case i
@@ -613,8 +617,8 @@ def rawHexPart d,macro={}
613
617
  bendHex(d)
614
618
  when /\(bend:([^)]*)\)/
615
619
  "_b__#{$1.split(',')*"_"}?"
616
- when /\(expre:([^)]*)\)/
617
- "_e__#{$1.split(',')*"_"}?"
620
+ when /\(expre(ssion)?:([^)]*)\)/
621
+ "_e__#{$2.split(',')*"_"}?"
618
622
  else
619
623
  i
620
624
  end
@@ -625,10 +629,15 @@ def revertPre d
625
629
  gsub(/_e__([^?]*)\?/){"(expre:#{$1.split("_")*","})"}
626
630
  end
627
631
  def worddata word,d
628
- d=~/\(#{word}:(([[:digit:].]+),)?([-,.[:digit:]]+)\)/
632
+ d=~/\(#{word}:(([[:digit:].]+),)?([-+,.[:digit:]]+)\)/
629
633
  if $&
630
634
  pos=$1 ? $2.to_i : 0
631
- depth=$3.split(',').map{|i|i.to_f}
635
+ depth=$3.split(',').map{|i|
636
+ case i
637
+ when "+","-" ; i
638
+ else ; i.to_f
639
+ end
640
+ }
632
641
  [:"#{word}",pos,depth]
633
642
  else
634
643
  false
@@ -830,6 +839,8 @@ module MidiHex
830
839
  @strokefaster= strict ? 1 : 3
831
840
  @startBpm=bpm
832
841
  @midiname=false
842
+ @trackChannel={}
843
+ @trackName={}
833
844
  @cmark="#"
834
845
  @marktrack=MarkTrack.new
835
846
  @octmode=oct
@@ -841,6 +852,7 @@ module MidiHex
841
852
  @rythmChannel=9
842
853
  @notes=Notes.new
843
854
  @ch=0
855
+ @expression=0x7f
844
856
  @velocity=vel
845
857
  @velocityOrg=vel
846
858
  @velocityFuzzy=vfuzzy
@@ -853,7 +865,7 @@ module MidiHex
853
865
  @pancenter=64
854
866
  @scalenotes=ScaleNotes.new.reset
855
867
  @gtune=guitarTuning
856
- @prepareSet=[@tbase,@ch,@velocity,@velocityFuzzy,@basekey,@gateRate,@bendrange,@bendCent,@scalenotes,@gtune]
868
+ @prepareSet=[@tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendrange,@bendCent,@scalenotes,@gtune]
857
869
  @chmax=15
858
870
  @bendrangemax=127
859
871
  file="midi-programChange-list.txt"
@@ -925,7 +937,7 @@ module MidiHex
925
937
  @bendCent=8192/@bendrange/100.0 if on
926
938
  end
927
939
  def self.trackPrepare tc=0
928
- @tbase,@ch,@velocity,@velocityFuzzy,@basekey,@gateRate,@bendrange,@bendCent,@scalenotes,@gtune=@prepareSet
940
+ @tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendrange,@bendCent,@scalenotes,@gtune=@prepareSet
929
941
  @strokespeed=0
930
942
  @strokeUpDown=1
931
943
  @preGate=[]
@@ -939,6 +951,8 @@ module MidiHex
939
951
  tc=@chmax if tc>@chmax
940
952
  @panoftrack=panbytrack(tc)
941
953
  @ch=tc
954
+ @trackChannel[@tracknum]=@ch
955
+ @trackName[@tracknum]=""
942
956
  Event.new(:dummy).reset
943
957
  end
944
958
  def self.header format,track,tbase=@tbase
@@ -1297,7 +1311,16 @@ module MidiHex
1297
1311
  Event.new(:e,t," B#{ch} #{n} #{data}\n")
1298
1312
  end
1299
1313
  def self.expre len,d
1300
- self.controlChange("11,#{d},#{len}")
1314
+ c=@expression
1315
+ explus=10
1316
+ case d
1317
+ when "+" ; c+=explus
1318
+ when "-" ; c-=explus
1319
+ else ; c=d
1320
+ end
1321
+ c=midiVround(c)
1322
+ @expression=c
1323
+ self.controlChange("11,#{c},#{len}")
1301
1324
  end
1302
1325
  def self.ProgramChange ch,inst,len=0
1303
1326
  ch=@ch if ch==false
@@ -1499,6 +1522,13 @@ module MidiHex
1499
1522
  def self.gtuning s
1500
1523
  @gtune=s.split(",")
1501
1524
  end
1525
+ def self.trackName n
1526
+ if @trackName.values.member?(n)
1527
+ c=@trackName.keys.select{|k|@trackName[k]==n}[0]
1528
+ @ch=@trackChannel[c]
1529
+ end
1530
+ @trackName[@tracknum]=n
1531
+ end
1502
1532
  def self.preLength v
1503
1533
  @preLength=v.map{|i|
1504
1534
  case i
@@ -1862,6 +1892,9 @@ module MidiHex
1862
1892
  @h<<[:waitingtime,$1? $2.to_i : $2.to_f*@tbase]
1863
1893
  when /^\(accent:([^)]*)\)/
1864
1894
  @h<<[:call,:accent,$1]
1895
+ when /^\(track:(.*)\)/
1896
+ i=$1
1897
+ @h<<[:call,:trackName,i]
1865
1898
  when /^\(on:(.*)\)/
1866
1899
  i=$1
1867
1900
  @h<<[:soundOn,i]
@@ -1879,10 +1912,11 @@ module MidiHex
1879
1912
  chord=$2.split.join.split(",") # .map{|i|self.note2key(i)}
1880
1913
  wait<<[:chord,chord]
1881
1914
  when /^\(text:(.*)\)/
1882
- @h<<[:text,$1]
1915
+ @h<<[:metaText,$1]
1883
1916
  when /^\(tempo:(.*)\)/
1884
1917
  @bpm=$1.to_i
1885
1918
  @h<<[:tempo,@bpm] if @bpm>0
1919
+ # limited random note
1886
1920
  when /^\(\?:(.*)\)/
1887
1921
  ks=$1
1888
1922
  if ks=~/\-/
@@ -1892,7 +1926,12 @@ module MidiHex
1892
1926
  else
1893
1927
  ks=ks.split(",")
1894
1928
  key=ks[rand(ks.size)]
1895
- wait<<[:sound,key]
1929
+ a=:sound
1930
+ if key=~/\A[[:digit:]]+\z/
1931
+ a=:rawsound
1932
+ key=key.to_i
1933
+ end
1934
+ wait<<[a,key]
1896
1935
  end
1897
1936
  when /^\(x:(.*)\)/
1898
1937
  key=$1.to_i
data/lib/smml/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Smml
2
- VERSION = "0.1.3.1"
2
+ VERSION = "0.1.4"
3
3
  end
data/tutorial_smml.md CHANGED
@@ -1,5 +1,8 @@
1
+ # smml tutorial
2
+
3
+
1
4
  ## note
2
- ;; note 'c', at first.
5
+ ;; listen to the sound of a note 'c', at first.
3
6
 
4
7
  ```
5
8
  c
@@ -9,7 +12,7 @@ c
9
12
  ;; 'r' means rest. small letters are note names. blanks can be used anywhere and will be ignored.
10
13
 
11
14
  ```
12
- c d e d c3 r
15
+ r c d e d c3 r
13
16
  ```
14
17
  ;; capital letters are notes with sharps
15
18
 
@@ -26,7 +29,7 @@ e D e f F g g2
26
29
  - e d c2
27
30
  ```
28
31
 
29
- ;; >< tempo up down.
32
+ ;; >< tempo up/down.
30
33
 
31
34
  ```
32
35
  f r > f r > f r > f r <<< fr fr fr fr
@@ -42,22 +45,25 @@ c d0.5 d0.5 e0.25 e0.25 e0.25 e0.25
42
45
  ```
43
46
  ;; ( thus, length expression is far from standard MML. usualy it is similiar to musical note name. )
44
47
 
45
- ## gate time
46
- ;; real tone length is important sometimes. gate time command is a percentage of tone length. (staccato etc.)
47
- ```
48
- (g:100) a b c
49
- (g:70) a b c
50
- ```
51
- first line is played like with a slar. second one will be played by more shorter sounds.
52
48
  ## multiplet
53
49
  ;; but above is similiar to bellow
54
50
  ```
55
51
  c /: dd / /: eeee /
56
52
  ```
57
- ;; because for example '/3: dd /' means that two 'd' notes are set inside '3' beats.
53
+ ;; because for example '/3: dd /' means that two 'd' notes are set inside '3' beats.
58
54
  ```
59
55
  /3: dd / /3: ddd / /3: dddddd / /3: dddddddddddd /
60
56
  ```
57
+
58
+ ## gate time
59
+ ;; real tone length is important sometimes. gate time command is a percentage of tone length. (staccato etc.)
60
+ ```
61
+ (g:100) a b c
62
+ (g:70) a b c
63
+ ```
64
+ first line is played like with a slar. second one will be played by more shorter sounds.
65
+
66
+
61
67
  ;; set velocity. max is 127.
62
68
  ```
63
69
  (v:70) c (v:40) c (v:20) c (v:70) c (v:90) c
@@ -66,6 +72,8 @@ c /: dd / /: eeee /
66
72
  ```
67
73
  (pan:>30) c d e
68
74
  ```
75
+ if you don't, smml sets panpot values automatically.
76
+
69
77
 
70
78
  ## repeat phraze
71
79
  ;; repeat 3 times
@@ -126,7 +134,7 @@ strange ways can be affective currently. '(+4)a' etc.
126
134
  ```
127
135
 
128
136
  ## instrument; program change
129
- ;; drum sound can be used anywhere. but this is not MIDI way. use instrument name.
137
+ ;; drum sound can be used anywhere, but this is not MIDI way. use instrument name.
130
138
  ```
131
139
  _snare! = = =
132
140
  ```
@@ -142,7 +150,6 @@ _snare! = = =
142
150
  ## track
143
151
  ;; in SMF, MIDI channel is 1 - 16, and drum is in 10 channel. but currently, these are automaticaly set.
144
152
  ;; you don't need to think about it. simply seperate tracks with a command '|||'.
145
- ;; in the future, track names may be used.
146
153
  ```
147
154
  (p:piano) c d e f ||| (p:organ) e f g a ||| (p:guitar) g a b c
148
155
  ```
@@ -152,6 +159,14 @@ _snare! = = =
152
159
  ||| (p:organ) e f g a
153
160
  ||| (p:guitar) g a b c
154
161
  ```
162
+ ;; the same track name, the same MIDI channel and setting.
163
+ ```
164
+ (track:foo) (p:organ) aa
165
+ ||| (track:foo) bb
166
+ ||| (track:hoge) cc
167
+ ```
168
+ first two tracks are 'organ' sound by the track names declared.
169
+
155
170
  ## page
156
171
  ;; then seperate pages by three or longer one line '/'.
157
172
  ;; but this command do not adjust time potisions. it simply resets track number increment.
@@ -166,7 +181,7 @@ _snare! = = =
166
181
  ```
167
182
  cdef cdef cdef ||| efga efga efga ||| gabc gabc gabc
168
183
  ```
169
- ;; if you want to adjust tracks, use a blank page. the last three 'c' will be played adjusted.
184
+ ;; if you want to adjust tracks, use a blank page by two lines of page seperaters. the last three 'c' will be played adjusted.
170
185
  ```
171
186
  cd ||| e ||| abcde
172
187
  ////////////////////
@@ -182,9 +197,24 @@ cd ||| e ||| abcde
182
197
  ||| (mark:positionName) c
183
198
  ||| (mark:positionName) c
184
199
  ```
200
+ these are played like this.
201
+ ```
202
+ cdrrr c ;; track 1
203
+ ||| errrr c ;; track 2
204
+ ||| abcde c ;; track 3
205
+ ```
185
206
  ;; marks are not needed for all tracks. positions will be adjusted automaticaly to the preceeding track while the same marks exist.
186
207
  ;; like this, most commands except tempo, a command effects its belonging track only.
187
208
 
209
+
210
+ ```
211
+ [ a b c (mark:m) ] 3
212
+ ```
213
+ ;; 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.
214
+ ```
215
+ a b c (mark:m) a b c (mark:m@2) a b c (mark:m@3)
216
+ ```
217
+
188
218
  ## instrument map
189
219
  ;; a MIDI Program Change event sets the instrument on a channel.
190
220
  if channel is 10, a note number means each drum instrument.
@@ -334,6 +364,19 @@ or maybe
334
364
  e /2: cagb /
335
365
  ```
336
366
  etc.
367
+ if a scale has been defined as below, random notes will be selected from its scale notes.
368
+ ```
369
+ (scale:a,b,c,d,e)
370
+ (scale:a,+2,+3,+5,+7,+9,+11)
371
+ ```
372
+ still incompleted to use.
373
+
374
+
375
+ another random note.
376
+ ```
377
+ [ (?:56-58) ] 4 ;; use range 56 to 58, note number. in this case, 4 times repeating maybe '{56}{56}{58}{57}' etc.
378
+ (?:a,b,40,45,90,12) ;; select from a note number or name list.
379
+ ```
337
380
 
338
381
  ## transpose
339
382
  ```
@@ -346,7 +389,7 @@ major key, minor key ,modulation of keys have not been implimented yet.
346
389
  ```
347
390
  (cc:10,64)
348
391
  ```
349
- controlChange number 10 value 64. see SMF format.
392
+ controlChange number 10 value 64. see SMF format for details.
350
393
 
351
394
  ## General MIDI etc.
352
395
  ```
@@ -354,8 +397,17 @@ controlChange number 10 value 64. see SMF format.
354
397
  (gs:reset)
355
398
  (xg:on)
356
399
  ```
357
- after these commands, it need some time over 50 mili sec. or so for running.
400
+ after these MIDI system commands, it need some time over 50 mili sec. or so for running.
358
401
  implementation of it is not fixed, so for adjusting, please set marks on all tracks. for example '(mark:start)'.
402
+ or like this.
403
+ ```
404
+ (gm:on)r
405
+ ///////////////
406
+ ///////////////
407
+ ;; sound data start
408
+ abc
409
+ ||| def
410
+ ```
359
411
 
360
412
  ## compile order
361
413
  now compiling order is : page,track seperate => macro set and replace => repeat check => sound data make.
@@ -441,11 +493,12 @@ preceding modifier gate rates. if next notes are 'abc' ,3rd tone 'c' is with a g
441
493
  new preceding modifiers will cancel old rest preceding values if it remains.
442
494
 
443
495
  ```
444
- ^ ;; accent
445
- ` ;; too fast note, play ahead
446
- ' ;; too late note, lay back
496
+ ^ ;; accent. for changing a value of accent base, use '(accent:15)'.
497
+ ` ;; too fast note, play ahead. for changing a value of shift ticks base, use '(roll:45)'.
498
+ ' ;; too late note, lay back.
447
499
  ```
448
500
  set these modifiers before note commands.
501
+
449
502
  ```
450
503
  (loadf:filename.mid,2)
451
504
  ```
@@ -460,14 +513,48 @@ this command do not check about track data strictly. be careful.
460
513
 
461
514
  now, note type commands are :
462
515
  ```
463
- 'c' ;; single note
464
- '(-)d' ;; single note with flat/sharp/natural modifiers
465
- '{64}' ;; single note by absolute note number
466
- '_snare!' ;; drum note by instrument name
467
- '{d,g,-b}' ;; multi note
468
- ':cmaj7,' ;; chord name
469
- '=' ;; copy of the latest note type command
516
+ c ;; single note
517
+ (-)d ;; single note with flat/sharp/natural modifiers
518
+ {64} ;; single note by absolute note number
519
+ _snare! ;; drum note by instrument name search keyword 'snare'
520
+ {d,g,-b} ;; multi note
521
+ :cmaj7, ;; chord name
522
+ = ;; copy of the latest note type command
470
523
  ```
471
524
 
472
525
  and other commands are with parentheses.
473
526
 
527
+ ```'~'``` seems likely note type, but it is zipped to preceding note as calculated note length. most commands cannot be set inside of ```'a~~~'.```
528
+
529
+
530
+ ## preprocess
531
+ ;; some pre-process commands.
532
+ set it in the top of file.
533
+
534
+
535
+ ```
536
+ ;; midifilename out.mid
537
+ ;; title this music name
538
+ ```
539
+
540
+ ## in pre modifier parts
541
+ limited commands can be used. bend,expre.
542
+
543
+ ```
544
+ (A: o o o o o o o o (bend:20,-5000,-4700,-4700,-400,-200,0,0,10000,-10000) o, )
545
+ (A: o o o o o o o o (expre:20,40,+,+,+,+,-,-,-,-,+,+,+,+,-,-,-,-,+,+,+,+) o, )
546
+ a b ~ ~ c ~ ~ d e ~ f g a b c d
547
+ ```
548
+ note loudness is result of velocity, expression and volume values multipled. expression is used for a running note etc..
549
+ velocity for more long span, volume for total sound level etc.
550
+ in above case, the 9th note 'b' is with modifier data, expression and bend. the first value is time interval.
551
+ all after that are real values. the '+' adds 10 to latest value as default.
552
+ so expression data is ;``` 40,50,60,70,80,70,60,50,40,50,60,70,80...``` with each 20 ticks interval.
553
+
554
+ ## text
555
+ text implement to MIDI file.
556
+ ```
557
+ (text:this_is_a_pen)
558
+ ```
559
+ but now blanks are removed. someday maybe fixed ?
560
+
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.3.1
4
+ version: 0.1.4
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-28 00:00:00.000000000 Z
11
+ date: 2014-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler