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

Brutzman, Donald (Don) (CIV) brutzman at nps.edu
Sun Mar 5 11:57:04 PST 2023


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 <mailto: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 <mailto: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/78491b54/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5464 bytes
Desc: not available
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20230305/78491b54/attachment-0001.p7s>


More information about the x3d-public mailing list