smml 0.1.13 → 0.1.14.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: 7e98825702f8770b16248f090e7dca0a3890eb91
4
- data.tar.gz: d2b6e346dbd790585f5534e8f626e1635bac8cbb
3
+ metadata.gz: 28e0baacf3d9353733f053491b93b434a4588be4
4
+ data.tar.gz: 643c31f2dce680edc672956aeecfe64d7318b7f4
5
5
  SHA512:
6
- metadata.gz: 65904b8614d1f1df18564cfa439f54219a8dfb1518709582d42a3a06fcf58bc60566fd162b6a92bf26ca48cbf9c665b179ea1193001442ff54faf2b28d9cf52d
7
- data.tar.gz: 43fd189cf0d48058b21d802b4f62b55eb293b4fbe33e669c907f3197b434e79aaa2fec21b50f6a1c3356965fc85db1db664da71e0bc002339fc66914de1b423b
6
+ metadata.gz: 489a4173ea0e7fc0c4ac97bea96db96529797d6c609fece01b9501cafc1c9f81f4913471edfd2a61ed12a5650623dbd5d73e9a1ad75da594c6349f30c8ff8a9e
7
+ data.tar.gz: b4c22c2cc0d337ab16a189729ea6e9dcadb7fdea888bf7334f588b8e573bc08d12e05948f4054035463ddfe2cd410d9777671430efc68983e5329b42afe6ef6b
@@ -368,7 +368,7 @@ module MmlReg
368
368
  @@h[:velocity]="v[[:digit:]]+"
369
369
  @@h[:note]="[abcdefgACDFGr]|\\{[[:digit:]]+\\}"
370
370
  @@h[:note?]="[BE]"
371
- @@h[:dummyNote]="o|m|O|M"
371
+ @@h[:dummyNote]="o|m|O|M|n|N|x"
372
372
  @@h[:randNote]="\\?"
373
373
  @@h[:sound]="_[^!]+!|="
374
374
  @@h[:tieNote]="~|w"
@@ -625,6 +625,23 @@ class Notes < Hash
625
625
  def initialize
626
626
  @@notes.each{|k,v|self[k]=v}
627
627
  end
628
+ def self.up n,type
629
+ return self.down(n) if type==:down || (type==:random && rand(2)==1)
630
+ case n
631
+ when "a".."f"
632
+ n.succ
633
+ when "g"
634
+ "a"
635
+ else
636
+ n
637
+ end
638
+ end
639
+ def self.down n
640
+ case n
641
+ when "a".."g"
642
+ @@invert[(@@notes[n]-1)%12].downcase
643
+ end
644
+ end
628
645
  def self.offset a,b="c"
629
646
  r=@@notes[a]-@@notes[b]
630
647
  if r>6
@@ -1396,6 +1413,7 @@ module MidiHex
1396
1413
  @scalenotes=ScaleNotes.new.reset
1397
1414
  @gtune=guitarTuning
1398
1415
  self.setDefault
1416
+ @dummymarknotenum=0
1399
1417
  @chmax=15
1400
1418
  @bendrangemax=24
1401
1419
  file="midi-programChange-list.txt"
@@ -1407,6 +1425,10 @@ module MidiHex
1407
1425
  self.loadPercussionMap(pfile)
1408
1426
  self.dumpstatus if $DEBUG && $debuglevel>3
1409
1427
  end
1428
+ def self.setOctaveNear v
1429
+ v= v ? :near : :fixed
1430
+ @octmode=v
1431
+ end
1410
1432
  def setBendRangeMax v
1411
1433
  @bendrangemax=v
1412
1434
  end
@@ -1484,6 +1506,20 @@ module MidiHex
1484
1506
  cent= @bendCentOn ? 100.0 : 1
1485
1507
  @bendCent=@bendHalfMax/@bendrange/cent
1486
1508
  end
1509
+
1510
+ def self.nType v
1511
+ @nType=
1512
+ case v
1513
+ when /^ra?nd/
1514
+ :random
1515
+ when /^up/
1516
+ :up
1517
+ when /^down/
1518
+ :down
1519
+ else
1520
+ :up
1521
+ end
1522
+ end
1487
1523
  def self.vibratoType m
1488
1524
  @vibratoType=
1489
1525
  case m
@@ -1520,7 +1556,10 @@ module MidiHex
1520
1556
  # track initialize
1521
1557
  def self.trackPrepare tc=0
1522
1558
  self.getDefault
1523
- @dummyNoteOrg=["o","O"]
1559
+ @chordStack=[]
1560
+ @chordStackNum=0
1561
+ @nType=:up
1562
+ @dummyNoteOrg=["o","O","x"]
1524
1563
  @multidummySize=3
1525
1564
  @basekeybend=0
1526
1565
  @theremin=false
@@ -1629,10 +1668,17 @@ module MidiHex
1629
1668
  r<<self.bend(pos,depth.to_s,ch)
1630
1669
  r
1631
1670
  end
1671
+ def self.predummyword
1672
+ "sound"
1673
+ end
1674
+ def self.dummymarknote n,preword=self.predummyword
1675
+ "__#{preword}_#{n}__"
1676
+ end
1632
1677
  def self.oneNote len=@tbase,key=@basekey,velocity=@velocity,ch=@ch,sharp=0,swing=false
1633
1678
  len+=len*self.getswing(swing)
1634
1679
  bendStart=@bendNow
1635
1680
  ch=[ch,0x0f].min
1681
+ dummymark=(key=="x")
1636
1682
  key=self.rndNote if @dummyNoteOrg.member?(key)
1637
1683
  key+=sharp
1638
1684
  @key=[[key,0x7f].min,0].max
@@ -1645,7 +1691,11 @@ module MidiHex
1645
1691
  end
1646
1692
  velocity-=rand(@velocityFuzzy) if @velocityFuzzy>0
1647
1693
  velocity=[velocity,0x7f].min
1648
- key=format("%02x",@key)
1694
+ keydata=format("%02x",@key)
1695
+ if dummymark
1696
+ @dummymarknotenum+=1
1697
+ keydata=self.dummymarknote(@dummymarknotenum)
1698
+ end
1649
1699
  ch=format("%01x",ch)
1650
1700
  vel=format("%02x",velocity)
1651
1701
  start=@waitingtime
@@ -1654,7 +1704,7 @@ module MidiHex
1654
1704
  @lenForGate=false
1655
1705
  @nowtime+=start
1656
1706
  r=[]
1657
- r<<Event.new(:e,start," 9#{ch} #{key} #{vel} # #{start} later, sound on note #{Notes.nDisplay(@key)} velocity #{velocity}\n")
1707
+ r<<Event.new(:e,start," 9#{ch} #{keydata} #{vel} # #{start} later, sound on note #{Notes.nDisplay(@key)} velocity #{velocity}\n")
1658
1708
  b=@preAfter.shift
1659
1709
  bends=expre=false
1660
1710
  if b
@@ -1675,13 +1725,13 @@ module MidiHex
1675
1725
  }
1676
1726
  end
1677
1727
  @nowtime+=slen
1678
- r<<Event.new(:e,slen," 8#{ch} #{key} 00 # #{slen}(gate:#{@gateRate})- #{len.to_i}(#{len.round(2)})ticks later, sound off [#{(@nowtime/@tbase).to_i}, #{@nowtime%@tbase}]\n")
1728
+ r<<Event.new(:e,slen," 8#{ch} #{keydata} 00 # #{slen}(gate:#{@gateRate})- #{len.to_i}(#{len.round(2)})ticks later, sound off [#{(@nowtime/@tbase).to_i}, #{@nowtime%@tbase}]\n")
1679
1729
  r<<self.bend(0,bendStart) if bends
1680
1730
  @bendNow=bendStart
1681
1731
  r<<self.expre(0,127) if expre
1682
1732
  if rest>0
1683
1733
  @nowtime+=rest
1684
- r<<Event.new(:end,rest," 8#{ch} #{key} 00 # #{rest} len-gate\n")
1734
+ r<<Event.new(:end,rest," 8#{ch} #{keydata} 00 # #{rest} len-gate\n")
1685
1735
  end
1686
1736
  r
1687
1737
  end
@@ -1691,9 +1741,9 @@ module MidiHex
1691
1741
  def self.rndNote useScale=true
1692
1742
  key=rand(0x7f)
1693
1743
  key=self.note2key(@scalenotes.sample) if @scalenotes.size>0 && useScale
1694
- if @downRandDummy && @lastRandNote
1744
+ if @updown==:down && @lastRandNote
1695
1745
  key-=12 while key>@lastRandNote && key>12
1696
- elsif ! @downRandDummy && @lastRandNote
1746
+ elsif @updown==:up && @lastRandNote
1697
1747
  key+=12 while key<@lastRandNote && key<127-12
1698
1748
  end
1699
1749
  @lastRandNote=key
@@ -1703,11 +1753,16 @@ module MidiHex
1703
1753
  len+=len*self.getswing(swing)
1704
1754
  vel=@velocity
1705
1755
  vel+=@accentPlus
1706
- @downRandDummy=false
1707
- if key=="?"
1756
+ case key
1757
+ when "?"
1708
1758
  key=rndNote
1709
- elsif key=="O"
1710
- @downRandDummy=true
1759
+ @updown=:no
1760
+ when "o"
1761
+ @updown=:up
1762
+ when "O"
1763
+ @updown=:down
1764
+ else
1765
+ @updown=:no
1711
1766
  end
1712
1767
  key=@preNote.shift if @preNote.size>0
1713
1768
  len=@preLength.shift if @preLength.size>0
@@ -1736,7 +1791,12 @@ module MidiHex
1736
1791
  end
1737
1792
  def self.noteCalc c,last,base
1738
1793
  n=@notes[c]
1739
- n+=self.notesharp(c,0)
1794
+ case n
1795
+ when Fixnum
1796
+ n+=self.notesharp(c,0)
1797
+ when Array
1798
+ else
1799
+ end
1740
1800
  if @octmode==:near && n.class != Array
1741
1801
  if last
1742
1802
  n+=12 if last-n>6
@@ -1763,6 +1823,14 @@ module MidiHex
1763
1823
  sharpFloat=s-sharp
1764
1824
  end
1765
1825
  bendStart=@bendNow
1826
+ c=case c
1827
+ when "n"
1828
+ Notes.up(@lastnoteName,@nType)
1829
+ when "N"
1830
+ Notes.down(@lastnoteName)
1831
+ else
1832
+ c
1833
+ end
1766
1834
  @lastnoteName=c
1767
1835
  @basekey=@basekeyCenter+12*(rand(5)-2) if @broken
1768
1836
  n,@lastnote,@basekey=self.noteCalc(c,@lastnote,@basekey)
@@ -1788,8 +1856,25 @@ module MidiHex
1788
1856
  chord=chord.orotate(1) while chord[0]<base-limit
1789
1857
  chord
1790
1858
  end
1859
+ def self.setChordStack s
1860
+ @chordStack=s.split(",")
1861
+ end
1862
+ def self.cstack c
1863
+ if @chordStack.size>0
1864
+ c=@chordStack[@chordStackNum]
1865
+ @chordStackNum+=1
1866
+ @chordStackNum%=@chordStack.size
1867
+ end
1868
+ c
1869
+ end
1791
1870
  def self.chordName c,l=false,accent=false,sharp=0,swing=false
1792
1871
  l+=l*self.getswing(swing)
1872
+ case c
1873
+ when "N"
1874
+ c=self.cstack(c)
1875
+ when "="
1876
+ c=@lastchordName
1877
+ end
1793
1878
  same=false
1794
1879
  same=(@lastchordName==c) if @lastchordName
1795
1880
  if same
@@ -2468,14 +2553,28 @@ module MidiHex
2468
2553
  STDERR.puts "register: no data"
2469
2554
  end
2470
2555
  end
2471
- def self.setSwing k,v,hs=@swingHash
2472
- v=v.to_f
2556
+ def self.setSwing k,value,hs=@swingHash
2557
+ v=value.to_f
2473
2558
  k=~/of/
2474
2559
  if $&
2475
2560
  k,all=$`.to_i,$'.to_i
2561
+ if value=~/%/
2562
+ percent=$`.to_f
2563
+ v=all*1.0*percent/100
2564
+ elsif value=~/rest/
2565
+ v=all-hs[all-k]
2566
+ end
2476
2567
  hs[k]=v
2477
2568
  hs[all-k]=all-v
2478
2569
  else
2570
+ case value
2571
+ when /shorter([[:digit:]]+)?/
2572
+ rate=0.9**($1 ? $1.to_i : 1)
2573
+ v=k.to_i*rate
2574
+ when /longer([[:digit:]]+)?/
2575
+ rate=1.1**($1 ? $1.to_i : 1)
2576
+ v=k.to_i*rate
2577
+ end
2479
2578
  hs[k.to_i]=v
2480
2579
  end
2481
2580
  end
@@ -2780,6 +2879,8 @@ module MidiHex
2780
2879
  when /^\(set":(.*)\)/
2781
2880
  d=$1.split(",")
2782
2881
  @h<<[:call,:setRegister,*d]
2882
+ when /^\(cStack:(.*)\)/
2883
+ @h<<[:call,:setChordStack,$1]
2783
2884
  when /^\(setSwing:(.*)\)/
2784
2885
  d=$1.split(",")
2785
2886
  @h<<[:call,:setSwing,*d]
@@ -2827,6 +2928,12 @@ module MidiHex
2827
2928
  @h<<[:call,:preBefore,s]
2828
2929
  when /^\(roll:(.*)\)/
2829
2930
  @shiftbase=$1.to_i
2931
+ when /^\(near:(.*)\)/
2932
+ sw=false
2933
+ sw=true if $1=~/^on/
2934
+ @h<<[:call,:setOctaveNear,sw]
2935
+ when /^\(nType:(.*)\)/
2936
+ @h<<[:call,:nType,$1]
2830
2937
  when /^\(vibratoType:(.*)\)/
2831
2938
  @h<<[:call,:vibratoType,$1]
2832
2939
  when /^\(vibrato:(.*)\)/
@@ -3005,23 +3112,24 @@ module MidiHex
3005
3112
  last=@h[-1]
3006
3113
  @h<<[:comment,"= same sound"]
3007
3114
  if lastwait.size>0
3115
+ lastwait[0][1]="=" if lastwait[-1]==[:chordName, "N"]
3008
3116
  wait+=lastwait
3009
3117
  else
3010
3118
  @h<<last
3011
3119
  end
3012
3120
  when "r"
3013
3121
  wait<<[:rest,i]
3014
- when "o","O"
3122
+ when "o","O","?","x"
3015
3123
  wait<<[:dummyNote,i]
3016
3124
  when " "
3017
- when "?"
3018
- wait<<[:dummyNote,"?"]
3019
3125
  when "m"
3020
3126
  @h<<[:call,:resetRand]
3021
3127
  wait<<[:chord,["??"]]
3022
3128
  when "M"
3023
3129
  @h<<[:call,:resetRand]
3024
3130
  wait<<[:chord,["?O"]]
3131
+ when "n","N"
3132
+ wait<<[:sound,i]
3025
3133
  else
3026
3134
  if @notes.keys.member?(i)
3027
3135
  wait<<[:sound,i]
@@ -3181,7 +3289,7 @@ end
3181
3289
  def multiplet d,tbase
3182
3290
  d=~/\/((\*)?([[:digit:].]+)?:)?(.*)\//
3183
3291
  tickmode=$2
3184
- i=$4
3292
+ nbody=$4
3185
3293
  rate=$3 ? $3.to_f : 1
3186
3294
  rate=1 if rate==0
3187
3295
  if tickmode
@@ -3190,7 +3298,7 @@ def multiplet d,tbase
3190
3298
  total=tbase*rate
3191
3299
  end
3192
3300
  regex=MmlReg.multipletr
3193
- r=i.scan(/#{regex}|./)
3301
+ r=nbody.scan(/#{regex}|./)
3194
3302
  lengths=[]
3195
3303
  notes=[]
3196
3304
  mod=[]
@@ -3212,6 +3320,7 @@ def multiplet d,tbase
3212
3320
  lengths[-1]*=s
3213
3321
  # length
3214
3322
  when /^[[:digit:]]+/
3323
+ STDERR.puts "multiptet: syntax error (:) ?" if not lengths[-1]
3215
3324
  lengths[-1]*=i.to_f
3216
3325
  when " "
3217
3326
  when /^\([^\(\):,]*:.*\)/
@@ -3610,7 +3719,7 @@ class Smml
3610
3719
  @mx.trackMake(t,tc-1)
3611
3720
  }.flatten
3612
3721
  puts alla if $DEBUG
3613
- all=alla.map{|i|i.commentoff("","#")}*""
3722
+ all=alla.map{|i|i.commentoff("","#").gsub(/__#{@mx.predummyword}_[[:digit:]]+__/){"7F"}}*""
3614
3723
  array=[all.split.join]
3615
3724
  @binary = array.pack( "H*" )
3616
3725
  end
@@ -1,3 +1,3 @@
1
1
  class Smml
2
- VERSION = "0.1.13"
2
+ VERSION = "0.1.14.4"
3
3
  end
@@ -116,6 +116,7 @@ if you don't, smml sets panpot values automatically.
116
116
  ```
117
117
 
118
118
  ;; a melody goes near up/down side note without octave commands as default.
119
+ after '(near:off)', near-mode is off.
119
120
 
120
121
  ```
121
122
  [ cdefgab ] 4
@@ -255,6 +256,14 @@ is the same to
255
256
 
256
257
  minus value is for to stroke up. currently, up value affects once only as it simulates playing the guitar.
257
258
 
259
+
260
+ to skip cmd for repetition, use pre '^'. so '(:-)' in an example below means '(stroke:-)'
261
+
262
+ ```
263
+ (stroke:4) {a,b,c} = = (^skipCmd:..) (:-) = = =
264
+ ```
265
+
266
+
258
267
  ## sharp, flat
259
268
  ;; note name etc. is case sencitive, so each of 12 notes in one octave can be expressed by one charactor.
260
269
  ;; but in other cases,
@@ -640,6 +649,22 @@ another random note.
640
649
  (?:a,b,40,45,90,12) ;; select from a note number or name list.
641
650
  ```
642
651
 
652
+
653
+ 'n' as next note, case by case.
654
+
655
+ ```
656
+ ennn ;; upside next note ; efga
657
+ eNNN ;; downside next note ; edcb
658
+ (cStack:f,g,c):N,:N,:N, ;; next chord in chordStack ; :f,:g,:c,
659
+ ```
660
+
661
+ to change 'n', next note type, to up/down/random in scale, use
662
+
663
+ ```
664
+ (nType:up)
665
+ ```
666
+
667
+
643
668
  ## tonality
644
669
 
645
670
  ```
@@ -855,6 +880,8 @@ now, note type commands are :
855
880
  ? ;; random note
856
881
  o ;; dummy note ; use a random note if there is no substitution command
857
882
  m ;; multi dummy note ; similiar to '{?,?,?}'
883
+ n ;; next up note ; cnnn => cdef
884
+ N ;; next down note ; cNNN => cbag
858
885
  ```
859
886
 
860
887
  and other commands are with parentheses.
@@ -921,18 +948,33 @@ easy way to express fuzzy swing rythm.
921
948
  (setSwing: 2, 2.4)(setSwing: 1, 0.6) /:a2,b1,/
922
949
  (setSwing: 2, 1.8)(setSwing: 1, 1.2) /:a2,b1,/
923
950
  ```
951
+
924
952
  series of ```ab``` ,
925
953
  just 2:1, first longer, first shorter. rythm will be broken if setting part is wrong.
926
954
 
927
955
  ```
928
956
  (setSwing: 2of3, 2.4)/:a2,b1,/
957
+ (setSwing: 2of3, 80%)/:a2,b1,/
929
958
  ```
930
959
 
931
- same as the second line of above. key value must be integer, not float.
960
+ the first line is the same as the second line of above. key value must be integer, not float.
932
961
  '2of3' and '1of5' can be used at once, but rythm will not be what you predict.
933
962
  value for 1of3 , set by rest of 2of3, is overwitten by 1of5.
934
963
  there is no way to help it.
935
964
 
965
+
966
+ the second line sets values by percentage ; 1of3:2of3 => 20%of3:80%of3 => 0.6:2.4.
967
+
968
+
969
+ ```
970
+ (setSwing: 1, shorter)(setSwing: 2of3, rest) ;; after that, /:a1,b2,/ => /:a0.9b2.1/
971
+ (setSwing: 1, shorter2)(setSwing: 2of3, rest) ;; now value is 0.9**2, 0.81, and so on.
972
+ (setSwing: 1, longer)(setSwing: 2of3, rest) ;; /:a1,b2,/ => /:a1.1b1.9/
973
+ ```
974
+
975
+ set 1 shorter/longer then set 2of3 the rest of it.
976
+
977
+
936
978
  ;; register of modifiers
937
979
 
938
980
  ```
@@ -1017,14 +1059,18 @@ i play the piano and other instruments, but it took another long time to learn w
1017
1059
  at first i felt like starting write music again in a computer, windows pc. i searched softwares.
1018
1060
  midi is best for me, i thought. cherry is good. i tried it by my pc keyboard.
1019
1061
  soon i felt uncomfortable. it is too ...
1062
+
1063
+
1020
1064
  i plays the piano that has midi out/in. for me, i thought it is better to use a stand alone midi sequencer with connecting my e-piano as a keyboard.
1021
1065
  i got and tried QY70 etc.
1022
1066
  it was useful.
1023
1067
  a little bit later, again, i felt uncomfortable. it is too much ...
1068
+
1069
+
1024
1070
  set chords, select preset tracks, set melodies, then soon i was able to listen music. great. too much useful, i don't need to complete details.
1025
1071
  dont need to study or make jazz, latin, ethnic patterns. only to do is to select preset ones.
1026
1072
  to play the piano is not too difficult, but to play with click sounds is not comfortable. it is not interesting work.
1027
- it is better than midi event writing with a pc keyboard. but it must be another way to write music for me and some people who don't wanna be machines.
1073
+ it is better than midi event writing with a pc keyboard. but there must be another way to write music for me and some people who don't wanna be machines.
1028
1074
  MML is best for writing music easily, if able to sing do-re-mi.
1029
1075
  let's say good-bye to irritate click sounds, mouses and pianos?! lol
1030
1076
 
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.13
4
+ version: 0.1.14.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-10-03 00:00:00.000000000 Z
11
+ date: 2014-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler