smml 0.1.13 → 0.1.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|