smml 0.1.12 → 0.1.13
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 +149 -18
- data/lib/smml/version.rb +1 -1
- data/tutorial_smml.md +81 -16
- 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: 7e98825702f8770b16248f090e7dca0a3890eb91
|
4
|
+
data.tar.gz: d2b6e346dbd790585f5534e8f626e1635bac8cbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65904b8614d1f1df18564cfa439f54219a8dfb1518709582d42a3a06fcf58bc60566fd162b6a92bf26ca48cbf9c665b179ea1193001442ff54faf2b28d9cf52d
|
7
|
+
data.tar.gz: 43fd189cf0d48058b21d802b4f62b55eb293b4fbe33e669c907f3197b434e79aaa2fec21b50f6a1c3356965fc85db1db664da71e0bc002339fc66914de1b423b
|
data/lib/smml/msm.rb
CHANGED
@@ -117,6 +117,8 @@ syntax: ...( will be changed time after time)
|
|
117
117
|
'{d,g,-b}' => multi note
|
118
118
|
':cmaj7,' => chord name
|
119
119
|
and other commands are with parentheses.
|
120
|
+
|
121
|
+
for more details, see tutorial_smml.md
|
120
122
|
EOF
|
121
123
|
end
|
122
124
|
def hint
|
@@ -289,10 +291,10 @@ module MmlReg
|
|
289
291
|
self.r(key,sort,pre)
|
290
292
|
end
|
291
293
|
def self.trackr
|
292
|
-
self.r([:hexraw,:sharp,:chord,:
|
294
|
+
self.r([:hexraw,:sharp,:chord,:chword,:word,:sound,:tieNote,:register,:modifier,:velocity,:tempo,:num,:octave,:note2,:note,:mod,:note?,:sound?])
|
293
295
|
end
|
294
296
|
def self.multipletr
|
295
|
-
self.r([:note2,:
|
297
|
+
self.r([:note2,:chword,:word,:note,:sound,:tieNote,:register,:chord,:numswing,:num,:sharp,:octave,:mod])
|
296
298
|
end
|
297
299
|
def self.macroDefr
|
298
300
|
self::MacroDef
|
@@ -319,7 +321,7 @@ module MmlReg
|
|
319
321
|
:repStart,
|
320
322
|
:repEnd,
|
321
323
|
:note2,
|
322
|
-
:
|
324
|
+
:chword,
|
323
325
|
:word,
|
324
326
|
:modifier,
|
325
327
|
:sharp,
|
@@ -356,7 +358,8 @@ module MmlReg
|
|
356
358
|
@@h[:repmark]="\\.FINE|\\.DS|\\.DC|\\.\\$|\\.toCODA|\\.CODA|\\.SKIP"
|
357
359
|
@@h[:comment]="\\( *comment[^\(\)]*\\)"
|
358
360
|
@@h[:note2]="\\( *tne *:[^\(\)]*\\)|\\( *[[:alpha:]\\-\\+]+,[^,]*\\)"
|
359
|
-
|
361
|
+
# parenthesis arg, chord inside etc.
|
362
|
+
@@h[:chword]="\\([^\(\):,]*:[^\(\),]+\\([^\(\)]+\\)\\)"
|
360
363
|
@@h[:word]="\\([^\(\):,]*:[^\(\)]*\\)"
|
361
364
|
@@h[:wordStart]="\\([^\(\):]*:"
|
362
365
|
@@h[:sharp]="\\([+-]*[[:digit:]\\.]*\\)"
|
@@ -597,6 +600,7 @@ class Chord
|
|
597
600
|
end
|
598
601
|
class Notes < Hash
|
599
602
|
@@rythmChannel=9
|
603
|
+
@@defaultbase="c"
|
600
604
|
@@notes={
|
601
605
|
"c"=>0,
|
602
606
|
"C"=>1,
|
@@ -621,7 +625,19 @@ class Notes < Hash
|
|
621
625
|
def initialize
|
622
626
|
@@notes.each{|k,v|self[k]=v}
|
623
627
|
end
|
624
|
-
def self.
|
628
|
+
def self.offset a,b="c"
|
629
|
+
r=@@notes[a]-@@notes[b]
|
630
|
+
if r>6
|
631
|
+
r-=12
|
632
|
+
elsif r<-6
|
633
|
+
r+=12
|
634
|
+
else
|
635
|
+
end
|
636
|
+
r
|
637
|
+
end
|
638
|
+
def self.n2note num,base="c"
|
639
|
+
offset=self.offset(base,@@defaultbase)
|
640
|
+
num+=offset
|
625
641
|
@@invert[num%@@octave]
|
626
642
|
end
|
627
643
|
def self.n2octave num
|
@@ -647,6 +663,102 @@ class Notes < Hash
|
|
647
663
|
pre+@@invert[num%@@octave]
|
648
664
|
end
|
649
665
|
end
|
666
|
+
class Tonality
|
667
|
+
def initialize key="c"
|
668
|
+
@scalenotesize=7
|
669
|
+
@naturalscale=[*"a".."g"]
|
670
|
+
@sharp=[:f,:c,:g,:d,:a,:e,:b]
|
671
|
+
@flat=@sharp.reverse
|
672
|
+
@arabic=[0,1,4,5,7,8,10]
|
673
|
+
@cycle=[:c,:f,:A,:D,:G,:C,:F,:b,:e,:a,:d,:g,:c]
|
674
|
+
@cf={}
|
675
|
+
@cs={}
|
676
|
+
@bymarkcount={}
|
677
|
+
@sfnow={}
|
678
|
+
7.times{|n|
|
679
|
+
i=@cycle[n]
|
680
|
+
@cycle.index(i).times{|s|
|
681
|
+
@cf[i]=[] if ! @cf[i]
|
682
|
+
@cf[i]<<@flat[s]
|
683
|
+
}
|
684
|
+
}
|
685
|
+
7.times{|n|
|
686
|
+
i=@cycle.reverse[n]
|
687
|
+
@cycle.reverse.index(i).times{|s|
|
688
|
+
@cs[i]=[] if ! @cs[i]
|
689
|
+
@cs[i]<<@sharp[s]
|
690
|
+
}
|
691
|
+
}
|
692
|
+
7.times{|i|@bymarkcount[i]=@cycle.reverse[i]}
|
693
|
+
7.times{|i|@bymarkcount[-i]=@cycle[i]}
|
694
|
+
self.set(key)
|
695
|
+
end
|
696
|
+
def sharp t
|
697
|
+
@cs[t.to_sym]
|
698
|
+
end
|
699
|
+
def flat t
|
700
|
+
@cf[t.to_sym]
|
701
|
+
end
|
702
|
+
def setBySharp t,scale
|
703
|
+
return if scale.size>@scalenotesize
|
704
|
+
sc=scale.map{|i|Notes.n2note(i,t)}
|
705
|
+
offset=Notes.offset(t)
|
706
|
+
@naturalscale=@naturalscale.rotate while @naturalscale[0]!=t.downcase
|
707
|
+
r=[]
|
708
|
+
@scalenotesize.times{|i|
|
709
|
+
a=Notes.offset(sc[i],@naturalscale[i])
|
710
|
+
@sfnow[@naturalscale[i].to_sym]=a if a!=0
|
711
|
+
r<<a
|
712
|
+
}
|
713
|
+
r
|
714
|
+
end
|
715
|
+
def setArabic base
|
716
|
+
setBySharp(base,@arabic)
|
717
|
+
end
|
718
|
+
def tonalitycheck t,sfnote=false
|
719
|
+
t=@bymarkcount[t.to_i] if t=~/^[-+[:digit:]]/
|
720
|
+
if t=~/m$/
|
721
|
+
# use relative major tonality data
|
722
|
+
t=$`.to_sym
|
723
|
+
t=@cycle[(@cycle.index(t)+3)%12]
|
724
|
+
end
|
725
|
+
t=t.to_sym
|
726
|
+
cf=sfnote ? (@cf[t]||[]) : (@cf[t]||[]).size
|
727
|
+
cs=sfnote ? (@cs[t]||[]) : (@cs[t]||[]).size
|
728
|
+
case @cycle.index(t)
|
729
|
+
when 0...7
|
730
|
+
[:flat,cf]
|
731
|
+
else
|
732
|
+
[:sharp,cs]
|
733
|
+
end
|
734
|
+
end
|
735
|
+
def set t
|
736
|
+
@key=t
|
737
|
+
@sfnow={}
|
738
|
+
if t=~/ *arabic/
|
739
|
+
setArabic($`)
|
740
|
+
elsif t=~/,/
|
741
|
+
base,*sc=t.split(',')
|
742
|
+
sc=sc.map{|i|i.to_i}
|
743
|
+
setBySharp(base,sc)
|
744
|
+
else
|
745
|
+
r=tonalitycheck(t,true)
|
746
|
+
r[1].each{|i|@sfnow[i]=r[0]}
|
747
|
+
end
|
748
|
+
end
|
749
|
+
def getSharp n
|
750
|
+
n=n.to_sym
|
751
|
+
case @sfnow[n]
|
752
|
+
when -2..2 then @sfnow[n]
|
753
|
+
when :sharp then 1
|
754
|
+
when :flat then -1
|
755
|
+
else 0
|
756
|
+
end
|
757
|
+
end
|
758
|
+
def dump
|
759
|
+
[:now_cf_cs,[@sfnow,@cf,@cs].map{|i|i.map{|k,v|"#{k} #{v.class==Array ? v.sort : v}"}}]
|
760
|
+
end
|
761
|
+
end
|
650
762
|
class ScaleNotes < Array
|
651
763
|
def setSampleRate c
|
652
764
|
@samplerate=c
|
@@ -1244,6 +1356,7 @@ module MidiHex
|
|
1244
1356
|
# initialize
|
1245
1357
|
def self.prepare bpm=120,tbase=480,vel=0x40,oct=:near,vfuzzy=2,strict=false
|
1246
1358
|
@ready=true
|
1359
|
+
@tonality=Tonality.new("c")
|
1247
1360
|
@bendHalfMax=BendHalf
|
1248
1361
|
@strictmode=strict
|
1249
1362
|
@autopan= strict ? false : true
|
@@ -1299,11 +1412,11 @@ module MidiHex
|
|
1299
1412
|
end
|
1300
1413
|
def self.setDefault
|
1301
1414
|
@prepareSet=[
|
1302
|
-
@tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef,@registerHash,@swingHash
|
1415
|
+
@tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef,@registerHash,@swingHash,@tonality
|
1303
1416
|
]
|
1304
1417
|
end
|
1305
1418
|
def self.getDefault
|
1306
|
-
@tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef,@registerHash,@swingHash=
|
1419
|
+
@tbase,@ch,@velocity,@expression,@velocityFuzzy,@basekey,@gateRate,@bendCentOn,@bendrange,@bendCent,@bendNow,@scalenotes,@gtune,@expressionRest,@expressionDef,@registerHash,@swingHash,@tonality=
|
1307
1420
|
@prepareSet
|
1308
1421
|
end
|
1309
1422
|
def self.dumpstatus
|
@@ -1312,6 +1425,9 @@ module MidiHex
|
|
1312
1425
|
p [i, val] if "#{val}".size<100
|
1313
1426
|
}
|
1314
1427
|
end
|
1428
|
+
def self.setTonality n
|
1429
|
+
@tonality.set(n)
|
1430
|
+
end
|
1315
1431
|
def self.setmidiname name
|
1316
1432
|
@midiname=name
|
1317
1433
|
end
|
@@ -1453,6 +1569,15 @@ module MidiHex
|
|
1453
1569
|
l,r=len,0 if len<lenforgate
|
1454
1570
|
[l,r]
|
1455
1571
|
end
|
1572
|
+
def self.notesharp note,sharp
|
1573
|
+
s=0
|
1574
|
+
if sharp!=0
|
1575
|
+
s=sharp
|
1576
|
+
else
|
1577
|
+
s=@tonality.getSharp(note)
|
1578
|
+
end
|
1579
|
+
s
|
1580
|
+
end
|
1456
1581
|
def self.soundOn key=@basekey,velocity=@velocity,ch=@ch,sharp=0
|
1457
1582
|
key=self.note2key(key) if key.class==String
|
1458
1583
|
key,ch=key if key.class==Array
|
@@ -1611,6 +1736,7 @@ module MidiHex
|
|
1611
1736
|
end
|
1612
1737
|
def self.noteCalc c,last,base
|
1613
1738
|
n=@notes[c]
|
1739
|
+
n+=self.notesharp(c,0)
|
1614
1740
|
if @octmode==:near && n.class != Array
|
1615
1741
|
if last
|
1616
1742
|
n+=12 if last-n>6
|
@@ -2026,7 +2152,7 @@ module MidiHex
|
|
2026
2152
|
k=if tone=~/^_/
|
2027
2153
|
[self.percussionGet(tone),@rythmChannel]
|
2028
2154
|
elsif @notes.keys.member?(i)
|
2029
|
-
@basekey+oct*12+@notes[i]
|
2155
|
+
@basekey+oct*12+@notes[i]+self.notesharp(i,0)
|
2030
2156
|
else
|
2031
2157
|
i.to_i
|
2032
2158
|
end
|
@@ -2077,9 +2203,8 @@ module MidiHex
|
|
2077
2203
|
@chordCenter=[[0,@chordCenter].max,0x7f].min
|
2078
2204
|
@firstchordbase=@chordCenter
|
2079
2205
|
end
|
2080
|
-
# todo: use scale name
|
2081
2206
|
def self.scale s
|
2082
|
-
s=s.
|
2207
|
+
s=s.scan(/[^,]-[^-,]+|[-+]+[[:digit:]]+|[^()]*\([^()]+\)|[^,]+|,/)-[","]
|
2083
2208
|
first=s.first
|
2084
2209
|
mode=s[1]
|
2085
2210
|
if s.size==1
|
@@ -2087,18 +2212,19 @@ module MidiHex
|
|
2087
2212
|
when /^[-+]/
|
2088
2213
|
shift=first.to_i
|
2089
2214
|
@scalenotes=@scalenotes.move(shift)
|
2215
|
+
when /^(.)-([^-]+)$/
|
2216
|
+
f,mode=$1,$2
|
2217
|
+
@scalenotes.reset
|
2218
|
+
@scalenotes.setmode(f,:"#{mode}")
|
2090
2219
|
when /^:?(.)(.*)/
|
2091
2220
|
@scalenotes.reset
|
2092
2221
|
base=$1
|
2093
2222
|
ten=Chord.type($2)
|
2094
2223
|
ten.each{|i|
|
2095
|
-
note=Notes.get(base,i)
|
2224
|
+
note=Notes.get(base,i)
|
2096
2225
|
@scalenotes<<note
|
2097
2226
|
}
|
2098
2227
|
end
|
2099
|
-
elsif @scalenotes.keys.member?(:"#{mode}")
|
2100
|
-
@scalenotes.reset
|
2101
|
-
@scalenotes.setmode(first,:"#{mode}")
|
2102
2228
|
else
|
2103
2229
|
@scalenotes.reset
|
2104
2230
|
s.each{|i|
|
@@ -2365,8 +2491,8 @@ module MidiHex
|
|
2365
2491
|
vars=self.instance_variables.map{|i|i.to_s[1..-1]}.sort
|
2366
2492
|
s=v.split(',')
|
2367
2493
|
s.each{|v|
|
2368
|
-
v=~/\A[[:alnum:]]
|
2369
|
-
if $& && vars.member?(
|
2494
|
+
v=~/\A([[:alnum:]]+)[[:alnum:].]*\z/
|
2495
|
+
if $& && vars.member?($1)
|
2370
2496
|
puts "@#{v} #{eval("@#{v}")}"
|
2371
2497
|
elsif v=="?"
|
2372
2498
|
puts vars*", "
|
@@ -2649,6 +2775,8 @@ module MidiHex
|
|
2649
2775
|
when MmlReg.rr([:register])
|
2650
2776
|
i=~/[[:digit:]]+/
|
2651
2777
|
@h<<[:call,:register,$&]
|
2778
|
+
when /^\(tonality:(.*)\)/
|
2779
|
+
@h<<[:call,:setTonality,$1]
|
2652
2780
|
when /^\(set":(.*)\)/
|
2653
2781
|
d=$1.split(",")
|
2654
2782
|
@h<<[:call,:setRegister,*d]
|
@@ -3303,8 +3431,11 @@ def repCalc line,macro,tbase
|
|
3303
3431
|
pointDS=countertmp
|
3304
3432
|
when ";"
|
3305
3433
|
current=""
|
3306
|
-
when /^\(([^\)]+):$/
|
3307
|
-
|
3434
|
+
when /^\((\^)?([^\)]+):$/
|
3435
|
+
mark,cmd=$1,$2
|
3436
|
+
# (reUsedCmd:arg) (^onceOnlyCmd:arg)
|
3437
|
+
lastcmd=cmd if ! mark && cmd != "C"
|
3438
|
+
current="(#{cmd}:"
|
3308
3439
|
when "(:"
|
3309
3440
|
current="(#{lastcmd}:"
|
3310
3441
|
else
|
data/lib/smml/version.rb
CHANGED
data/tutorial_smml.md
CHANGED
@@ -193,7 +193,7 @@ direct tention order by pre ':' with a half note distance number from chord base
|
|
193
193
|
```
|
194
194
|
|
195
195
|
in chord name, generally numbers don't mean chromatic distance. don't confuse.
|
196
|
-
easy way of counting distance number in chord is to count only white key ignoring black on a piano.
|
196
|
+
when key is c major etc., scale not using sharps/flats , easy way of counting distance number in the chord is to count only white key ignoring black on a piano.
|
197
197
|
+5 means a sharp of 5th. if there is perfect 5th in the chord, 5th note will be deleted by '(+5)' because they don't appear together generally.
|
198
198
|
when you want to use abnormal tentions like conbination of these, direct order can be used like 'c7(:8)' on your own risk.
|
199
199
|
:8 expresses a note sharp of 5th by a half note expression. count all of the white and black key between c and g sharp on a piano.
|
@@ -218,6 +218,11 @@ list of chromatic scale expression is here, (when base note is 'c')
|
|
218
218
|
:12 c (next octave)
|
219
219
|
```
|
220
220
|
|
221
|
+
as an useless example, the chord using all 12 notes of an octave is 'c(:0,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11)'
|
222
|
+
|
223
|
+
normally important tention notes are used in high positions, but now it is not considered in chord transpose calculating.
|
224
|
+
all notes are considered as even importances.
|
225
|
+
|
221
226
|
|
222
227
|
## tempo
|
223
228
|
;; most commands except note type ones, are inside parenthesis. set the tempo 120 bpm.
|
@@ -287,6 +292,7 @@ this multi-tone passage is repeated four times. ```:0``` is 'c' and ```:1``` is
|
|
287
292
|
_snare! = = =
|
288
293
|
```
|
289
294
|
|
295
|
+
|
290
296
|
;; set instrument. automaticaly searched by even not exact name. (MIDI program change command)
|
291
297
|
it depend on map files.
|
292
298
|
|
@@ -583,8 +589,30 @@ in the same way,
|
|
583
589
|
is same mean to above. 'o' is dummy note. note hights are substituted by '(N:..)' values.
|
584
590
|
|
585
591
|
|
592
|
+
## scale
|
593
|
+
|
594
|
+
scale values are used for random notes only now.
|
595
|
+
|
596
|
+
|
597
|
+
definition:
|
598
|
+
|
599
|
+
```
|
600
|
+
(scale:a,b,c,d,e) ;; series of note names
|
601
|
+
(scale:d-dorian) ;; starting note and mode name. this will be '(scale:d,e,f,g,a,b,c)'
|
602
|
+
(scale:a,+2,+3,+5,+7,+9,+11) ;; first note and plus values to add to first note
|
603
|
+
(scale:+5) ;; shift all values from preceding scale. after above scale, this will be '(scale:d, ...)'.
|
604
|
+
(scale:g7) ;; by chord name
|
605
|
+
(scale:) ;; reset scale value
|
606
|
+
```
|
607
|
+
|
608
|
+
shift value is by a half tone.
|
609
|
+
when arg size of a scale command is one, it is manipulated as a chord name, mode name, or relative shift value.
|
610
|
+
still incompleted to use.
|
611
|
+
|
586
612
|
## dummy note
|
587
613
|
'o' is dummy. '?' is for random note etc.
|
614
|
+
if a scale has been defined as above, random notes will be selected from its scale notes.
|
615
|
+
|
588
616
|
|
589
617
|
```
|
590
618
|
? /2: ???? /
|
@@ -603,26 +631,36 @@ or maybe
|
|
603
631
|
```
|
604
632
|
|
605
633
|
etc.
|
606
|
-
|
634
|
+
|
635
|
+
|
636
|
+
another random note.
|
607
637
|
|
608
638
|
```
|
609
|
-
(
|
610
|
-
(
|
611
|
-
(scale:+5) ;; shift all values from preceding scale. after above scale, this will be '(scale:d, ...)'.
|
612
|
-
(scale: :g7, ) ;; by chord name
|
639
|
+
[ (?:56-58) ] 4 ;; use range 56 to 58, note number. in this case, 4 times repeating maybe '{56}{56}{58}{57}' etc.
|
640
|
+
(?:a,b,40,45,90,12) ;; select from a note number or name list.
|
613
641
|
```
|
614
642
|
|
615
|
-
|
616
|
-
|
643
|
+
## tonality
|
644
|
+
|
645
|
+
```
|
646
|
+
(tonality:d)
|
647
|
+
(tonality:+2)
|
648
|
+
```
|
617
649
|
|
650
|
+
set tonality 'd', d major. 'dm' as d minor.
|
651
|
+
after above, 'defgabcd' will become 'deFgabCd' automaticaly by two sharps, so '+2' can be used as an argument.
|
652
|
+
still under construction.
|
618
653
|
|
619
|
-
another random note.
|
620
654
|
|
621
655
|
```
|
622
|
-
|
623
|
-
(?:a,b,40,45,90,12) ;; select from a note number or name list.
|
656
|
+
(tonality:D)efgabcde
|
624
657
|
```
|
625
658
|
|
659
|
+
in above, the tonality is 'D' major, e flat major, so following e, a, and b are flat notes.
|
660
|
+
feel strange a little bit? i think so too.
|
661
|
+
|
662
|
+
|
663
|
+
|
626
664
|
## transpose
|
627
665
|
|
628
666
|
```
|
@@ -951,19 +989,46 @@ but now blanks are removed. someday maybe fixed ?
|
|
951
989
|
(dumpVar: varName)
|
952
990
|
```
|
953
991
|
|
954
|
-
directly set local MidiHex variable, dump while compiling if the varName and value are valid.
|
992
|
+
directly set local MidiHex variable, dump while compiling if the varName (with noe method) and value are valid.
|
993
|
+
|
955
994
|
|
956
995
|
# syntax implement policy:
|
957
996
|
|
958
997
|
|
959
998
|
parenthesis command is buil with (name:value,value,...). names often used are shorter, or leave it as it is as possible.
|
960
999
|
|
961
|
-
|
962
|
-
sound is modifier + note + length word.
|
963
|
-
|
1000
|
+
sound is modifier + note + length word. modifiers are effective for one note only against premodifier etc., parenthesis commands, are for permanent effects.
|
964
1001
|
|
965
1002
|
let it not too complicated in sound part for visibility.
|
966
1003
|
especially, for other words not to hide note type words.
|
967
1004
|
|
968
|
-
|
969
1005
|
many values in MIDI are 0-127, so values are integers except pre -/+ values that mean differences.
|
1006
|
+
|
1007
|
+
a priority matter is how to catch up with sound which come to mind and to write down it quickly.
|
1008
|
+
|
1009
|
+
|
1010
|
+
# prologue
|
1011
|
+
|
1012
|
+
one of my neibourhood, who cann't play or write music, said that oh i remember this piano piece i had listened once only you played last time, i am great, great, great?
|
1013
|
+
people can remind or make sounds in their mind easily but it is difficult to write it down except trained.
|
1014
|
+
i play the piano and other instruments, but it took another long time to learn writing down music.
|
1015
|
+
|
1016
|
+
|
1017
|
+
at first i felt like starting write music again in a computer, windows pc. i searched softwares.
|
1018
|
+
midi is best for me, i thought. cherry is good. i tried it by my pc keyboard.
|
1019
|
+
soon i felt uncomfortable. it is too ...
|
1020
|
+
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
|
+
i got and tried QY70 etc.
|
1022
|
+
it was useful.
|
1023
|
+
a little bit later, again, i felt uncomfortable. it is too much ...
|
1024
|
+
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
|
+
dont need to study or make jazz, latin, ethnic patterns. only to do is to select preset ones.
|
1026
|
+
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.
|
1028
|
+
MML is best for writing music easily, if able to sing do-re-mi.
|
1029
|
+
let's say good-bye to irritate click sounds, mouses and pianos?! lol
|
1030
|
+
|
1031
|
+
|
1032
|
+
but i feel that it is too ... too much difficult to read general MMLs and understand and remind sounds ... sometimes.
|
1033
|
+
what can we do? forget music? become a machine? change MML? change the world?
|
1034
|
+
|
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.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tabasano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|