midica icon indicating copy to clipboard operation
midica copied to clipboard

add sound effects

Open truj opened this issue 5 years ago • 4 comments

Something more or less like this: channel effect:what/function duration options E.g. for a pitch band change affecting the whole channel: 0 effect:pitchband/sinus /2 amplitude=20, wavecount=2.5 Or for a polyphonic aftertouch graph affecting only one note: 0 effect:polypressure/line /2 from=-5, to=15, note=c+

truj avatar Apr 11 '19 16:04 truj

Most (but not all) sound effects will be MIDI controller changes. Not always a function is required. Some controllers don't even support more values than true or false. So here's a new idea:

Function (lowlevel syntax):

0 volume.sin(ampl=50;periods=5.3) *1

Function (compact syntax):

0: (volume.sin(ampl=50;periods=5.3;length=1))

Simple setting (lowlevel syntax):

0 volume.set=75 -

Simple setting (compact syntax):

0: (volume.set=75)

Not sure yet, if lowlevel syntax should be supported for this at all.

truj avatar Aug 13 '23 10:08 truj

Again a new idea - Pipelining:

Lowlevel:

0  bend.wait().line(64,127).wait().length(/2).line(127,64)  /4
0  c  /1+/1

Compact: 0: bend.wait().line(64,127).wait().length(/2).line(127,64) c:1+1

Meaning:

  • A C is played for two whole notes.
  • wait(): It stays unchanged for a quarter note
    • quarter because /4 in lowlevel and default in compact
  • line(64,127): The next quarter it is pitch-bended from the middle to maximum
    • pitch-bend because the first bend determines the effect
  • wait(): It stays at maximum for a quarter note
  • length(/2): sets the length to a half note for following pipeline functions
  • line(127,64): during the next half note the bend is reduced from maximum to the middle again
  • the rest of the note is untouched

I think this is better then the option-like syntax (any.thing(value)). There are too many braces.

Also another idea for setters and binary controllers: These can also be implemented as functions, just like line() or sin(): 0: hold.on() c d e hold.off() c d e volume.set(127) c d e volume.set(30%) c d e

A possibility to address controllers or RPNs by number: ctrl=7.sin(20,60,4.3) rpn=0.set(6) This addresses controller 7 (volume) or RPN 0 (pitch bend sensitivity)

truj avatar Nov 25 '23 20:11 truj

Maybe pipelining is the wrong wording. Such a call chain should be renamed to effect flow (or maybe 'chaining'?). This also applies for the class, variables and placeholders.

truj avatar Dec 17 '23 11:12 truj

Not to be forgotten:

  • call closeFlowIfPossible() from the parser
  • poly_at / mono_at (special treatment)
  • pitch bend (special treatment with a parameter for half-tone-steps - connected to pitch bend range)
  • nestable blocks and functions - make sure it works there as well
  • patterns !!! - very important. Special treatment for aftertouch notes (support indices)

truj avatar Dec 27 '23 14:12 truj