Overview
Comment: | Fixed program to now handle notes with accidentals |
---|---|
Timelines: | family | ancestors | descendants | both | feature/diskin2 |
Files: | files | file ages | folders |
SHA1: |
b5a8b202425e299491f6a7e3d9f1dd75 |
User & Date: | brian on 2011-11-03 18:34:00 |
Other Links: | branch diff | manifest | tags |
Context
2011-11-03
| ||
18:49 | By magic, fixed problem with not all bass notes playing via diskin2 Closed-Leaf check-in: 1bc01ba9c9 user: brian tags: feature/diskin2 | |
18:34 | Fixed program to now handle notes with accidentals check-in: b5a8b20242 user: brian tags: feature/diskin2 | |
2011-11-01
| ||
19:46 | Got diskin2 sample method partially working; it won't play all of the files, though check-in: c9abf46a9f user: brian tags: feature/diskin2 | |
Changes
Modified parse.py from [2afbfc4534] to [a8d0994825].
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 .. 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 ... 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 ... 151 152 153 154 155 156 157 158 159 160 161 162 163 |
from ply import lex, yacc class Note(): def __init__(self, value, duration=1, octave=8): self.value = value self.duration = duration self.octave = octave self.accidental = None def __repr__(self): return "Note %s %s %s" % (self.value, self.duration, self.octave) class Chord(): def __init__(self, value, duration=1, chord_type="major", octave=5): self.value = value self.duration = duration ................................................................................ "NODE", ) t_ignore = " |" t_BASENOTE = r"[A-Ga-g]" # t_BASENOTE = r"I+V?|VI*|i+v?|vi*" t_ACCIDENTAL = r"\^{1,2}|_{1,2}|=" t_REST = r"z" t_OCTAVE = r"'+|,+" t_CHORD_TYPE = r"m|7|m7|0|o|\+|mb5|sus|sus4|maj7|mmaj7|7sus4|dim|dim7|7b5|m7b5|6|b6|m6|mb6|46|maj9|9|add9|7b9|m9" t_PAREN = "\(|\)" t_SYNCOPATE = "\+|-" t_NODE = r"\([a-zA-Z0-9_-]+\)" ................................................................................ ''' note.syncopate = p[2] def p_accidental(p): '''note : ACCIDENTAL note ''' p[2].accidental = p[1] p[0] = p[2] def p_octave(p): '''note : note OCTAVE ''' count = len(p[2]) increment_or_decrement = 1 if p[2].startswith("'") else -1 ................................................................................ def p_node(p): '''node : NODE ''' p[0] = tree.Tree(p[1].strip("(").strip(")")) def p_error(p): print p raise Exception("Syntax error at '%s' of element type %s" % (p.value, p.type)) yacc.yacc() return yacc.parse(score) |
< | | > > > > > |
4 5 6 7 8 9 10 11 12 13 14 15 16 17 .. 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 ... 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 ... 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
from ply import lex, yacc class Note(): def __init__(self, value, duration=1, octave=8): self.value = value self.duration = duration self.octave = octave def __repr__(self): return "Note %s %s %s" % (self.value, self.duration, self.octave) class Chord(): def __init__(self, value, duration=1, chord_type="major", octave=5): self.value = value self.duration = duration ................................................................................ "NODE", ) t_ignore = " |" t_BASENOTE = r"[A-Ga-g]" # t_BASENOTE = r"I+V?|VI*|i+v?|vi*" t_ACCIDENTAL = r"\^{1}|_{1}|=" t_REST = r"z" t_OCTAVE = r"'+|,+" t_CHORD_TYPE = r"m|7|m7|0|o|\+|mb5|sus|sus4|maj7|mmaj7|7sus4|dim|dim7|7b5|m7b5|6|b6|m6|mb6|46|maj9|9|add9|7b9|m9" t_PAREN = "\(|\)" t_SYNCOPATE = "\+|-" t_NODE = r"\([a-zA-Z0-9_-]+\)" ................................................................................ ''' note.syncopate = p[2] def p_accidental(p): '''note : ACCIDENTAL note ''' if p[1] == "^": p[2].value += "#" else: p[2].value += "b" p[0] = p[2] def p_octave(p): '''note : note OCTAVE ''' count = len(p[2]) increment_or_decrement = 1 if p[2].startswith("'") else -1 ................................................................................ def p_node(p): '''node : NODE ''' p[0] = tree.Tree(p[1].strip("(").strip(")")) def p_error(p): # import ipdb # ipdb.set_trace() print p raise Exception("Syntax error at '%s' of element type %s" % (p.value, p.type)) yacc.yacc() return yacc.parse(score) |
Modified spiffyscore.py from [7509ae0a18] to [d189f30210].
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
...
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
|
# },
"follow_instr": { # Instrument 'melody'
"score_line": "i3 %(time)f %(duration)f 7000 %(octave)d.%(note)s",
# "sync": "lead_instr",
"octave": 2,
"duration": 30,
"grammars": { # Notes for this instrument to use in this piece
"u": ["E F G E (v)"],
"v": ["G A A A (e)", "G A A A (v)"],
"e": ["B A G A (v)"],
},
},
},
},
}
print '''f1 0 512 10 1
f2 0 8192 10 .24 .64 .88 .76 .06 .5 .34 .08
................................................................................
total += n.duration
return total
def generate_csound_score(score, score_line, t):
csound_note_values = {
"C": "00",
"C#": "01",
"D": "02",
"D#": "03",
"E": "04",
"F": "05",
"F#": "06",
"G": "07",
"G#": "08",
"A": "09",
"A#": "10",
"B": "11",
}
csound_score = []
for token in score:
if isinstance(token, parse.Chord): # Chords
for note in token.chord:
note = csound_note_values[note]
csound_score.append(score_line % {"time": t, "octave": token.octave, "note": note, "duration": token.duration})
elif isinstance(token, parse.Note): # Individual notes
note = csound_note_values[token.value]
csound_score.append(score_line % {"time": t, "octave": token.octave, "note": note, "duration": token.duration})
elif isinstance(token, tree.Tree):
continue
t += token.duration
return csound_score
if __name__ == "__main__": main()
|
>
|
|
|
|
|
|
|
|
>
|
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
...
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
|
# }, "follow_instr": { # Instrument 'melody' "score_line": "i3 %(time)f %(duration)f 7000 %(octave)d.%(note)s", # "sync": "lead_instr", "octave": 2, "duration": 30, "grammars": { # Notes for this instrument to use in this piece "u": ["A ^A B C ^C D ^D E F ^F G ^G"], # "u": ["E F G E (v)"], # "v": ["G A A A (e)", "G A A A (v)"], # "e": ["B A G A (v)"], }, }, }, }, } print '''f1 0 512 10 1 f2 0 8192 10 .24 .64 .88 .76 .06 .5 .34 .08 ................................................................................ total += n.duration return total def generate_csound_score(score, score_line, t): csound_note_values = { "C": "00", "C#": "01", "Db": "01", "D": "02", "D#": "03", "Eb": "03", "E": "04", "F": "05", "F#": "06", "Gb": "06", "G": "07", "G#": "08", "Ab": "08", "A": "09", "A#": "10", "Bb": "10", "B": "11", } csound_score = [] for token in score: if isinstance(token, parse.Chord): # Chords for note in token.chord: note = csound_note_values[note] csound_score.append(score_line % {"time": t, "octave": token.octave, "note": note, "duration": token.duration}) csound_score.append(score_line % {"time": t, "octave": token.octave, "note": note, "duration": token.duration}) elif isinstance(token, parse.Note): # Individual notes note = csound_note_values[token.value] csound_score.append(score_line % {"time": t, "octave": token.octave, "note": note, "duration": token.duration}) elif isinstance(token, tree.Tree): continue t += token.duration return csound_score if __name__ == "__main__": main() |