Probably a tall order, and for the future -- but perhaps eventually an OSC
message can configure a MIDI channel filter on the fly. This would
eventually allow a GUI slider or dropdown to select a channel for an
instrument (or of course, non-GUI console instruments could use `oscsend`
per usual). This would allow the app to be free of it being a
compile-time-only option, and bring it into real-time configurability,
which gives a good generality to an app.

Aaron Krister Johnson
Music, etc.:
https://soundcloud.com/aaron-krister-johnson
https://soundcloud.com/filtercreed
https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
https://aaronkristerjohnson.bandcamp.com/
http://www.untwelve.org
Code:
https://github.com/akjmicro <http://www.untwelve.org>


On Tue, Dec 9, 2025 at 3:47 PM Aaron Krister Johnson <[email protected]>
wrote:

> Follow-up:
>
> If there were an option for MIDI channel, perhaps to preserve old
> behavior, when unspecified, the `freq, gain, gate`, etc...respond to ALL
> MIDI channels, and thus, when specified, it can be _only_ the channel
> specified.
>
> In other words, "all" would be the default, equivalent to `-midi_channel
> all` on the commandline. Whereas `-midi_channel 1` would only respond to
> `midi_channel == 1`.
>
> Ditto `[midi:on CHAN]` in options -- not giving a CHAN might be equivalent
> to the current "all" behavior, but specifying one gives the "single channel
> filter" logic?
>
> Aaron Krister Johnson
> Music, etc.:
> https://soundcloud.com/aaron-krister-johnson
> https://soundcloud.com/filtercreed
> https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
> https://aaronkristerjohnson.bandcamp.com/
> http://www.untwelve.org
> Code:
> https://github.com/akjmicro <http://www.untwelve.org>
>
>
> On Tue, Dec 9, 2025 at 3:38 PM Aaron Krister Johnson <[email protected]>
> wrote:
>
>> Yeah, the individual messages thing is great, but also kinda weird. The
>> typical use case for a note-on message is to turn a note on, which is why
>> the keywords `freq`, `gate`, and `gain` are great as generic catch-alls for
>> a poly (or mono) instrument.
>>
>> I can see how it's more generally cool and useful for `0xBn` control
>> signals.
>>
>> What you propose, Stéphane, could work - "[midi:on CHAN]"... and/or
>> having the ability to specify `-midi_channel X` where X is 1-16, on the
>> command line wrapper script. Either way would be better than having to
>> manually hack the `.cpp` file!
>>
>> Aaron Krister Johnson
>> Music, etc.:
>> https://soundcloud.com/aaron-krister-johnson
>> https://soundcloud.com/filtercreed
>> https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>> https://aaronkristerjohnson.bandcamp.com/
>> http://www.untwelve.org
>> Code:
>> https://github.com/akjmicro <http://www.untwelve.org>
>>
>>
>> On Tue, Dec 9, 2025 at 3:11 PM Stéphane Letz <[email protected]> wrote:
>>
>>> See : https://faustdoc.grame.fr/manual/midi/#configuring-midi-in-faust
>>>
>>> We already have MIDI channel for individual messages ,
>>>
>>> We could possibly extend the global: declare options "[midi:on] »;
>>>  with an extended version: declare options "[midi:on  CHAN] »; that would
>>> specific a given CHAN for all MIDI aware controllers ?
>>>
>>> Stéphane
>>>
>>> > Le 9 déc. 2025 à 22:30, Aaron Krister Johnson <[email protected]> a
>>> écrit :
>>> >
>>> > Hi,
>>> >
>>> > In case anyone else was interested in this issue, I wanted to report
>>> my process to successfully get a Faust executable for e.g. a synth to only
>>> listen to one particular MIDI channel (by default, for ON, OFF, CTRL, BEND
>>> messages will respond to ALL MIDI channels).
>>> >
>>> > In short, if you look at what the shell scripts that compile a `.dsp`
>>> file do, they first call `faust` to get a `.cpp` file that wraps an
>>> architecture file. If you recreate this process by seeing what the actual
>>> command that run are with bash debugging on:
>>> >
>>> >     bash -x /usr/bin/faust2jackconsole -osc -midi -nvoices 1
>>> your_synth.dsp
>>> >
>>> > ...you'll see the `faust` command that spits out a `.cpp` file. Run
>>> this separately, then edit lines that look something like:
>>> >
>>> > if (type == MIDI_NOTE_ON) {
>>> >     ...
>>> > }
>>> >
>>> > and change them to:
>>> >
>>> > if (type == MIDI_NOTE_ON & channel == 2) {  // if you want to only
>>> listen on channel 3
>>> >     ...
>>> > }
>>> >
>>> > Do this for the stanzas for `MIDI_NOTE_OFF`, `MIDI_PITCH_BEND`, etc.
>>> and any message type you want to filter by channel.
>>> >
>>> > Once you've finished editing the `.cpp` file, continue running the
>>> `c++` command you saw the faust wrapper script (e.g. `faust2jackconsole`)
>>> spit out.
>>> >
>>> > When you test it, you'll see that your instrument will properly only
>>> respond to the midi channel you edited it to respond to. Bear in mind, midi
>>> channel 1 is `0` in code, and 2 is `1`, etc. etc. i.e. for MIDI_NOTE_ON:
>>> >
>>> > 0x90          // channel 1
>>> > 0x91          // channel 2
>>> > 0x92          // channel 3
>>> > etc. etc.
>>> >
>>> > Hope this helps someone else wanting to do the same.
>>> >
>>> > Devs: should be a simple matter to make this dynamic from `faust`
>>> itself so that the front-end can make this easy with an extra optional
>>> parameter, like so....?:
>>> >
>>> >     faust2jackconsole -osc -midi -nvoices -midi_channel 4 -effect auto
>>> my_synth.dsp
>>> >
>>> > Where `-midi_channel ...` would be the new option that would
>>> effectively alter those intermediate `.cpp` lines I refer to.
>>> >
>>> > Aaron Krister Johnson
>>> > Music, etc.:
>>> > https://soundcloud.com/aaron-krister-johnson
>>> > https://soundcloud.com/filtercreed
>>> > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > https://aaronkristerjohnson.bandcamp.com/
>>> > http://www.untwelve.org
>>> > Code:
>>> > https://github.com/akjmicro
>>> >
>>> >
>>> > On Mon, Sep 29, 2025 at 9:27 AM Stéphane Letz <[email protected]> wrote:
>>> > Not much time to work on that right now yes.
>>> >
>>> > Stéphane
>>> >
>>> > > Le 29 sept. 2025 à 18:26, Aaron Krister Johnson <[email protected]>
>>> a écrit :
>>> > >
>>> > > Stephane et al,
>>> > >
>>> > > Gentle nudge here: any more thoughts on this MIDI channel issue, or
>>> is the best approach for now to work (or hack) around it?
>>> > >
>>> > > Aaron Krister Johnson
>>> > > Music, etc.:
>>> > > https://soundcloud.com/aaron-krister-johnson
>>> > > https://soundcloud.com/filtercreed
>>> > > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > > https://aaronkristerjohnson.bandcamp.com/
>>> > > http://www.untwelve.org
>>> > > Code:
>>> > > https://github.com/akjmicro
>>> > >
>>> > >
>>> > > On Sun, Sep 21, 2025 at 9:29 AM Aaron Krister Johnson <
>>> [email protected]> wrote:
>>> > > I guess this is a hack, but for keyOn and keyOff coming from the
>>> polyphony code (which I traced from looking for `freq` references) I'm
>>> thinking changing these in `poly-dsp.h` to further filter by channel at
>>> compile time would be key?
>>> > >
>>> > >         // MIDI API
>>> > >         MapUI* keyOn(int channel, int pitch, int velocity)
>>> > >         {
>>> > >             if (checkPolyphony()) {
>>> > >                 int voice = getFreeVoice();
>>> > >                 fVoiceTable[voice]->keyOn(pitch, velocity,
>>> fVoiceTable[voice]->fCurNote == kLegatoVoice);
>>> > >                 return fVoiceTable[voice];
>>> > >             } else {
>>> > >                 return 0;
>>> > >             }
>>> > >         }
>>> > >
>>> > >         void keyOff(int channel, int pitch, int velocity = 127)
>>> > >         {
>>> > >             if (checkPolyphony()) {
>>> > >                 int voice = getPlayingVoice(pitch);
>>> > >                 if (voice != kNoVoice) {
>>> > >                     fVoiceTable[voice]->keyOff();
>>> > >                 } else {
>>> > >                     fprintf(stderr, "Playing pitch = %d not
>>> found\n", pitch);
>>> > >                 }
>>> > >             }
>>> > >         }
>>> > >
>>> > > Change to:
>>> > >
>>> > >         // MIDI API
>>> > >         MapUI* keyOn(int channel, int pitch, int velocity)
>>> > >         {
>>> > >             if (checkPolyphony() & (channel == 1)) {  // to respond
>>> only to MIDI channel 2, actual number is MIDI channel - 1
>>> > >                 int voice = getFreeVoice();
>>> > >                 fVoiceTable[voice]->keyOn(pitch, velocity,
>>> fVoiceTable[voice]->fCurNote == kLegatoVoice);
>>> > >                 return fVoiceTable[voice];
>>> > >             } else {
>>> > >                 return 0;
>>> > >             }
>>> > >         }
>>> > >
>>> > >         void keyOff(int channel, int pitch, int velocity = 127)
>>> > >         {
>>> > >             if (checkPolyphony() & (channel == 1)) {  // to respond
>>> only to MIDI channel 2, actual number is MIDI channel - 1
>>> > >                 int voice = getPlayingVoice(pitch);
>>> > >                 if (voice != kNoVoice) {
>>> > >                     fVoiceTable[voice]->keyOff();
>>> > >                 } else {
>>> > >                     fprintf(stderr, "Playing pitch = %d not
>>> found\n", pitch);
>>> > >                 }
>>> > >             }
>>> > >         }
>>> > >
>>> > > But yes, would be better to allow the polyphony/voice-table
>>> architecture to be more standards compliant about channels, I'm thinking.
>>> I'll test this, for now it will do if it works.
>>> > >
>>> > > Aaron Krister Johnson
>>> > > Music, etc.:
>>> > > https://soundcloud.com/aaron-krister-johnson
>>> > > https://soundcloud.com/filtercreed
>>> > > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > > https://aaronkristerjohnson.bandcamp.com/
>>> > > http://www.untwelve.org
>>> > > Code:
>>> > > https://github.com/akjmicro
>>> > >
>>> > >
>>> > > On Sun, Sep 21, 2025 at 8:26 AM Aaron Krister Johnson <
>>> [email protected]> wrote:
>>> > > Is this MIDI channel filtering option being considered? If not,
>>> would the dev team welcome a patch if I tried my hand at it?
>>> > >
>>> > > ~AKJ
>>> > >
>>> > > Aaron Krister Johnson
>>> > > Music, etc.:
>>> > > https://soundcloud.com/aaron-krister-johnson
>>> > > https://soundcloud.com/filtercreed
>>> > > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > > https://aaronkristerjohnson.bandcamp.com/
>>> > > http://www.untwelve.org
>>> > > Code:
>>> > > https://github.com/akjmicro
>>> > >
>>> > > On Fri, Sep 12, 2025, 13:31 Aaron Krister Johnson <
>>> [email protected]> wrote:
>>> > > Ah, so it seems others have bumped into this limitation.
>>> > >
>>> > > Please, Faust devs, implement this! :D
>>> > >
>>> > > Aaron Krister Johnson
>>> > > Music, etc.:
>>> > > https://soundcloud.com/aaron-krister-johnson
>>> > > https://soundcloud.com/filtercreed
>>> > > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > > https://aaronkristerjohnson.bandcamp.com/
>>> > > http://www.untwelve.org
>>> > > Code:
>>> > > https://github.com/akjmicro
>>> > >
>>> > >
>>> > > On Thu, Sep 11, 2025 at 2:17 AM <[email protected]> wrote:
>>> > > Additional reading here:
>>> https://github.com/grame-cncm/faust/discussions/696
>>> > >
>>> > > All of this must be carefully considered...
>>> > >
>>> > > Stéphane
>>> > >
>>> > > > Le 10 sept. 2025 à 19:26, Aaron Krister Johnson <
>>> [email protected]> a écrit :
>>> > > >
>>> > > > P.S. -- and if this is implemented, covering key/vel/velocity, too
>>> :D
>>> > > >
>>> > > > Aaron Krister Johnson
>>> > > > Music, etc.:
>>> > > > https://soundcloud.com/aaron-krister-johnson
>>> > > > https://soundcloud.com/filtercreed
>>> > > > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > > > https://aaronkristerjohnson.bandcamp.com/
>>> > > > http://www.untwelve.org
>>> > > > Code:
>>> > > > https://github.com/akjmicro
>>> > > >
>>> > > >
>>> > > > On Wed, Sep 10, 2025 at 10:23 AM Aaron Krister Johnson <
>>> [email protected]> wrote:
>>> > > > Thanks, Stephane, yes, it would be most useful to have a Faust
>>> synth only respond on a declared channel, and `0` (or no specification)
>>> being "listen on all channels".
>>> > > >
>>> > > > Would this be in the "options" header, then?
>>> > > >
>>> > > > Aaron Krister Johnson
>>> > > > Music, etc.:
>>> > > > https://soundcloud.com/aaron-krister-johnson
>>> > > > https://soundcloud.com/filtercreed
>>> > > > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > > > https://aaronkristerjohnson.bandcamp.com/
>>> > > > http://www.untwelve.org
>>> > > > Code:
>>> > > > https://github.com/akjmicro
>>> > > >
>>> > > >
>>> > > > On Wed, Sep 10, 2025 at 9:00 AM Stéphane Letz <[email protected]>
>>> wrote:
>>> > > > Hi Aaron,
>>> > > >
>>> > > > MIDI metadata for standard MIDI control can use MIDI channel:
>>> https://faustdoc.grame.fr/manual/midi/#configuring-midi-in-faust
>>> > > >
>>> > > > But it is currently not possible to set a given channel for
>>> polyphony, you can see that the channel info is not used in the polyphonic
>>> code for now:
>>> > > >
>>> > > >
>>> https://github.com/grame-cncm/faust/blob/f5c23da4fe6e09fa55667ae588f4b6ef9c226cae/architecture/faust/dsp/poly-dsp.h#L900
>>> > > >
>>> > > > Should we extend/revisit the syntax of freq/gate/gain convention
>>> for something like [freq: chan],  [gate: chan],  [gain: chan], with the
>>> convention chan = 0 would mean « receive on all channels», like for other
>>> MIDI messages ?
>>> > > >
>>> > > > Stéphane
>>> > > >
>>> > > > > Le 10 sept. 2025 à 17:35, Aaron Krister Johnson <
>>> [email protected]> a écrit :
>>> > > > >
>>> > > > > I notice in the manual, certain MIDI slider metadata operations
>>> can be filtered by a certain MIDI channel, like `keyon` uses the velocity
>>> of a given key on a given channel.
>>> > > > >
>>> > > > > But IMO, these kinds of operations seem geared towards a
>>> non-standard way of using a MIDI signal. Most useful mono- or poly- synths
>>> would want to use the general
>>> > > > > keywords with special meaning: `freq/key`, `gain/vel`, and
>>> `gate` to drive the usually needed MIDI parameters in, for instance, a
>>> synthesizer signal chain.
>>> > > > >
>>> > > > > The problem I am having is: I'd like to pair a custom Faust
>>> synth with an outboard analog monosynth. Ideally, I could assign Faust to
>>> listen only on a certain MIDI channel.
>>> > > > > As it is, it seems like I have to do the opposite: Faust will
>>> respond to _all_ channels (not ideal) and I make the hardware synth respond
>>> to MIDI channel 2. They are isolated only
>>> > > > > by the fact that they are listening on different MIDI ports
>>> (otherwise, the Faust synth would be "hearing" both channels and trying to
>>> respond to both). What I have works for now,
>>> > > > > but let's say I want 2 Faust synths -- they'd both be responding
>>> to all channels that particular virtual port is listening on.
>>> > > > >
>>> > > > > So, in short: is there an easy way to make a running Faust synth
>>> instance listen only to a particular MIDI channel when it's designed to use
>>> the keywords `freq`, `gain`, and `gate`,
>>> > > > > per the docs? How easy would it be to hack Faust or add a
>>> feature for users for this if not?
>>> > > > >
>>> > > > > Aaron Krister Johnson
>>> > > > > Music, etc.:
>>> > > > > https://soundcloud.com/aaron-krister-johnson
>>> > > > > https://soundcloud.com/filtercreed
>>> > > > > https://www.youtube.com/channel/UC_utjGYbSizWE0dNyr0Vdmg
>>> > > > > https://aaronkristerjohnson.bandcamp.com/
>>> > > > > http://www.untwelve.org
>>> > > > > Code:
>>> > > > > https://github.com/akjmicro
>>> > > > > _______________________________________________
>>> > > > > Faudiostream-users mailing list
>>> > > > > [email protected]
>>> > > > > https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>>> > > >
>>> > >
>>> >
>>>
>>>
_______________________________________________
Faudiostream-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to