Jump to content

Recommended Posts

Posted

I am working on a new omn symbol VOICES and wonder which way is more natural to write.

I would like to hear your comments and ideas on this.

 

Here are the two examples.

 

With symbol :vx


1) Each voice after each event, next to each other (1 bar 4/4):

symbol option :vx
(:v1 q cs5 ff :v2 q gs4 ff :v3 q f4 ff :v4 q f3 ff
 :v1 q eb5 ff :v2 q gs4 ff :v3 q c4 ff :v4 q gs3 ff
 :v1 q cs5 ff :v2 q gs4 ff :v3 q f4 ff :v4 q cs3 ff
 :v1 q f5 ff :v2 q cs5 ff :v3 q gs4 ff :v4 q cs3 ff)
 
symbol option :x
(:1 q cs5 ff :2 q gs4 ff :3 q f4 ff :4 q f3 ff
 :1 q eb5 ff :2 q gs4 ff :3 q c4 ff :4 q gs3 ff
 :1 q cs5 ff :2 q gs4 ff :3 q f4 ff :4 q cs3 ff
 :1 q f5 ff :2 q cs5 ff :3 q gs4 ff :4 q cs3 ff)

 

2) Each voice in a separate bar (1 bar 4/4):

symbol option :vx
(:v1 (q bb4 ff g4 gs4 e g4 f4)
 :v2 (q cs5 ff b4 gs4 fs4)
 :v3 (q f4 ff bb3 gs3 e bb3 gs3)
 :v3 (q d3 ff e eb3 d3 q c3 bb2))

symbol option :x
(:1 (q e4 ff h f4 q c5)
 :2 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 :3 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)
 :4 (q c3 ff h f2 q f3))

 

The symbol option :1 :2 :3 :4

(:1 (q e4 ff h f4 q c5)
 :2 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 :3 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)
 :4 (q c3 ff h f2 q f3))

 

will print in the Listener:

(:|1| (q e4 ff h f4 q c5)
 :|2| (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 :|3| (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)
 :|4| (q c3 ff h f2 q f3))

 

I personally think the second option is better to control.

 

Best wishes,

JP

  • opmo featured this topic
Posted

Dear Janusz,

 

I greatly welcome support for polyphony directly in OMN expressions. Thanks for plans to introduce these, and thanks for consulting us on your plans! 

 

I would prefer individual voices expressed as individual sequences, which would exclude option 1. The most easy way might be to simply express voices a lists in a list (i.e., without any necessary to name voices), but then this notation would be confused with the way OMN expresses bars in a voice (as sublists). You already introduced special syntax options for other composite data in order not to overload the notion of nested lists, by introducing your special chord symbols. 

 

So, why not introducing some special syntax for a group of voices as well like, e.g., the following. Here, a pair of brackets -- [ ... ] -- surrounds the voices, where each voice is notated with OMN as before (i.e., possibly with nested lists expressing bars, the special notation for chords etc.).

[(q e4 ff h f4 q c5)
 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)
 (q c3 ff h f2 q f3)]

Such bracket syntax is pretty strait forward to implement in Common Lisp, likely more easy than the special OMN chord symbols, using reader macros. For an example see, e.g., https://gist.github.com/chaitanyagupta/9324402, where a much more complex syntax (JSON) is parsed with reader macros. Another example is http://frank.kank.net/essays/hash.html, which defines a custom hash-table syntax with reader macros.

 

While I would like in principle to have an option for polyphony without the need to name individual voices (e.g., to express polyphony for keyboard instruments), it would also be very useful to optionally be able to freely name voices, e.g., according to a later def-score expression, as in the following snippet.

[:flute (q e4 ff h f4 q c5)
 :oboe (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 :french-horn (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)
 :bass-clarinet (q c3 ff h f2 q f3)]

If the reader macro treads individual symbols as optional voice names followed by a list representing the actual voice, both notations above should be possible to support.

 

Also, we may want to be able to express changes of the polyphony (number of parallel voices), as well as expressing sections this way. Why not using plain lists containing the proposed voice groups to expresses again sequences of musical material, as in the following example, where a two-voice section is followed by a monophonic section.

([(q e4 ff h f4 q c5)
  (e fs4 ff gs4 bb4 gs4 q fs4 f4)]
 [(s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)])

Finally, a restriction would likely be that parallel voices have to share the same metric structure. That should be easy enough to enforce by raising an exception otherwise, but it might be a case of errors users easily run into when algorithmically generating polyphonic music. So, a more smart way to deal with that would be welcome. No idea right now how to address that, though.

 

What do you think?

 

Best,

Torsten

 

PS: Note that I very rarely define custom reader macros, because they also have their downsides (e.g., bracket pairs would not be recognised by the Lisp editor of Opusmodus out of the box), but in this particular case I think they would be a good idea. OMN introduced its own syntax already anyway, and aims to combine readability, conciseness and simplicity. The proposed notation of groups of voices fits in that nicely in my view. 

Posted

great thing!

for me it's important to have the voice-symbol also in (single-events omn-list), and to read it like (omn :voice omn-list), and (voicep  omn-list)

 

greetings

andré 

Posted
15 hours ago, torstenanders said:

 

I would prefer individual voices expressed as individual sequences, which would exclude option 1.

 

Great thoughts Torsten. Some very good ideas in your answer and I agree (when I understand :-) ) with your reasoning.

 

/Lasse

Posted
16 hours ago, torstenanders said:

Finally, a restriction would likely be that parallel voices have to share the same metric structure. That should be easy enough to enforce by raising an exception otherwise, but it might be a case of errors users easily run into when algorithmically generating polyphonic music. So, a more smart way to deal with that would be welcome. No idea right now how to address that, though.

 

On second thought, with def-score we have exactly the same issue (which, btw is also shared by all your other voice grouping proposals above), and with def-score this is addressed by the option to specify the time signature separately. Perhaps we could do the same here? If so, perhaps we could also specify the tempo for snippets with voices? Now, I am getting greedy ;-)  --  but being able to specify tempi would really be handy.  E.g.,

[(q e4 ff h f4 q c5)
 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)
 (q c3 ff h f2 q f3)
 :time-signature '((1 1 1 1) 4)
 :tempo 100]

BTW: This voice group reader macro -- [...] -- would best be complemented by a pretty printing option, which ensures that any results containing such voice groups are printed with the same syntax using brackets. That way, dealing with this extended OMN data structure remains as easy and direct as OMN is so far. Behind the scenes, voice groups can then be represented with an arbitrary data structure (e.g., objects). An example for such pretty printing is shown also at http://frank.kank.net/essays/hash.html, where the hash tables are printed with the special syntax introduced there.

 

Of course, as AM pointed out, functions for processing any such voice groups would need to use special accessor functions like omn and friends, but that is already the case with other functions processing OMN, in particular functions processing the notes of chords with their special syntax.

 

Best,

Torsten

Posted

Dear Janusz,

 

After our chat last night I still think that it would be useful to make voice numbers optional. If they are absent, this could simply mean that they are in increasing order, starting with 1. So, the following two snippets would be equivalent.

(:1 (q e4 ff h f4 q c5)
 :2 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 :3 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4))
((q e4 ff h f4 q c5)
 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4))

Now, the problem with the latter notation is that it cannot be distinguished from a sequence of bars, which is why I proposed another notation to mark parallel voices (those brackets). Alternatively, we could simply require another level of parentheses. 

(((q e4 ff h f4 q c5))
 ((e fs4 ff gs4 bb4 gs4 q fs4 f4))
 ((s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)))

This could also be done by a simple function that expects an arbitrary number of voices with or without sublists for bars, and then creates the additional lists (or voice number markers) behind the scene.

(make-voices
 (q e4 ff h f4 q c5)
 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4))

Anyway, as I pointed out before I suspect we quickly run into cases where the time signatures of different voices get inconsistent -- regardless of the notation used, and that it would be useful to optionally specify time signatures explicitly, like in def-score. This would simply cause a re-barring behind the scene, which is not a big deal.

(make-voices
 (q e4 ff h f4 q c5)
 (e fs4 ff gs4 bb4 gs4 q fs4 f4)
 (s g3 ff gs3 q bb3 s gs3 g3 q gs3 f4)
 :time-signature '((1 1 1 1) 4))

Tempo specifications for snippets would be very useful as well, and so would be partial scores with instrument names specified instead of voice numbers, but that might be too much :)

 

Best,

Torsten

Posted

OK: I changed my mind -- with a simple function like the above make-voices we can have "unnumbered" voices. Then the OMN notation can be consistent using the voice-number keywords you proposed, or whatever :)

 

Best,

Torsten

  • opmo unfeatured this topic

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

Terms of Use Privacy Policy