[x3d-public] Sound v4 > channel nodes > node design comparison v4 vs Doug proposed; ChannelMerger

GPU Group gpugroup at gmail.com
Sun Mar 5 13:13:41 PST 2023


Don,
Thanks for feedback.
Tuples needed. And web3d doesn't have tuple fields.
If web3d had MFInt32_3tuple field type that would be great in this use-case.
In this case the tuple needed is (destinationChannel, sourceChannel,
audioStream)
Next best I can think of 3 MFInt32 fields --and some prose to explain they
should have the same number of entries.
It's not in w3c because its another mechanism to convert procedural code to
declarative.
-Doug
more..
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.
"The Merger.children field represents a list of destinationChannels ..."
That's when I tried the 2-tuple. The prose for it would look like
"The Merger.children field represents a list of sourceChannels"
The 2-tuple didn't work with scenarios d) and e).
The 3-tuple prose would look like this:
"The Merger.children field represents a list of audio streams"
Decoupling the children field from both destinationChannel and
sourceChannel had benefits:
- 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
- can do all the other permutations of merging and swapping channels with
indexSource and indexDestination

PROSE COMPARISON TEST?
Perhaps a good test of design is which is easier to explain for all use
cases


On Sun, Mar 5, 2023 at 12:57 PM Brutzman, Donald (Don) (CIV) <
brutzman at nps.edu> wrote:

> Thanks for continued scrutiny and experimentation efforts Doug.
>
>
>
> Primary point from last Friday is that we are trying to align with Web
> Audio API parameters closely and correctly.
>
>
>
> 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:
>
>
>
>    - SFInt32 [in out] indexStream 0
>    - SFInt32 [in out] indexSource 0
>    - SFInt32 [in out] indexDestination 0
>    - SFInt32 [in out] channelCount 0
>
>
>
> Reference
>
>    -
>    https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-DIS/Part01/components/sound.html#ChannelMerger
>
>
>
> However am not seeing a match between what you’re suggesting here and what
> W3C Audio API says, please advise.
>
>
>
>    - https://www.w3.org/TR/webaudio/#channelmergernode
>
>
>
> *1.14. The **ChannelMergerNode
> <https://www.w3.org/TR/webaudio/#channelmergernode>** Interface*
>
> The ChannelMergerNode <https://www.w3.org/TR/webaudio/#channelmergernode>
> is for use in more advanced applications and would often be used in
> conjunction with ChannelSplitterNode
> <https://www.w3.org/TR/webaudio/#channelsplitternode>.
>
> *Property *
>
> *Value *
>
> *Notes *
>
> numberOfInputs
> <https://www.w3.org/TR/webaudio/#dom-audionode-numberofinputs>
>
> see notes
>
> Defaults to 6, but is determined by ChannelMergerOptions
> <https://www.w3.org/TR/webaudio/#dictdef-channelmergeroptions>,
> numberOfInputs
> <https://www.w3.org/TR/webaudio/#dom-channelmergeroptions-numberofinputs>
> or the value specified by createChannelMerger
> <https://www.w3.org/TR/webaudio/#dom-baseaudiocontext-createchannelmerger>.
>
>
> numberOfOutputs
> <https://www.w3.org/TR/webaudio/#dom-audionode-numberofoutputs>
>
> 1
>
> channelCount <https://www.w3.org/TR/webaudio/#dom-audionode-channelcount>
>
> 1
>
> Has channelCount constraints
> <https://www.w3.org/TR/webaudio/#audionode-channelcount-constraints>
>
> channelCountMode
> <https://www.w3.org/TR/webaudio/#dom-audionode-channelcountmode>
>
> "explicit <https://www.w3.org/TR/webaudio/#dom-channelcountmode-explicit>"
>
>
> Has channelCountMode constraints
> <https://www.w3.org/TR/webaudio/#audionode-channelcountmode-constraints>
>
> channelInterpretation
> <https://www.w3.org/TR/webaudio/#dom-audionode-channelinterpretation>
>
> "speakers
> <https://www.w3.org/TR/webaudio/#dom-channelinterpretation-speakers>"
>
> tail-time <https://www.w3.org/TR/webaudio/#tail-time>
>
> No
>
> This interface represents an AudioNode
> <https://www.w3.org/TR/webaudio/#audionode> 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 actively processing
> <https://www.w3.org/TR/webaudio/#actively-processing>. If none of the
> inputs are actively processing
> <https://www.w3.org/TR/webaudio/#actively-processing>, then output is a
> single channel of silence. […]
>
>
>
> v/r Don
>
>
>
>
>
>
>
> *From:* x3d-public <x3d-public-bounces at web3d.org> *On Behalf Of *GPU Group
> *Sent:* Sunday, March 5, 2023 5:51 AM
> *To:* X3D Graphics public mailing list <x3d-public at web3d.org>
> *Subject:* Re: [x3d-public] Sound v4 > channel nodes > node design
> comparison v4 vs Doug proposed
>
>
>
> correction to b)
>
> proposed
>
>         <ChannelMerger channelCount='6'
>
>           indexStream='0,1'
>
>
>
>
>
> On Sun, Mar 5, 2023 at 6:44 AM GPU Group <gpugroup at gmail.com> wrote:
>
> Here's an even better proposed design using a 3-tuple, and showing more
> tested scenarios
>
> CHANNEL NODE DESIGN COMPARISON
>
> v4: channel nodes as written in v4 Spec Draft Sound Component
>
> - merger.children is a sequential list of output/destination channels
>
> proposed: add 3 fields to ChannelMerger
>
> -  MFInt32 indexStream, indexSource, indexDestination
>
> - and eliminate ChannelSelector node.
>
> - Merger.children is a list of audio streams.
>
> I have both v4 and proposed implemented in freewrl: if indexStream, Source
> or Destination is empty, thunks to v4
>
> I tested both methods on 5 scenarios and they both work as follows:
>
> a) swapping 2 channels
>
> v4
>
>         <ChannelMerger channelCount='6' >
>
>             <ChannelSelector channelSelection='1'>
>
>                <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                  <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>                </ChannelSplitter>
>
>             </ChannelSelector>
>
>             <ChannelSelector channelSelection='0'>
>
>               <ChannelSplitter USE='Channel_Splitter'/>
>
>             </ChannelSelector>
>
>         </ChannelMerger>
>
> proposed
>
>         <ChannelMerger channelCount='6'
>
>           indexStream='0,0'
>
>           indexSource='0,1'
>
>           indexDestination='1,0'
>
>           >
>
>              <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>               <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>              </ChannelSplitter>
>
>         </ChannelMerger>
>
> b) merging 2 channels into 1
>
> v4
>
>         <ChannelMerger channelCount='6' >
>
>           <Gain>
>
>             <ChannelSelector channelSelection='1'>
>
>                <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                  <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>                </ChannelSplitter>
>
>             </ChannelSelector>
>
>             <ChannelSelector channelSelection='0'>
>
>               <ChannelSplitter USE='Channel_Splitter'/>
>
>             </ChannelSelector>
>
>           </Gain>
>
>         </ChannelMerger>
>
> proposed
>
>         <ChannelMerger channelCount='6'
>
>           indexStream='0,0'
>
>           indexSource='0,1'
>
>           indexDestination='0,0'
>
>           >
>
>              <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>              </ChannelSplitter>
>
>         </ChannelMerger>
>
> c) merging 2 channels into 2nd merger channel (skipping first output
> channel)
>
> v4
>
>         <ChannelMerger channelCount='6' >
>
>           <Gain/>
>
>           <Gain>
>
>             <ChannelSelector channelSelection='1'>
>
>                <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                 <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>                </ChannelSplitter>
>
>             </ChannelSelector>
>
>             <ChannelSelector channelSelection='0'>
>
>               <ChannelSplitter USE='Channel_Splitter'/>
>
>             </ChannelSelector>
>
>           </Gain>
>
>         </ChannelMerger>
>
> proposed:
>
>         <ChannelMerger channelCount='6'
>
>           indexStream='0,0'
>
>           indexSource='0,1'
>
>           indexDestination='1,1'
>
>           >
>
>              <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>               <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>              </ChannelSplitter>
>
>         </ChannelMerger>
>
>
>
> d) assign different audio streams to first and 2nd channnels (play beat in
> left, cnote in right)
>
> v4
>
>         <ChannelMerger channelCount='2' >
>
>               <Gain gain='.5'><AudioClip url='"sound/beat.mp3"'/></Gain>
>
>               <Gain gain='.5'><AudioClip url='"sound/cnote.wav"'/></Gain>
>
>         </ChannelMerger>
>
> proposed:
>
>         <ChannelMerger channelCount='2'
>
>           indexSteam='0,0'
>
>           indexSourc='-1,-1'
>
>           indexDestination='0,1'
>
>           >
>
>               <Gain gain='.5'><AudioClip url='"sound/beat.mp3"'/></Gain>
>
>               <Gain gain='.5'><AudioClip url='"sound/cnote.wav"'/></Gain>
>
>         </ChannelMerger>
>
> e) assign different audio streams to first and 2nd channnels via splitter
> take first channel (play beat in left, cnote in right)
>
> v4
>
>         <ChannelMerger channelCount='2' >
>
>             <ChannelSelector channelChoice='0'>
>
>               <ChannelSplitter channelCount='2'><AudioClip
> url='"sound/beat.mp3"'/></ChannelSplitter>
>
>             </ChannelSelector>
>
>             <ChannelSelector channelChoice='0'>
>
>               <ChannelSplitter channelCount='2'><AudioClip
> url='"sound/cnote.wav"'/></ChannelSplitter>
>
>             </ChannelSelector>
>
>         </ChannelMerger>
>
> proposed:
>
>         <ChannelMerger channelCount='2'
>
>           indexStream='0,1'
>
>           indexSourc='0,0'
>
>           indexDestination='0,1'
>
>           >
>
>               <ChannelSplitter channelCount='2'><AudioClip
> url='"sound/beat.mp3"'/></ChannelSplitter>
>
>               <ChannelSplitter channelCount='2'><AudioClip
> url='"sound/cnote.wav"'/></ChannelSplitter>
>
>         </ChannelMerger>
>
> /CHANNEL NODE DESIGN COMPARISON
>
>
>
> On Sat, Mar 4, 2023 at 10:20 AM GPU Group <gpugroup at gmail.com> wrote:
>
> CHANNEL NODE DESIGN COMPARISON
>
> v4: channel nodes as written in v4 Spec Draft Sound Component
>
> Doug proposed: add 2 fields to ChannelMerger MFInt32 indxDst and indxSrc
> and eliminate ChannelSelector node
>
> I have both v4 and Doug proposed implemented in freewrl: if indxDst or
> indxSrc is empty, thunks to v4
>
> I tested both methods on 3 scenarios and they both work as follows:
>
> a) swapping 2 channels
>
> v4
>
>         <ChannelMerger channelCount='6' >
>
>             <ChannelSelector channelSelection='1'>
>
>                <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                  <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>                </ChannelSplitter>
>
>             </ChannelSelector>
>
>             <ChannelSelector channelSelection='0'>
>
>               <ChannelSplitter USE='Channel_Splitter'/>
>
>             </ChannelSelector>
>
>         </ChannelMerger>
>
> Doug proposed
>
>         <ChannelMerger channelCount='6'
>
>           indxSrc='0,1'
>
>           indxDst='1,0'
>
>           >
>
>              <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>               <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>              </ChannelSplitter>
>
>             <ChannelSplitter USE='Channel_Splitter'/>
>
>         </ChannelMerger>
>
> b) merging 2 channels into 1
>
> v4
>
>         <ChannelMerger channelCount='6' >
>
>           <Gain>
>
>             <ChannelSelector channelSelection='1'>
>
>                <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                  <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>                </ChannelSplitter>
>
>             </ChannelSelector>
>
>             <ChannelSelector channelSelection='0'>
>
>               <ChannelSplitter USE='Channel_Splitter'/>
>
>             </ChannelSelector>
>
>           </Gain>
>
>         </ChannelMerger>
>
> Doug proposed
>
>         <ChannelMerger channelCount='6'
>
>           indxSrc='0,1'
>
>           indxDst='0,0'
>
>           >
>
>              <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>              </ChannelSplitter>
>
>              <ChannelSplitter USE='Channel_Splitter'/>
>
>         </ChannelMerger>
>
> c) merging 2 channels into 2nd merger channel (skipping first output
> channel)
>
> v4
>
>         <ChannelMerger channelCount='6' >
>
>           <Gain/>
>
>           <Gain>
>
>             <ChannelSelector channelSelection='1'>
>
>                <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>                 <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>                </ChannelSplitter>
>
>             </ChannelSelector>
>
>             <ChannelSelector channelSelection='0'>
>
>               <ChannelSplitter USE='Channel_Splitter'/>
>
>             </ChannelSelector>
>
>           </Gain>
>
>         </ChannelMerger>
>
> Doug proposed:
>
>         <ChannelMerger channelCount='6'
>
>           indxSrc='0,1'
>
>           indxDst='1,1'
>
>           >
>
>              <ChannelSplitter DEF='Channel_Splitter' channelCount='6'>
>
>               <AudioClip url='"sound/6_Channel_ID.wav"'/>
>
>              </ChannelSplitter>
>
>             <ChannelSplitter USE='Channel_Splitter'/>
>
>         </ChannelMerger>
>
>
>
> /CHANNEL NODE DESIGN COMPARISON
>
> -Doug
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20230305/483e9b1d/attachment-0001.html>


More information about the x3d-public mailing list