Hello,
I have a question, how hard do you think it would be create a notation engine for GEM? What considerations would go into the design?
On the simplest level, I'm imagining doing non-rhythmic notation to display chords and cells for improvisors.
Since the number of notes on a chord would be determined on the fly, would it be better to create the max amount of objects and turn off unwanted ones, or better to use dynamic patching? This would simply be to create circles representing noteheads.... Here's my imaginary prototype:
[gemhead] | | | [cell G Ab F# F ( or [chords c4 e4 g4 , F#4 G4 B4 ( or [cell 0 4 3 5 2 1 ( | / | / [treble_clef]
Anybody have any idea what kind of messages I might send such an object?
~David
Sayonara,
How do you display the chords in GEM? I personaly use a jazzfont ttf and curves, the attached patch is an attempt to display a score that any reader would understand because it's written like in the Realbook. Unfortunately I didn't finish this project (like many ones), but it might give a clue I hope.
I really don't think that an improvisator will enjoy to have single notes packets to read for each chord, in fact I don't know any improvisator that need to read something else than jazzchords and melodies for playing, unless they have a notice given with the score where the composer has explained all his weird symbols, quite annoying to make, to play, to read, and to hear...for me.
Also I've started a project for writting scores with datastructures, attached archive is an old sample of this datastructure project, done with the help of F. Barkneicht, I've done something more sophisticated, but the purpose wasn't really about reading/playing/learning music but it's just a 'proof of the concept' game, maybe you will see it through the publication of the PureCorps game started last year...
I think that the advantage of scores displayed by a computer is about having pages (or even better the first line) updated automatically when the reader is at the last line.
I will be need of something functionnal for playing in concerts soon, then will certainly make something that will fit my use and reading abilities, I'll also need to write strange tuplets like the ones you can find in FZ's Black Page... If someone is interested I could update this work in pd-announce ? Anyway, all this stuff won't be as powerful as some lilypond external or something similar...
Jaa.
David Powers a écrit :
Hello,
I have a question, how hard do you think it would be create a notation engine for GEM? What considerations would go into the design?
On the simplest level, I'm imagining doing non-rhythmic notation to display chords and cells for improvisors.
Since the number of notes on a chord would be determined on the fly, would it be better to create the max amount of objects and turn off unwanted ones, or better to use dynamic patching? This would simply be to create circles representing noteheads.... Here's my imaginary prototype:
[gemhead] | | | [cell G Ab F# F ( or [chords c4 e4 g4 , F#4 G4 B4 ( or [cell 0 4 3 5 2 1 ( | / | / [treble_clef]
Anybody have any idea what kind of messages I might send such an object?
~David
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list
#N canvas 333 338 624 320 10; #X obj 16 77 gemwin; #X msg 27 54 0 , destroy; #X obj 17 10 loadbang; #N canvas 349 55 555 403 text 0; #X obj 95 33 inlet; #X obj 199 37 inlet; #X obj 129 300 outlet; #X obj 17 220 text2d; #X obj 74 222 text3d; #X obj 131 221 textextruded; #X obj 237 222 textoutline; #X obj 110 144 demux 0 1 2 3; #X obj 236 153 r $0-text; #X obj 320 154 r $0-size; #X floatatom 408 129 5 0 0 0 - - -; #X msg 409 162 depth $1; #X connect 0 0 7 0; #X connect 1 0 7 1; #X connect 3 0 2 0; #X connect 4 0 2 0; #X connect 5 0 2 0; #X connect 6 0 2 0; #X connect 7 0 3 0; #X connect 7 1 4 0; #X connect 7 2 5 0; #X connect 7 3 6 0; #X connect 8 0 6 0; #X connect 8 0 5 0; #X connect 8 0 4 0; #X connect 8 0 3 0; #X connect 9 0 6 1; #X connect 9 0 5 1; #X connect 9 0 4 1; #X connect 9 0 3 1; #X connect 10 0 11 0; #X connect 11 0 5 0; #X restore 425 113 pd text; #X obj 462 83 hradio 15 1 0 4 empty empty empty 0 -8 0 10 -262144 -1 -1 1; #X obj 425 16 gemhead; #X obj 494 229 s $0-text; #X msg 494 200 string $1; #X floatatom 494 174 5 0 0 0 - - -; #X obj 494 149 key; #X obj 210 20 gemhead; #X obj 15 143 s $0-size; #N canvas 330 302 413 328 lignes 0; #X obj 57 148 inlet; #X obj 168 257 outlet; #X obj 319 167 r $0-size; #N canvas 0 0 474 324 drawlines 0; #X obj 116 9 inlet; #X obj 115 201 outlet; #X obj 115 161 list prepend string; #X obj 115 132 list prepend; #X obj 211 130 t l; #X obj 115 90 until; #X msg 115 111 61; #X obj 116 68 t a b; #X obj 116 39 route float; #X obj 115 180 list trim; #X connect 0 0 8 0; #X connect 2 0 9 0; #X connect 3 0 4 0; #X connect 3 0 2 0; #X connect 4 0 3 1; #X connect 5 0 6 0; #X connect 6 0 3 0; #X connect 7 0 5 0; #X connect 7 1 3 1; #X connect 8 0 7 0; #X connect 9 0 1 0; #X restore 237 141 pd drawlines; #X obj 233 96 inlet; #X obj 236 120 i 1; #X msg 124 141 font pgjazz.ttf; #X obj 124 116 loadbang; #X obj 167 228 text3d; #X connect 0 0 8 0; #X connect 2 0 8 1; #X connect 3 0 8 0; #X connect 4 0 5 0; #X connect 5 0 3 0; #X connect 6 0 8 0; #X connect 7 0 6 0; #X connect 8 0 1 0; #X restore 209 156 pd lignes; #X obj 210 61 rotateXYZ; #N canvas 330 143 595 443 clef 0; #X obj 84 109 inlet; #X obj 168 257 outlet; #X obj 343 165 r $0-size; #X msg 135 49 font pgjazz.ttf; #X obj 195 10 loadbang; #X obj 277 164 r $0-clef; #X obj 174 94 s $0-clef; #X msg 323 55 string 38; #X obj 91 163 translateXYZ -25 0 0; #X obj 123 109 inlet; #X obj 168 228 text3d; #X connect 0 0 8 0; #X connect 2 0 10 1; #X connect 3 0 6 0; #X connect 4 0 3 0; #X connect 4 0 7 0; #X connect 5 0 10 0; #X connect 7 0 6 0; #X connect 8 0 10 0; #X connect 9 0 8 1; #X connect 10 0 1 0; #X restore 209 200 pd clef; #X obj 15 104 nbx 5 14 0 200 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 35 256; #X obj 259 128 nbx 3 14 0 200 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 18 256; #X obj 270 22 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; #X obj 280 32 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; #X obj 290 42 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 6900 1; #X obj 247 181 nbx 3 14 -50 50 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 -5 256; #X obj 271 67 hsl 70 10 -30 30 0 1 empty empty empty -2 -8 0 10 -262144 -1 -1 3623 1; #X obj 281 77 hsl 70 10 -30 30 0 1 empty empty empty -2 -8 0 10 -262144 -1 -1 3526 1; #X obj 291 87 hsl 70 10 -30 30 0 1 empty empty empty -2 -8 0 10 -262144 -1 -1 3441 1; #X obj 425 62 rotateXYZ; #X obj 485 23 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 2500 1; #X obj 495 33 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 3300 1; #X obj 505 43 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 2300 1; #X obj 209 107 translateXYZ 0 0 0; #X msg 15 34 dimen 300 200 , create , 1; #X obj 253 229 nbx 3 14 -50 50 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 2.8 256; #N canvas 553 17 434 340 armat 0; #X obj 39 14 inlet; #X obj 133 260 outlet; #X obj 297 111 r $0-size; #X msg 279 32 font pgjazz.ttf; #X obj 281 10 loadbang; #X obj 94 109 translateXYZ -25 0 0; #X obj 132 63 inlet; #X obj 168 228 text3d; #X obj 281 59 s $0-arm; #X obj 231 110 r $0-arm; #N canvas 355 31 498 348 selector 0; #X obj 108 6 r $0-tune; #X obj 108 34 list append $0; #X msg 8 107 ; $1-rep-demux 0; #X msg 44 250 ; $1-rep-demux 1 ; $1-arm-rep 1 ; $1-arm-y 125 ; #X obj 107 54 list trim; #X msg 249 240 ; $1-rep-demux 1 ; $1-arm-rep 1 ; $1-arm-x 0 ; $1-arm-y 1.25; #X obj 108 76 route C C# D D# E F F# G G# A A# B; #X msg 110 158 ; $1-rep-demux 1 ; $1-arm-rep 2 ; $1-arm-x 0 1 ; $1-arm-y 1 1; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 4 0 6 0; #X connect 6 0 2 0; #X connect 6 2 7 0; #X connect 6 7 5 0; #X restore 198 14 pd selector; #N canvas 31 244 293 424 draw-alt 0; #X msg 58 337 string 35; #X obj 42 49 repeat 1; #X obj 42 307 translateXYZ 0 -10 0; #X obj 85 12 r $0-arm-rep; #X obj 42 10 inlet; #X obj 42 380 outlet; #N canvas 0 0 462 379 list-rot 0; #X obj 170 253 list prepend; #X obj 151 44 inlet; #X obj 256 47 inlet; #X obj 151 279 list; #X obj 256 174 mod $1; #X obj 256 152 f $1; #X obj 170 212 list split $1; #X obj 151 70 t b a b b a; #N canvas 0 0 454 304 list-len 0; #X obj 126 70 inlet; #X obj 82 144 list-drip; #X obj 161 209 + 1; #X obj 82 172 b; #X obj 116 249 f; #X obj 116 276 outlet; #X obj 148 183 1; #X obj 132 211 f 1; #X obj 206 213 0; #X obj 126 104 t a b b; #X connect 0 0 9 0; #X connect 1 0 3 0; #X connect 1 1 4 0; #X connect 2 0 7 1; #X connect 3 0 7 0; #X connect 4 0 5 0; #X connect 6 0 7 1; #X connect 7 0 2 0; #X connect 7 0 4 1; #X connect 8 0 4 1; #X connect 9 0 1 0; #X connect 9 1 6 0; #X connect 9 2 8 0; #X restore 293 153 pd list-len; #X obj 151 334 outlet; #X obj 151 307 list split 1; #X connect 0 0 3 1; #X connect 1 0 7 0; #X connect 2 0 5 0; #X connect 3 0 10 0; #X connect 4 0 6 1; #X connect 5 0 4 0; #X connect 6 0 0 0; #X connect 6 1 0 1; #X connect 7 0 3 0; #X connect 7 1 6 0; #X connect 7 2 0 1; #X connect 7 3 5 0; #X connect 7 4 8 0; #X connect 8 0 4 1; #X connect 10 0 9 0; #X restore 168 256 pd list-rot; #X obj 118 98 gem_counter 0 1; #X obj 168 232 list; #X obj 200 183 r $0-arm-y; #N canvas 0 0 462 379 list-rot 0; #X obj 170 253 list prepend; #X obj 151 44 inlet; #X obj 256 47 inlet; #X obj 151 279 list; #X obj 256 174 mod $1; #X obj 256 152 f $1; #X obj 170 212 list split $1; #X obj 151 70 t b a b b a; #N canvas 0 0 454 304 list-len 0; #X obj 126 70 inlet; #X obj 82 144 list-drip; #X obj 161 209 + 1; #X obj 82 172 b; #X obj 116 249 f; #X obj 116 276 outlet; #X obj 148 183 1; #X obj 132 211 f 1; #X obj 206 213 0; #X obj 126 104 t a b b; #X connect 0 0 9 0; #X connect 1 0 3 0; #X connect 1 1 4 0; #X connect 2 0 7 1; #X connect 3 0 7 0; #X connect 4 0 5 0; #X connect 6 0 7 1; #X connect 7 0 2 0; #X connect 7 0 4 1; #X connect 8 0 4 1; #X connect 9 0 1 0; #X connect 9 1 6 0; #X connect 9 2 8 0; #X restore 293 153 pd list-len; #X obj 151 334 outlet; #X obj 151 307 list split 1; #X connect 0 0 3 1; #X connect 1 0 7 0; #X connect 2 0 5 0; #X connect 3 0 10 0; #X connect 4 0 6 1; #X connect 5 0 4 0; #X connect 6 0 0 0; #X connect 6 1 0 1; #X connect 7 0 3 0; #X connect 7 1 6 0; #X connect 7 2 0 1; #X connect 7 3 5 0; #X connect 7 4 8 0; #X connect 8 0 4 1; #X connect 10 0 9 0; #X restore 74 265 pd list-rot; #X obj 74 241 list; #X obj 93 214 r $0-arm-x; #X obj 131 42 - 1; #X floatatom 194 290 5 0 0 0 - - -; #X obj 118 120 t a a; #X obj 43 75 t a b b b b; #X connect 0 0 5 0; #X connect 1 0 16 0; #X connect 2 0 5 0; #X connect 3 0 1 1; #X connect 3 0 13 0; #X connect 4 0 1 0; #X connect 6 0 2 2; #X connect 7 0 15 0; #X connect 8 0 6 0; #X connect 9 0 8 1; #X connect 10 0 2 1; #X connect 11 0 10 0; #X connect 12 0 11 1; #X connect 13 0 7 3; #X connect 14 0 2 3; #X connect 15 0 10 1; #X connect 15 1 6 1; #X connect 16 0 2 0; #X connect 16 1 0 0; #X connect 16 2 11 0; #X connect 16 3 8 0; #X connect 16 4 7 0; #X restore 128 141 pd draw-alt; #X obj 39 81 demux; #X obj 95 12 r $0-rep-demux; #X connect 0 0 12 0; #X connect 2 0 7 1; #X connect 3 0 8 0; #X connect 4 0 3 0; #X connect 5 0 11 0; #X connect 6 0 5 1; #X connect 7 0 1 0; #X connect 9 0 7 0; #X connect 11 0 7 0; #X connect 12 0 1 0; #X connect 12 1 5 0; #X connect 13 0 12 1; #X restore 215 248 pd armat; #X obj 305 247 s $0-tune; #X msg 311 218 C; #X msg 340 216 G; #X msg 369 217 D; #X connect 1 0 0 0; #X connect 4 0 3 1; #X connect 5 0 24 0; #X connect 7 0 6 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 10 0 13 0; #X connect 12 0 14 0; #X connect 13 0 28 0; #X connect 14 0 31 0; #X connect 15 0 11 0; #X connect 16 0 12 1; #X connect 17 0 13 1; #X connect 18 0 13 2; #X connect 19 0 13 3; #X connect 20 0 14 1; #X connect 21 0 28 1; #X connect 22 0 28 2; #X connect 23 0 28 3; #X connect 24 0 3 0; #X connect 25 0 24 1; #X connect 26 0 24 2; #X connect 27 0 24 3; #X connect 28 0 12 0; #X connect 29 0 0 0; #X connect 30 0 31 1; #X connect 33 0 32 0; #X connect 34 0 32 0; #X connect 35 0 32 0;
This sounds interesting, I will take a look at it when I get out of work...
As far as what improvisors need, I'm working in the more 'experimental' improv scene right now, which means:
cells such as (0 3 5 1 2 4) in some specific key 2. There will be additional types of symbols and data, or poetic instructions 3. There will be instructions for some improvisors to lead and others to follow the leader at various points 4. The ultimate idea for a current project is that there will be a conductor coordinating improvisors, able to send commands across a network to multiple improvisors on the fly. Of course, this opens the way for a computer to take the role of conductor also. But in either case, there is not a score but rather the structure if the work itself is also improvised anew at every performance, out of a collection of potential cells and potential instructions that define the space of possibilities that any given work inhabits.
In other words, don't think that 'improvisors' means that this is in any way going to be 'jazz'. Think more along the lines of the music of Webern + Morton Feldman + Cecil Taylor + John Cage...
~David
On Thu, Jul 17, 2008 at 4:31 AM, patrice colet pat@mamalala.org wrote:
Sayonara,
How do you display the chords in GEM? I personaly use a jazzfont ttf and curves, the attached patch is an attempt to display a score that any reader would understand because it's written like in the Realbook. Unfortunately I didn't finish this project (like many ones), but it might give a clue I hope.
I really don't think that an improvisator will enjoy to have single notes packets to read for each chord, in fact I don't know any improvisator that need to read something else than jazzchords and melodies for playing, unless they have a notice given with the score where the composer has explained all his weird symbols, quite annoying to make, to play, to read, and to hear...for me.
Also I've started a project for writting scores with datastructures, attached archive is an old sample of this datastructure project, done with the help of F. Barkneicht, I've done something more sophisticated, but the purpose wasn't really about reading/playing/learning music but it's just a 'proof of the concept' game, maybe you will see it through the publication of the PureCorps game started last year...
I think that the advantage of scores displayed by a computer is about having pages (or even better the first line) updated automatically when the reader is at the last line.
I will be need of something functionnal for playing in concerts soon, then will certainly make something that will fit my use and reading abilities, I'll also need to write strange tuplets like the ones you can find in FZ's Black Page... If someone is interested I could update this work in pd-announce ? Anyway, all this stuff won't be as powerful as some lilypond external or something similar...
Jaa.
David Powers a écrit :
Hello,
I have a question, how hard do you think it would be create a notation engine for GEM? What considerations would go into the design?
On the simplest level, I'm imagining doing non-rhythmic notation to display chords and cells for improvisors.
Since the number of notes on a chord would be determined on the fly, would it be better to create the max amount of objects and turn off unwanted ones, or better to use dynamic patching? This would simply be to create circles representing noteheads.... Here's my imaginary prototype:
[gemhead] | | | [cell G Ab F# F ( or [chords c4 e4 g4 , F#4 G4 B4 ( or [cell 0 4 3 5 2 1 ( | / | / [treble_clef]
Anybody have any idea what kind of messages I might send such an object?
~David
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list
#N canvas 333 338 624 320 10; #X obj 16 77 gemwin; #X msg 27 54 0 , destroy; #X obj 17 10 loadbang; #N canvas 349 55 555 403 text 0; #X obj 95 33 inlet; #X obj 199 37 inlet; #X obj 129 300 outlet; #X obj 17 220 text2d; #X obj 74 222 text3d; #X obj 131 221 textextruded; #X obj 237 222 textoutline; #X obj 110 144 demux 0 1 2 3; #X obj 236 153 r $0-text; #X obj 320 154 r $0-size; #X floatatom 408 129 5 0 0 0 - - -; #X msg 409 162 depth $1; #X connect 0 0 7 0; #X connect 1 0 7 1; #X connect 3 0 2 0; #X connect 4 0 2 0; #X connect 5 0 2 0; #X connect 6 0 2 0; #X connect 7 0 3 0; #X connect 7 1 4 0; #X connect 7 2 5 0; #X connect 7 3 6 0; #X connect 8 0 6 0; #X connect 8 0 5 0; #X connect 8 0 4 0; #X connect 8 0 3 0; #X connect 9 0 6 1; #X connect 9 0 5 1; #X connect 9 0 4 1; #X connect 9 0 3 1; #X connect 10 0 11 0; #X connect 11 0 5 0; #X restore 425 113 pd text; #X obj 462 83 hradio 15 1 0 4 empty empty empty 0 -8 0 10 -262144 -1 -1 1; #X obj 425 16 gemhead; #X obj 494 229 s $0-text; #X msg 494 200 string $1; #X floatatom 494 174 5 0 0 0 - - -; #X obj 494 149 key; #X obj 210 20 gemhead; #X obj 15 143 s $0-size; #N canvas 330 302 413 328 lignes 0; #X obj 57 148 inlet; #X obj 168 257 outlet; #X obj 319 167 r $0-size; #N canvas 0 0 474 324 drawlines 0; #X obj 116 9 inlet; #X obj 115 201 outlet; #X obj 115 161 list prepend string; #X obj 115 132 list prepend; #X obj 211 130 t l; #X obj 115 90 until; #X msg 115 111 61; #X obj 116 68 t a b; #X obj 116 39 route float; #X obj 115 180 list trim; #X connect 0 0 8 0; #X connect 2 0 9 0; #X connect 3 0 4 0; #X connect 3 0 2 0; #X connect 4 0 3 1; #X connect 5 0 6 0; #X connect 6 0 3 0; #X connect 7 0 5 0; #X connect 7 1 3 1; #X connect 8 0 7 0; #X connect 9 0 1 0; #X restore 237 141 pd drawlines; #X obj 233 96 inlet; #X obj 236 120 i 1; #X msg 124 141 font pgjazz.ttf; #X obj 124 116 loadbang; #X obj 167 228 text3d; #X connect 0 0 8 0; #X connect 2 0 8 1; #X connect 3 0 8 0; #X connect 4 0 5 0; #X connect 5 0 3 0; #X connect 6 0 8 0; #X connect 7 0 6 0; #X connect 8 0 1 0; #X restore 209 156 pd lignes; #X obj 210 61 rotateXYZ; #N canvas 330 143 595 443 clef 0; #X obj 84 109 inlet; #X obj 168 257 outlet; #X obj 343 165 r $0-size; #X msg 135 49 font pgjazz.ttf; #X obj 195 10 loadbang; #X obj 277 164 r $0-clef; #X obj 174 94 s $0-clef; #X msg 323 55 string 38; #X obj 91 163 translateXYZ -25 0 0; #X obj 123 109 inlet; #X obj 168 228 text3d; #X connect 0 0 8 0; #X connect 2 0 10 1; #X connect 3 0 6 0; #X connect 4 0 3 0; #X connect 4 0 7 0; #X connect 5 0 10 0; #X connect 7 0 6 0; #X connect 8 0 10 0; #X connect 9 0 8 1; #X connect 10 0 1 0; #X restore 209 200 pd clef; #X obj 15 104 nbx 5 14 0 200 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 35 256; #X obj 259 128 nbx 3 14 0 200 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 18 256; #X obj 270 22 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; #X obj 280 32 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; #X obj 290 42 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 6900 1; #X obj 247 181 nbx 3 14 -50 50 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 -5 256; #X obj 271 67 hsl 70 10 -30 30 0 1 empty empty empty -2 -8 0 10 -262144 -1 -1 3623 1; #X obj 281 77 hsl 70 10 -30 30 0 1 empty empty empty -2 -8 0 10 -262144 -1 -1 3526 1; #X obj 291 87 hsl 70 10 -30 30 0 1 empty empty empty -2 -8 0 10 -262144 -1 -1 3441 1; #X obj 425 62 rotateXYZ; #X obj 485 23 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 2500 1; #X obj 495 33 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 3300 1; #X obj 505 43 hsl 70 10 0 360 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 2300 1; #X obj 209 107 translateXYZ 0 0 0; #X msg 15 34 dimen 300 200 , create , 1; #X obj 253 229 nbx 3 14 -50 50 0 1 empty empty empty 0 -8 0 10 -262144 -1 -1 2.8 256; #N canvas 553 17 434 340 armat 0; #X obj 39 14 inlet; #X obj 133 260 outlet; #X obj 297 111 r $0-size; #X msg 279 32 font pgjazz.ttf; #X obj 281 10 loadbang; #X obj 94 109 translateXYZ -25 0 0; #X obj 132 63 inlet; #X obj 168 228 text3d; #X obj 281 59 s $0-arm; #X obj 231 110 r $0-arm; #N canvas 355 31 498 348 selector 0; #X obj 108 6 r $0-tune; #X obj 108 34 list append $0; #X msg 8 107 ; $1-rep-demux 0; #X msg 44 250 ; $1-rep-demux 1 ; $1-arm-rep 1 ; $1-arm-y 125 ; #X obj 107 54 list trim; #X msg 249 240 ; $1-rep-demux 1 ; $1-arm-rep 1 ; $1-arm-x 0 ; $1-arm-y 1.25; #X obj 108 76 route C C# D D# E F F# G G# A A# B; #X msg 110 158 ; $1-rep-demux 1 ; $1-arm-rep 2 ; $1-arm-x 0 1 ; $1-arm-y 1 1; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 4 0 6 0; #X connect 6 0 2 0; #X connect 6 2 7 0; #X connect 6 7 5 0; #X restore 198 14 pd selector; #N canvas 31 244 293 424 draw-alt 0; #X msg 58 337 string 35; #X obj 42 49 repeat 1; #X obj 42 307 translateXYZ 0 -10 0; #X obj 85 12 r $0-arm-rep; #X obj 42 10 inlet; #X obj 42 380 outlet; #N canvas 0 0 462 379 list-rot 0; #X obj 170 253 list prepend; #X obj 151 44 inlet; #X obj 256 47 inlet; #X obj 151 279 list; #X obj 256 174 mod $1; #X obj 256 152 f $1; #X obj 170 212 list split $1; #X obj 151 70 t b a b b a; #N canvas 0 0 454 304 list-len 0; #X obj 126 70 inlet; #X obj 82 144 list-drip; #X obj 161 209 + 1; #X obj 82 172 b; #X obj 116 249 f; #X obj 116 276 outlet; #X obj 148 183 1; #X obj 132 211 f 1; #X obj 206 213 0; #X obj 126 104 t a b b; #X connect 0 0 9 0; #X connect 1 0 3 0; #X connect 1 1 4 0; #X connect 2 0 7 1; #X connect 3 0 7 0; #X connect 4 0 5 0; #X connect 6 0 7 1; #X connect 7 0 2 0; #X connect 7 0 4 1; #X connect 8 0 4 1; #X connect 9 0 1 0; #X connect 9 1 6 0; #X connect 9 2 8 0; #X restore 293 153 pd list-len; #X obj 151 334 outlet; #X obj 151 307 list split 1; #X connect 0 0 3 1; #X connect 1 0 7 0; #X connect 2 0 5 0; #X connect 3 0 10 0; #X connect 4 0 6 1; #X connect 5 0 4 0; #X connect 6 0 0 0; #X connect 6 1 0 1; #X connect 7 0 3 0; #X connect 7 1 6 0; #X connect 7 2 0 1; #X connect 7 3 5 0; #X connect 7 4 8 0; #X connect 8 0 4 1; #X connect 10 0 9 0; #X restore 168 256 pd list-rot; #X obj 118 98 gem_counter 0 1; #X obj 168 232 list; #X obj 200 183 r $0-arm-y; #N canvas 0 0 462 379 list-rot 0; #X obj 170 253 list prepend; #X obj 151 44 inlet; #X obj 256 47 inlet; #X obj 151 279 list; #X obj 256 174 mod $1; #X obj 256 152 f $1; #X obj 170 212 list split $1; #X obj 151 70 t b a b b a; #N canvas 0 0 454 304 list-len 0; #X obj 126 70 inlet; #X obj 82 144 list-drip; #X obj 161 209 + 1; #X obj 82 172 b; #X obj 116 249 f; #X obj 116 276 outlet; #X obj 148 183 1; #X obj 132 211 f 1; #X obj 206 213 0; #X obj 126 104 t a b b; #X connect 0 0 9 0; #X connect 1 0 3 0; #X connect 1 1 4 0; #X connect 2 0 7 1; #X connect 3 0 7 0; #X connect 4 0 5 0; #X connect 6 0 7 1; #X connect 7 0 2 0; #X connect 7 0 4 1; #X connect 8 0 4 1; #X connect 9 0 1 0; #X connect 9 1 6 0; #X connect 9 2 8 0; #X restore 293 153 pd list-len; #X obj 151 334 outlet; #X obj 151 307 list split 1; #X connect 0 0 3 1; #X connect 1 0 7 0; #X connect 2 0 5 0; #X connect 3 0 10 0; #X connect 4 0 6 1; #X connect 5 0 4 0; #X connect 6 0 0 0; #X connect 6 1 0 1; #X connect 7 0 3 0; #X connect 7 1 6 0; #X connect 7 2 0 1; #X connect 7 3 5 0; #X connect 7 4 8 0; #X connect 8 0 4 1; #X connect 10 0 9 0; #X restore 74 265 pd list-rot; #X obj 74 241 list; #X obj 93 214 r $0-arm-x; #X obj 131 42 - 1; #X floatatom 194 290 5 0 0 0 - - -; #X obj 118 120 t a a; #X obj 43 75 t a b b b b; #X connect 0 0 5 0; #X connect 1 0 16 0; #X connect 2 0 5 0; #X connect 3 0 1 1; #X connect 3 0 13 0; #X connect 4 0 1 0; #X connect 6 0 2 2; #X connect 7 0 15 0; #X connect 8 0 6 0; #X connect 9 0 8 1; #X connect 10 0 2 1; #X connect 11 0 10 0; #X connect 12 0 11 1; #X connect 13 0 7 3; #X connect 14 0 2 3; #X connect 15 0 10 1; #X connect 15 1 6 1; #X connect 16 0 2 0; #X connect 16 1 0 0; #X connect 16 2 11 0; #X connect 16 3 8 0; #X connect 16 4 7 0; #X restore 128 141 pd draw-alt; #X obj 39 81 demux; #X obj 95 12 r $0-rep-demux; #X connect 0 0 12 0; #X connect 2 0 7 1; #X connect 3 0 8 0; #X connect 4 0 3 0; #X connect 5 0 11 0; #X connect 6 0 5 1; #X connect 7 0 1 0; #X connect 9 0 7 0; #X connect 11 0 7 0; #X connect 12 0 1 0; #X connect 12 1 5 0; #X connect 13 0 12 1; #X restore 215 248 pd armat; #X obj 305 247 s $0-tune; #X msg 311 218 C; #X msg 340 216 G; #X msg 369 217 D; #X connect 1 0 0 0; #X connect 4 0 3 1; #X connect 5 0 24 0; #X connect 7 0 6 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 10 0 13 0; #X connect 12 0 14 0; #X connect 13 0 28 0; #X connect 14 0 31 0; #X connect 15 0 11 0; #X connect 16 0 12 1; #X connect 17 0 13 1; #X connect 18 0 13 2; #X connect 19 0 13 3; #X connect 20 0 14 1; #X connect 21 0 28 1; #X connect 22 0 28 2; #X connect 23 0 28 3; #X connect 24 0 3 0; #X connect 25 0 24 1; #X connect 26 0 24 2; #X connect 27 0 24 3; #X connect 28 0 12 0; #X connect 29 0 0 0; #X connect 30 0 31 1; #X connect 33 0 32 0; #X connect 34 0 32 0; #X connect 35 0 32 0;
David Powers a écrit :
This sounds interesting, I will take a look at it when I get out of work...
As far as what improvisors need, I'm working in the more 'experimental' improv scene right now, which means:
- They won't be playing 'Cmajor7' but rather collections of pitch
cells such as (0 3 5 1 2 4) in some specific key 2. There will be additional types of symbols and data, or poetic instructions 3. There will be instructions for some improvisors to lead and others to follow the leader at various points 4. The ultimate idea for a current project is that there will be a conductor coordinating improvisors, able to send commands across a network to multiple improvisors on the fly. Of course, this opens the way for a computer to take the role of conductor also. But in either case, there is not a score but rather the structure if the work itself is also improvised anew at every performance, out of a collection of potential cells and potential instructions that define the space of possibilities that any given work inhabits.
In other words, don't think that 'improvisors' means that this is in any way going to be 'jazz'. Think more along the lines of the music of Webern + Morton Feldman + Cecil Taylor + John Cage...
~David
I was more thinking about K. Stockhausen, but anyway if this sounds out of tune, or smells funny, there always will be people that say 'it's jazz'.
would be the first note, but a musician uses to start with one, not zero. If this notation is for expressing some voicings, that is a lot easier and free to read under jazz notation for a human, unless the numbers represents guitar tablatures.
It almost sounds like the machine will help classical musicians or mathemusicians to do like if they were improvising, interesting...
2.3. I've played a piece long time ago (so long I don't remember the title), with other improvisators, where notes on the musical score were replaced by different symbols that give instructions differents than time and pitch, but also the tone, or pick a note, or replay the other voice's pitch or rythm, or tone, or play same fast, go slow... That was funny, and sure it would be more funny if it's a computer that conducts everyone!
A dictionnary of symbols is so easier to read than numbers for expressing musical events, that's why I've asked if you used font files, but maybe using gem geos or texture files would make it more elegant or versatile?
yes I
- (0 3 5 1 2 4) might make sense for an engineer because zero for him would
be the first note, but a musician uses to start with one, not zero. If this notation is for expressing some voicings, that is a lot easier and free to read under jazz notation for a human, unless the numbers represents guitar tablatures.
It almost sounds like the machine will help classical musicians or mathemusicians to do like if they were improvising, interesting...
Ah, yes, well I only meant that is the internal representation. The interface would take that input and generate an appropriate output for a given instrument in the correct transposition, so a flute player would see the cell as noteheads on a treble clef.
I'm wondering if I should use something like PyExt to do some of the mapping, as I don't know of any simple way to do hash dictionaries in PD itself. As a test last night, I built a simple abstraction to take notes C C# D etc. and output pitch numbers 0-11, and i found it quite tedius to do compared to a function in code such as (this is in PHP because that is what I do all day long at my day job): function note2number($note) { $num = array ('C'=>0,'C#'=>1,'Db'=>1); return $num[$note]; }
- I imagine that puredata will have to transpose for each instrument, but
if only the key (or key modulation) is given it would be easy to do.
A dictionnary of symbols is so easier to read than numbers for expressing musical events, that's why I've asked if you used font files, but maybe using gem geos or texture files would make it more elegant or versatile?
I'm not sure about fonts, I guess I don't know whether that would work on multiple operating systems... I just thought that GEM would allow it to work on any OS. I agree it might be nice to use already built musical symbols rather than reinventing the wheel. Then I would only need GEM to draw the staff lines and position the noteheads and symbols in relation to it.
~David
David Powers a écrit :
- (0 3 5 1 2 4) might make sense for an engineer because zero for him would
be the first note, but a musician uses to start with one, not zero. If this notation is for expressing some voicings, that is a lot easier and free to read under jazz notation for a human, unless the numbers represents guitar tablatures.
It almost sounds like the machine will help classical musicians or mathemusicians to do like if they were improvising, interesting...
Ah, yes, well I only meant that is the internal representation. The interface would take that input and generate an appropriate output for a given instrument in the correct transposition, so a flute player would see the cell as noteheads on a treble clef.
I'm wondering if I should use something like PyExt to do some of the mapping, as I don't know of any simple way to do hash dictionaries in PD itself. As a test last night, I built a simple abstraction to take notes C C# D etc. and output pitch numbers 0-11, and i found it quite tedius to do compared to a function in code such as (this is in PHP because that is what I do all day long at my day job): function note2number($note) { $num = array ('C'=>0,'C#'=>1,'Db'=>1); return $num[$note]; }
with python it would be very simple as well, AFAIU you would just need to declare a dictionnary and read it through a defined function or a class exactly like you did in php ( http://docs.python.org/tut/node7.html ) , explicitely it's called "Data Structure" in python documentation...
It' possible to use data structure in pure data as well, with using array elements for note names, and a pointer index value for the number. This kind of stuff is a lot easier to do with data structures, I've been able to do things very simply with, while it seemed impossible with list objects, for example a custom [poly] that is able to manage more than two arguments (I could extract and post it if it's necessary) and well it's a big advantage in regard of other dataflow applications...
- I imagine that puredata will have to transpose for each instrument, but
if only the key (or key modulation) is given it would be easy to do.
A dictionnary of symbols is so easier to read than numbers for expressing musical events, that's why I've asked if you used font files, but maybe using gem geos or texture files would make it more elegant or versatile?
I'm not sure about fonts, I guess I don't know whether that would work on multiple operating systems... I just thought that GEM would allow it to work on any OS. I agree it might be nice to use already built musical symbols rather than reinventing the wheel. Then I would only need GEM to draw the staff lines and position the noteheads and symbols in relation to it.
~David
Well I think that all the project wouldn't even need externals but Gem will certainly give it a nice look and might have better performances. Also, ttf files would work on any OS if I'm not mistaken, but maybe it would be less complicated with using image files, I've only tried to draw musical score on Gem with [text] objects.
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list
Just remember I've made an abstraction for that long ago, it won't be as fast as DS but it works and it's attached
patrice colet a écrit :
David Powers a écrit :
- (0 3 5 1 2 4) might make sense for an engineer because zero for him would
be the first note, but a musician uses to start with one, not zero. If this notation is for expressing some voicings, that is a lot easier and free to read under jazz notation for a human, unless the numbers represents guitar tablatures.
It almost sounds like the machine will help classical musicians or mathemusicians to do like if they were improvising, interesting...
Ah, yes, well I only meant that is the internal representation. The interface would take that input and generate an appropriate output for a given instrument in the correct transposition, so a flute player would see the cell as noteheads on a treble clef.
I'm wondering if I should use something like PyExt to do some of the mapping, as I don't know of any simple way to do hash dictionaries in PD itself. As a test last night, I built a simple abstraction to take notes C C# D etc. and output pitch numbers 0-11, and i found it quite tedius to do compared to a function in code such as (this is in PHP because that is what I do all day long at my day job): function note2number($note) { $num = array ('C'=>0,'C#'=>1,'Db'=>1); return $num[$note]; }
with python it would be very simple as well, AFAIU you would just need to declare a dictionnary and read it through a defined function or a class exactly like you did in php ( http://docs.python.org/tut/node7.html ) , explicitely it's called "Data Structure" in python documentation...
It' possible to use data structure in pure data as well, with using array elements for note names, and a pointer index value for the number. This kind of stuff is a lot easier to do with data structures, I've been able to do things very simply with, while it seemed impossible with list objects, for example a custom [poly] that is able to manage more than two arguments (I could extract and post it if it's necessary) and well it's a big advantage in regard of other dataflow applications...
- I imagine that puredata will have to transpose for each instrument, but
if only the key (or key modulation) is given it would be easy to do.
A dictionnary of symbols is so easier to read than numbers for expressing musical events, that's why I've asked if you used font files, but maybe using gem geos or texture files would make it more elegant or versatile?
I'm not sure about fonts, I guess I don't know whether that would work on multiple operating systems... I just thought that GEM would allow it to work on any OS. I agree it might be nice to use already built musical symbols rather than reinventing the wheel. Then I would only need GEM to draw the staff lines and position the noteheads and symbols in relation to it.
~David
Well I think that all the project wouldn't even need externals but Gem will certainly give it a nice look and might have better performances. Also, ttf files would work on any OS if I'm not mistaken, but maybe it would be less complicated with using image files, I've only tried to draw musical score on Gem with [text] objects.
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list
#N canvas 493 443 466 227 12; #X msg 175 32 A#5; #X floatatom 174 124 5 0 0 0 - - -; #X msg 134 36 A#4; #X obj 176 95 note2f; #X msg 307 29 C0; #X msg 223 34 C1; #X msg 263 33 C-1; #X msg 349 30 C-2; #X msg 92 40 A4; #X symbolatom 30 75 10 0 0 0 - - -; #X msg 312 70 C#-1; #X connect 0 0 3 0; #X connect 2 0 3 0; #X connect 3 0 1 0; #X connect 4 0 3 0; #X connect 5 0 3 0; #X connect 6 0 3 0; #X connect 7 0 3 0; #X connect 8 0 3 0; #X connect 9 0 3 0; #X connect 10 0 3 0;
#N canvas 489 6 482 377 10; #N canvas 404 9 518 432 note 0; #X obj 212 143 s2l; #X msg 248 119 symbol; #X obj 210 66 symbol; #X obj 203 11 inlet; #X obj 185 321 outlet; #X obj 352 272 outlet; #N canvas 0 0 537 411 drip 0; #X obj 64 206 list split 1; #X obj 64 123 until; #X obj 64 181 list append; #X obj 194 206 bang; #X text 146 90 First store list , then start the loop; #X text 163 118 "until" bangs its output until told to stop by a "bang" to its right inlet.; #X text 182 160 Store the remaining list.; #X text 239 205 third outlet of "split" tells us to stop.; #X obj 64 243 outlet; #X obj 64 57 inlet; #X text 237 44 From list-help.pd; #X obj 143 243 outlet; #X obj 64 86 t b a; #X connect 0 0 8 0; #X connect 0 1 2 1; #X connect 0 2 3 0; #X connect 0 2 11 0; #X connect 1 0 2 0; #X connect 2 0 0 0; #X connect 3 0 1 1; #X connect 9 0 12 0; #X connect 12 0 1 0; #X connect 12 1 2 1; #X restore 212 195 pd drip; #X obj 212 169 route list; #X obj 212 222 route symbol float; #X obj 212 271 list prepend; #X obj 212 92 t a b; #X obj 317 274 t l; #X obj 169 37 t b a; #X connect 0 0 7 0; #X connect 1 0 0 1; #X connect 2 0 10 0; #X connect 3 0 12 0; #X connect 6 0 8 0; #X connect 7 0 6 0; #X connect 8 0 4 0; #X connect 8 1 5 0; #X connect 9 0 11 0; #X connect 9 0 4 0; #X connect 10 0 0 0; #X connect 10 1 1 0; #X connect 11 0 9 1; #X connect 12 0 9 1; #X connect 12 1 2 0; #X restore 73 54 pd note name split; #X msg 32 121 1; #X msg 59 122 3; #X msg 78 143 5; #X msg 93 121 6; #X msg 106 144 8; #X msg 123 121 10; #X msg 134 146 12; #X obj 90 191 i; #X obj 212 0 inlet; #X obj 127 323 outlet; #X obj 166 215 + 1; #X obj 153 236 i; #X obj 128 260 i; #X obj 153 119 b; #X obj 128 281 +; #X obj 271 199 * 12; #X obj 128 304 + 23; #X obj 69 81 sel C D E F G A B # -; #X obj 198 241 i; #X obj 211 23 t b b a b; #X obj 288 165 demux; #X msg 290 117 0; #X msg 263 123 1; #X obj 311 200 * -12; #X connect 0 0 18 0; #X connect 0 1 21 0; #X connect 1 0 8 0; #X connect 2 0 8 0; #X connect 3 0 8 0; #X connect 4 0 8 0; #X connect 5 0 8 0; #X connect 6 0 8 0; #X connect 7 0 8 0; #X connect 8 0 11 0; #X connect 8 0 13 1; #X connect 9 0 20 0; #X connect 11 0 12 1; #X connect 12 0 13 1; #X connect 13 0 15 0; #X connect 14 0 12 0; #X connect 15 0 17 0; #X connect 16 0 19 1; #X connect 17 0 10 0; #X connect 18 0 1 0; #X connect 18 1 2 0; #X connect 18 2 3 0; #X connect 18 3 4 0; #X connect 18 4 5 0; #X connect 18 5 6 0; #X connect 18 6 7 0; #X connect 18 7 14 0; #X connect 18 8 23 0; #X connect 19 0 15 1; #X connect 20 0 13 0; #X connect 20 1 19 0; #X connect 20 2 0 0; #X connect 20 3 22 0; #X connect 21 0 16 0; #X connect 21 1 24 0; #X connect 22 0 21 1; #X connect 23 0 21 1; #X connect 24 0 19 1;
Hallo, David Powers hat gesagt: // David Powers wrote:
I'm wondering if I should use something like PyExt to do some of the mapping, as I don't know of any simple way to do hash dictionaries in PD itself. As a test last night, I built a simple abstraction to take notes C C# D etc. and output pitch numbers 0-11, and i found it quite tedius to do compared to a function in code such as (this is in PHP because that is what I do all day long at my day job): function note2number($note) { $num = array ('C'=>0,'C#'=>1,'Db'=>1); return $num[$note]; }
Well, Pd doesn't have proper hash dictionaries. OTOH Lua has hash dictionaries as its *only* data structure (called "tables" in Lua), so to me it's an ideal complement to Pd.
Attached is a quick [note2num] object for pdlua. It also handles multiple modifiers like "Gbbbb" or mixed ones like "Gb#bbb#b". ;)
Frank Barknecht _ ______footils.org__