<div dir="auto">Proposal 3: 3-tuple selector node<div dir="auto">Haven't tried it in code yet.</div><div dir="auto">1. Add 2 fields to ChannelSelector</div><div dir="auto">SFInt32 destinationChoice</div><div dir="auto">SFInt32 streamChoice</div><div dir="auto">2. Add field to ChannelMerger</div><div dir="auto">MFNode selectors [ChannelSelector]</div><div dir="auto">3. Add prose "ChannelMerger.children represents a list of audio streams..."</div><div dir="auto">Proposal3 is a cross/hybrid between proposal2 and v4 featuring SF routing for source and destination.</div><div dir="auto">-Doug</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Mar 6, 2023, 7:39 a.m. GPU Group <<a href="mailto:gpugroup@gmail.com">gpugroup@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Proposed and v4 implementation: Selections/sourceChannels are also semi-baked connections, and I currently have no tested code for unconnecting if a runtime SF route changed a ChannelSelector.selectedChannel or MF route to indexSource<div>-Doug<br><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Mar 6, 2023 at 6:05 AM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noreferrer">gpugroup@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I take that back, proposed also semi-bakes destinations into connections and I don't have a tested code for un-connecting at this time.<div>-Doug</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Mar 6, 2023 at 5:00 AM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noreferrer">gpugroup@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Mind you v4 design only half-passes the SF routing threshold: Selections/sources. Destinations are baked in scenegraph.<div>If the routing threshold was changed to MF, then proposed would have full runtime control over sources and destinations.</div><div>One way to save proposed, is to promise utility nodes for SF to MF in v4.1.</div><div>-Doug</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Mar 5, 2023 at 3:11 PM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noreferrer">gpugroup@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I don;t have a good answer for changing individual elements of an MFInt32 field.<div>I guess that use case kills the proposed method.</div><div>-Doug</div><div>more.. there was another browser I used about 15 years ago, and it had some utility nodes where you route an MF field to the input, and it would have 10 SF outputs, and another one going the other way - 10 SF inputs, and routed and MF.</div><div>Seemed limited use with just 10. But would work for a 6 channel case.</div><div>Something more general like the IntegerSequencer, which takes 2 routings, one for the index (next, previous, or index) and one for the value, but for this MFInt32 case the input value would be SInt32. Then routing from the MFInt32 field in Merger to the utility function, and routing back when changed.</div><div>But that would take some prose to explain the use case even if there was a utility node like that.</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Mar 5, 2023 at 2:13 PM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noreferrer">gpugroup@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div>Don,</div><div>Thanks for feedback.</div><div>Tuples needed. And web3d doesn't have tuple fields. </div><div><div>If web3d had MFInt32_3tuple field type that would be great in this use-case.</div></div><div>In this case the tuple needed is (destinationChannel, sourceChannel, audioStream)</div><div>Next best I can think of 3 MFInt32 fields --and some prose to explain they should have the same number of entries.</div><div>It's not in w3c because its another mechanism to convert procedural code to declarative.</div><div>-Doug</div><div>more.. </div><div>I showed the v4 design works under challenging scenarios/use-cases, but is awkward in some scenarios --requiring prose to explain. I couldn't understand how to use the nodes as the prose was written. Maybe more detailed prose would help.</div><div>"The Merger.children field represents a list of destinationChannels ..."</div><div>That's when I tried the 2-tuple. The prose for it would look like</div><div>"The Merger.children field represents a list of sourceChannels"</div><div>The 2-tuple didn't work with scenarios d) and e).</div><div>The 3-tuple prose would look like this:</div><div>"The Merger.children field represents a list of audio streams"</div><div>Decoupling the children field from both destinationChannel and sourceChannel had benefits:</div><div>- no need to DEF/USE the same Splitter (or non-splitter) audio stream to fill channel slots, if you have one splitter and/or audio stream, you can repeat the indexStream index</div><div>- can do all the other permutations of merging and swapping channels with indexSource and indexDestination</div><div><br></div><div>PROSE COMPARISON TEST?</div><div>Perhaps a good test of design is which is easier to explain for all use cases</div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Mar 5, 2023 at 12:57 PM Brutzman, Donald (Don) (CIV) <<a href="mailto:brutzman@nps.edu" target="_blank" rel="noreferrer">brutzman@nps.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div lang="EN-US"><div><p class="MsoNormal">Thanks for continued scrutiny and experimentation efforts Doug.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Primary point from last Friday is that we are trying to align with Web Audio API parameters closely and correctly.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Design point:  MFInt32/MFFloat arrays with distinct elements in the array are quite difficult for authors to manipulate without scripting, and even then tend to be quite error prone.  If actually needed, it is much preferred to define each parameter as an independent field.  Looking over what you’ve shared here, for example:<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><ul style="margin-top:0in" type="disc"><li style="margin-left:0in">SFInt32 [in out] indexStream 0<u></u><u></u></li><li style="margin-left:0in">SFInt32 [in out] indexSource 0<u></u><u></u></li><li style="margin-left:0in">SFInt32 [in out] indexDestination 0<u></u><u></u></li><li style="margin-left:0in">SFInt32 [in out] channelCount 0<u></u><u></u></li></ul><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Reference<u></u><u></u></p><ul style="margin-top:0in" type="disc"><li style="margin-left:0in"><a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-DIS/Part01/components/sound.html#ChannelMerger" target="_blank" rel="noreferrer">https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-DIS/Part01/components/sound.html#ChannelMerger</a><u></u><u></u></li></ul><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">However am not seeing a match between what you’re suggesting here and what W3C Audio API says, please advise.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><ul style="margin-top:0in" type="disc"><li style="margin-left:0in"><a href="https://www.w3.org/TR/webaudio/#channelmergernode" target="_blank" rel="noreferrer">https://www.w3.org/TR/webaudio/#channelmergernode</a><u></u><u></u></li></ul><div style="border-top:none;border-right:none;border-left:none;border-bottom:1.5pt solid windowtext;padding:0in 0in 1pt"><p class="MsoNormal" style="border:none;padding:0in"><u></u> <u></u></p></div><p class="MsoNormal"><b><span style="font-size:13.5pt">1.14. The </span></b><b><span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#channelmergernode" target="_blank" rel="noreferrer">ChannelMergerNode</a></span></b><b><span style="font-size:13.5pt"> Interface<u></u><u></u></span></b></p><p class="MsoNormal">The <span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#channelmergernode" target="_blank" rel="noreferrer">ChannelMergerNode</a></span> is for use in more advanced applications and would often be used in conjunction with <span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#channelsplitternode" target="_blank" rel="noreferrer">ChannelSplitterNode</a></span>.<u></u><u></u></p><table border="0" cellspacing="5" cellpadding="0"><thead><tr><td style="padding:0.75pt"><p class="MsoNormal" align="center" style="text-align:center"><b>Property <u></u><u></u></b></p></td><td style="padding:0.75pt"><p class="MsoNormal" align="center" style="text-align:center"><b>Value <u></u><u></u></b></p></td><td style="padding:0.75pt"><p class="MsoNormal" align="center" style="text-align:center"><b>Notes <u></u><u></u></b></p></td></tr></thead><tbody><tr><td style="padding:0.75pt"><p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-audionode-numberofinputs" target="_blank" rel="noreferrer">numberOfInputs</a></span> <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">see notes <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">Defaults to 6, but is determined by <span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dictdef-channelmergeroptions" target="_blank" rel="noreferrer">ChannelMergerOptions</a></span>,<span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-channelmergeroptions-numberofinputs" target="_blank" rel="noreferrer">numberOfInputs</a></span> or the value specified by <span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-baseaudiocontext-createchannelmerger" target="_blank" rel="noreferrer">createChannelMerger</a></span>. <u></u><u></u></p></td></tr><tr><td style="padding:0.75pt"><p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-audionode-numberofoutputs" target="_blank" rel="noreferrer">numberOfOutputs</a></span> <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">1 <u></u><u></u></p></td><td style="padding:0.75pt"></td></tr><tr><td style="padding:0.75pt"><p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-audionode-channelcount" target="_blank" rel="noreferrer">channelCount</a></span> <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">1 <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">Has <a href="https://www.w3.org/TR/webaudio/#audionode-channelcount-constraints" target="_blank" rel="noreferrer">channelCount constraints</a> <u></u><u></u></p></td></tr><tr><td style="padding:0.75pt"><p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-audionode-channelcountmode" target="_blank" rel="noreferrer">channelCountMode</a></span> <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">"<span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-channelcountmode-explicit" target="_blank" rel="noreferrer">explicit</a></span>" <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">Has <a href="https://www.w3.org/TR/webaudio/#audionode-channelcountmode-constraints" target="_blank" rel="noreferrer">channelCountMode constraints</a> <u></u><u></u></p></td></tr><tr><td style="padding:0.75pt"><p class="MsoNormal"><span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-audionode-channelinterpretation" target="_blank" rel="noreferrer">channelInterpretation</a></span> <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">"<span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#dom-channelinterpretation-speakers" target="_blank" rel="noreferrer">speakers</a></span>" <u></u><u></u></p></td><td style="padding:0.75pt"></td></tr><tr><td style="padding:0.75pt"><p class="MsoNormal"><a href="https://www.w3.org/TR/webaudio/#tail-time" target="_blank" rel="noreferrer">tail-time</a> <u></u><u></u></p></td><td style="padding:0.75pt"><p class="MsoNormal">No <u></u><u></u></p></td><td style="padding:0.75pt"></td></tr></tbody></table><div style="border-top:none;border-right:none;border-left:none;border-bottom:1.5pt solid windowtext;padding:0in 0in 1pt"><p class="MsoNormal" style="border:none;padding:0in">This interface represents an <span style="font-size:10pt;font-family:"Courier New""><a href="https://www.w3.org/TR/webaudio/#audionode" target="_blank" rel="noreferrer">AudioNode</a></span> for combining channels from multiple audio streams into a single audio stream. It has a variable number of inputs (defaulting to 6), but not all of them need be connected. There is a single output whose audio stream has a number of channels equal to the number of inputs when any of the inputs is <a href="https://www.w3.org/TR/webaudio/#actively-processing" target="_blank" rel="noreferrer">actively processing</a>. If none of the inputs are <a href="https://www.w3.org/TR/webaudio/#actively-processing" target="_blank" rel="noreferrer">actively processing</a>, then output is a single channel of silence. […]<u></u><u></u></p><p class="MsoNormal" style="border:none;padding:0in"><u></u> <u></u></p></div><p class="MsoNormal">v/r Don<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><u></u> <u></u></p><div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0in 0in"><p class="MsoNormal"><b>From:</b> x3d-public <<a href="mailto:x3d-public-bounces@web3d.org" target="_blank" rel="noreferrer">x3d-public-bounces@web3d.org</a>> <b>On Behalf Of </b>GPU Group<br><b>Sent:</b> Sunday, March 5, 2023 5:51 AM<br><b>To:</b> X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org" target="_blank" rel="noreferrer">x3d-public@web3d.org</a>><br><b>Subject:</b> Re: [x3d-public] Sound v4 > channel nodes > node design comparison v4 vs Doug proposed<u></u><u></u></p></div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">correction to b) <u></u><u></u></p><div><p class="MsoNormal"><span style="font-family:Consolas">proposed</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexStream='0,1'</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div></div></div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">On Sun, Mar 5, 2023 at 6:44 AM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noreferrer">gpugroup@gmail.com</a>> wrote:<u></u><u></u></p></div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in"><div><div><p class="MsoNormal">Here's an even better proposed design using a 3-tuple, and showing more tested scenarios<u></u><u></u></p><div><p class="MsoNormal">CHANNEL NODE DESIGN COMPARISON<u></u><u></u></p><p class="MsoNormal">v4: channel nodes as written in v4 Spec Draft Sound Component<u></u><u></u></p><p class="MsoNormal">- merger.children is a sequential list of output/destination channels<u></u><u></u></p><p class="MsoNormal">proposed: add 3 fields to ChannelMerger <u></u><u></u></p><p class="MsoNormal">-  MFInt32 indexStream, indexSource, indexDestination<u></u><u></u></p><p class="MsoNormal">- and eliminate ChannelSelector node. <u></u><u></u></p><p class="MsoNormal">- Merger.children is a list of audio streams.<u></u><u></u></p><p class="MsoNormal">I have both v4 and proposed implemented in freewrl: if indexStream, Source or Destination is empty, thunks to v4<u></u><u></u></p><p class="MsoNormal">I tested both methods on 5 scenarios and they both work as follows:<u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">a) swapping 2 channels</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">v4</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='1'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">                 <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">proposed</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexStream='0,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexSource='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexDestination='1,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">b) merging 2 channels into 1</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">v4</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          <Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='1'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">                 <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          </Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">proposed</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexStream='0,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexSource='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexDestination='0,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">c) merging 2 channels into 2nd merger channel (skipping first output channel)</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">v4</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          <Gain/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          <Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='1'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">                <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          </Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">proposed:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' </span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexStream='0,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexSource='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexDestination='1,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">d) assign different audio streams to first and 2nd channnels (play beat in left, cnote in right)</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">v4</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='2' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <Gain gain='.5'><AudioClip url='"sound/beat.mp3"'/></Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <Gain gain='.5'><AudioClip url='"sound/cnote.wav"'/></Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">proposed:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='2' </span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexSteam='0,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexSourc='-1,-1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexDestination='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <Gain gain='.5'><AudioClip url='"sound/beat.mp3"'/></Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <Gain gain='.5'><AudioClip url='"sound/cnote.wav"'/></Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">e) assign different audio streams to first and 2nd channnels via splitter take first channel (play beat in left, cnote in right)</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">v4</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='2' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelChoice='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter channelCount='2'><AudioClip url='"sound/beat.mp3"'/></ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelChoice='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter channelCount='2'><AudioClip url='"sound/cnote.wav"'/></ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">proposed:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='2'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexStream='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexSourc='0,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indexDestination='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter channelCount='2'><AudioClip url='"sound/beat.mp3"'/></ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter channelCount='2'><AudioClip url='"sound/cnote.wav"'/></ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">/</span>CHANNEL NODE DESIGN COMPARISON<u></u><u></u></p></div></div></div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">On Sat, Mar 4, 2023 at 10:20 AM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noreferrer">gpugroup@gmail.com</a>> wrote:<u></u><u></u></p></div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in"><div><div><p class="MsoNormal">CHANNEL NODE DESIGN COMPARISON<u></u><u></u></p><p class="MsoNormal">v4: channel nodes as written in v4 Spec Draft Sound Component<u></u><u></u></p><p class="MsoNormal">Doug proposed: add 2 fields to ChannelMerger MFInt32 indxDst and indxSrc and eliminate ChannelSelector node<u></u><u></u></p><p class="MsoNormal">I have both v4 and Doug proposed implemented in freewrl: if indxDst or indxSrc is empty, thunks to v4<u></u><u></u></p><p class="MsoNormal">I tested both methods on 3 scenarios and they both work as follows:<u></u><u></u></p><p class="MsoNormal">a) swapping 2 channels<u></u><u></u></p><p class="MsoNormal">v4<u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='1'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">                 <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">Doug proposed</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' </span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indxSrc='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indxDst='1,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">b) merging 2 channels into 1</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">v4</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          <Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='1'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">                 <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          </Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">Doug proposed</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' </span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indxSrc='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indxDst='0,0'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">c) merging 2 channels into 2nd merger channel (skipping first output channel)</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">v4</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          <Gain/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          <Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='1'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">                <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">               </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSelector channelSelection='0'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            </ChannelSelector></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          </Gain></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">Doug proposed:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        <ChannelMerger channelCount='6' </span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indxSrc='0,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          indxDst='1,1'</span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">          ></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             <ChannelSplitter DEF='Channel_Splitter' channelCount='6'></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">              <AudioClip url='"sound/6_Channel_ID.wav"'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">             </ChannelSplitter></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">            <ChannelSplitter USE='Channel_Splitter'/></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas">        </ChannelMerger></span><u></u><u></u></p><p class="MsoNormal"><span style="font-family:Consolas"> </span><u></u><u></u></p><p class="MsoNormal">/CHANNEL NODE DESIGN COMPARISON<u></u><u></u></p><p class="MsoNormal">-Doug<u></u><u></u></p></div></div></blockquote></div></blockquote></div></div></div></div></blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>