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 +4 -4
- data/lib/smml/msm.rb +130 -21
- data/lib/smml/version.rb +1 -1
- data/tutorial_smml.md +48 -2
- 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: 28e0baacf3d9353733f053491b93b434a4588be4
|
4
|
+
data.tar.gz: 643c31f2dce680edc672956aeecfe64d7318b7f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 489a4173ea0e7fc0c4ac97bea96db96529797d6c609fece01b9501cafc1c9f81f4913471edfd2a61ed12a5650623dbd5d73e9a1ad75da594c6349f30c8ff8a9e
|
7
|
+
data.tar.gz: b4c22c2cc0d337ab16a189729ea6e9dcadb7fdea888bf7334f588b8e573bc08d12e05948f4054035463ddfe2cd410d9777671430efc68983e5329b42afe6ef6b
|
data/lib/smml/msm.rb
CHANGED
@@ -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
|
-
@
|
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
|
-
|
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} #{
|
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} #{
|
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} #{
|
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 @
|
1744
|
+
if @updown==:down && @lastRandNote
|
1695
1745
|
key-=12 while key>@lastRandNote && key>12
|
1696
|
-
elsif
|
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
|
-
|
1707
|
-
|
1756
|
+
case key
|
1757
|
+
when "?"
|
1708
1758
|
key=rndNote
|
1709
|
-
|
1710
|
-
|
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
|
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,
|
2472
|
-
v=
|
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
|
-
|
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=
|
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
|
data/lib/smml/version.rb
CHANGED
data/tutorial_smml.md
CHANGED
@@ -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
|
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.
|
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-
|
11
|
+
date: 2014-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|