@@ -128,23 +128,20 @@ namespace elem
128128
129129 int setProperty (std::string const & key, js::Value const & val) override
130130 {
131- // TODO: Filter by channel too?
132- if (key == " voice" ) {
131+ if (key == " channel" ) {
133132 if (!val.isNumber ())
134133 return ReturnCode::InvalidPropertyType ();
135134
136- auto v = static_cast <size_t >(std::max (0.0 , (js::Number) val));
137- targetVoiceIndex.store (v);
138- filterByVoice.store (true );
135+ auto v = static_cast <int32_t >(std::max (0.0 , (js::Number) val));
136+ channelFilter.store (v);
139137 }
140138
141139 return GraphNode<FloatType>::setProperty (key, val);
142140 }
143141
144142 void process (BlockContext<FloatType> const & ctx) override {
145143 size_t framesProcessed = 0 ;
146- auto voiceFilter = filterByVoice.load ();
147- auto voiceIndex = targetVoiceIndex.load ();
144+ int32_t const targetChannel = channelFilter.load ();
148145
149146 ctx.inputEvents .template processEventsOfType <MidiEvent>([&](size_t time, MidiEvent const & event) {
150147 if (time >= ctx.numSamples )
@@ -153,7 +150,7 @@ namespace elem
153150 if (!event.message .isNoteOn () && !event.message .isNoteOff ())
154151 return ;
155152
156- if (voiceFilter && (voiceIndex != event.message .getChannel0to15 ()))
153+ if ((targetChannel >= 0 ) && (targetChannel != static_cast < int32_t >( event.message .getChannel0to15 () )))
157154 return ;
158155
159156 auto framesRemaining = ctx.numSamples - framesProcessed;
@@ -179,9 +176,7 @@ namespace elem
179176 }
180177 }
181178
182- std::atomic<size_t > targetVoiceIndex = 0 ;
183- std::atomic<bool > filterByVoice = false ;
184-
179+ std::atomic<int32_t > channelFilter = -1 ;
185180 FloatType noteFreq = 0 ;
186181 FloatType noteVelocity = 0 ;
187182 };
0 commit comments