The No.1 Website for Pro Audio
Airwindows ToMono: Mac/Windows/Linux AU/VST
Old 1 week ago
  #1
Airwindows
 
chrisj's Avatar
Software Airwindows ToMono: Mac/Windows/Linux AU/VST



TL;DW: ToMono (LeftoMono and RightoMono) copy one channel to both, losslessly.

ToMono.zip(655k)

Time for another tiny utility plugin or two!

LeftoMono or RightoMono exist for only one purpose: if your input is either left or right, it's coming in on a stereo channel, and you have no use for the other side.

No, worse: you're coming off some kind of camera or camcorder and the other side is not only 'nothing', it shows some noise or interference that's actively bad. In those situations you are often given the option, 'Convert to mono?' but doing that will combine the real signal with the garbage, interference, not-really-clean-silence signal.

And so, ToMono. They do exactly what the name suggests. There's nothing to them, no controls or UI of any kind, you don't need to open any interface or do anything. Instantiate the one you need and boom: you are now copying the input data words from the side you want, to the side you don't. Pure cloned mono of the highest possible quality in a single plugin. And since it's so simple it'll work in places like OBS where maybe sometimes they don't handle generic VSTs properly or generate controls: hey, none needed!

This is a super boring plugin… except when you need it most. Hope you like it. (I no longer need it as I'm running my lav into the real mixing board… but I used LeftoMono last week, before putting it out. It can't save the camera from other issues like robot-voice over HDMI, but it rescued me from the 'interference and bad silence' extra stereo channel.

Airwindows is supported by Patreon. That's how I'm still here, I get to throw Patreon money at gear (including gear I hope to emulate in future or study technically) and it's very much appreciated. Thank you
Old 1 week ago
  #2
Lives for gear
 
Beatworld's Avatar
FYI, the audio is slightly out of sync with the video.
Is that related to the new mic setup ?

Thanks for ToMono
Old 1 week ago
  #3
Airwindows
 
chrisj's Avatar
Quote:
Originally Posted by Beatworld View Post
FYI, the audio is slightly out of sync with the video.
Is that related to the new mic setup ?

Thanks for ToMono
Yeah it is. I'm fixing it, I think from now on I can have it perfect

For over a month every single thing I've done, whether it's the plugin video or Monday Q&A or the Tuesday music jam, has been an entirely new and different problem solving activity. Whoof
Old 1 week ago
  #4
Gear Maniac
 

If used in modular plugin [eg. Metaplugin] can one create a layout in which EVERY dynamic processor can be plocessed in a dual mono fashion ?
Old 1 week ago
  #5
Airwindows
 
chrisj's Avatar
Quote:
Originally Posted by MusicLov3r View Post
If used in modular plugin [eg. Metaplugin] can one create a layout in which EVERY dynamic processor can be plocessed in a dual mono fashion ?
I don't know
Old 1 week ago
  #6
Gear Maniac
 

Quote:
Originally Posted by chrisj View Post
I don't know
"don't know" is not a valid answer, young Mr. Johnson !



Old 1 week ago
  #7
Gear Addict
 

Quote:
Originally Posted by MusicLov3r View Post
If used in modular plugin [eg. Metaplugin] can one create a layout in which EVERY dynamic processor can be plocessed in a dual mono fashion ?
Yep. Also Wet/Dry(shift+mouse
Old 1 week ago
  #8
Here for the gear
 

I was having a look at the code for this plugin and I'm curious about it. (I have very minimal coding background, but I do like to understand how my tools work!)

So, I think I understand this bit:

*out1 = *in1;
*out2 = *in1;

But I don't really get the processReplacing and processDoubleReplacing parts. I don't see why they'd be used on a plugin like this and if the "void" part means they aren't being used, then why are they there at all?
Old 1 week ago
  #9
Gear Addict
 

Quote:
Originally Posted by arkrabtree View Post
I was having a look at the code for this plugin and I'm curious about it. (I have very minimal coding background, but I do like to understand how my tools work!)

So, I think I understand this bit:

*out1 = *in1;
*out2 = *in1;

But I don't really get the processReplacing and processDoubleReplacing parts. I don't see why they'd be used on a plugin like this and if the "void" part means they aren't being used, then why are they there at all?
processDoubleReplacing means 64 bit internal processing(i.e "double" precision), similarly processReplacing means "simple" 32 bit processing.That's actually how plugins work.Replace the original "signal" entirely...

Edit :Sorry to get my nose in ....
Old 1 week ago
  #10
Here for the gear
 

Thanks @ bandorr !

I'm still not really seeing why the signal needs to be replaced. Are you saying that each plugin is creating it's own copy of the audio to process? (Rather than the original signal passing through somehow)
Old 1 week ago
  #11
Airwindows
 
chrisj's Avatar
Exclamation

Quote:
Originally Posted by arkrabtree View Post
Thanks @ bandorr !

I'm still not really seeing why the signal needs to be replaced. Are you saying that each plugin is creating it's own copy of the audio to process? (Rather than the original signal passing through somehow)
Yes, that's it. I'm guessing there's another Process that can happen, that simply adds to the existing audio (but there's no benefit to me doing that, it's like permanently having Dry on)

Void means, while we are changing the output buffer we get to use:

*out1 = *in1;
*out2 = *in1;
//means 'the data at the data address of out2 should be equal to the data at the data address of in1
//if we did in1++ (since in1 is a data address) it would make it point to the next sample to use

This all is happening inside a function, ProcessReplacing(). Somewhere the DAW is calling that and running the stuff we have in there. If it was

ProcessReplacing(int x)

and x was an int, you'd be calling the function but also telling it 'here is an int to think about: use this number in your calculations' and giving it the number.

If it was

int ProcessReplacing()

you wouldn't have to give it anything (maybe it's looking at sample rate or something, which it can find by checking the right place?) but you're expecting it to return an int when it's done. So at the end of this kind of function, you go

return x;

and x is the number (in int form) it came up with. But the thing is, you can't just do a function out of nowhere, so if you know it will do its stuff with buffers or whatever (all these Process functions get passed basically what makes up the latency of your DAW: the buffer size that lets it do stuff all at once rather than one at a time) and you know that at the end of the function it'll be done and not return any particular 'answer', the word is VOID and it means, no return at all, just keep going. Which makes the above example,

void ProcessReplacing(int x)

because it doesn't need to do anything more, or return an 'answer' out of the function itself. It did all its stuff with the buffers you gave it. (it's also possible to have it return something like 'if this worked, return true, otherwise the DAW knows something's up: that's where you get functions like in the AU code where they say ComponentResult Initialize() and return 'noErr' if everything is OK. You can define 'noErr' to be a code number, and use that.

It gets pretty complicated, but that's what void means
Old 1 week ago
  #12
Lives for gear
 
StoneyBCN's Avatar
 

Awesome info (and plugin)! This one, Golem, and One Voice Trick are a surprisingly tactile combo for DAW routing.

Guys: please go long on this discussion about the code.

I'm sitting front row with some popcorn and my "I <3 Airwindows threads" t shirt on.
Old 1 week ago
  #13
Gear Addict
 

Quote:
Originally Posted by bandorr View Post
processDoubleReplacing means ....
Actually, this is kinda... incorrect."processDoubleReplacing" and the other, are NOT indicators of the actual internal math of ANY plugin; they are "flags" or tags toward the host, so by that, the host will be let "known" what to expect from a plugin. The host doesn't care what math was used internally, until the results are conform to "his" expectations
For example, many Airwindows plugins use internally 80 bit math, but their output( and of course, input), has to be "conform" with the expectations of the host. namely (and usually) 32/64 floating point. A host, again, doesn't care "what happens inside" a plugin, until it gets, the "proper" result.
Which Chrisj (props to him!!) has solved (uniquely among plugins I might add) by (correctly) dithering their output toward the host. What he does is REAL creativity.
This stuff could be very easily misunderstood, if the "proper" language is not used or (in my case) properly explained.
Old 1 week ago
  #14
Gear Addict
 

Quote:
Originally Posted by arkrabtree View Post
Thanks @ bandorr !

I'm still not really seeing why the signal needs to be replaced. Are you saying that each plugin is creating it's own copy of the audio to process? (Rather than the original signal passing through somehow)
Yep.There is no such thing as "passing thru". That's how "daws" work. Because once the signal hits the ADC, its "just data", which can be manipulated in "every possible" way. Well.... It isn't audio, its data, which has to conform to other "laws", not those of the "physical world"
The ONLY place it will be reconstructed to a waveform, is the DAC. And then we hear the result.
Old 1 week ago
  #15
Airwindows
 
chrisj's Avatar
Quote:
Originally Posted by bandorr View Post
Actually, this is kinda... incorrect."processDoubleReplacing" and the other, are NOT indicators of the actual internal math of ANY plugin; they are "flags" or tags toward the host, so by that, the host will be let "known" what to expect from a plugin.
Well spotted. That function could be called void FredBobAndArthur(double **fred, double **bob, VstInt32 arthur) and it'd do the same thing. In fact it wouldn't look any different from the DAW side apart from the function name, because if you were calling it it'd look like

FredBobAndArthur(inputs, outputs, kBlockSize) where kBlockSize is your latency buffer size and inputs and outputs are where to find the audio data you'll need. Inside the plugin the buffer size will be called 'arthur' but in essence it's just a number. These are all simply labels.
Old 1 week ago
  #16
Here for the gear
 

Quote:
Originally Posted by bandorr View Post
Yep.There is no such thing as "passing thru". That's how "daws" work. Because once the signal hits the ADC, its "just data", which can be manipulated in "every possible" way. Well.... It isn't audio, its data, which has to conform to other "laws", not those of the "physical world"
The ONLY place it will be reconstructed to a waveform, is the DAC. And then we hear the result.
Yeah, that makes complete sense, I just never stopped to think of it that way!

Quote:
Originally Posted by chrisj View Post

It gets pretty complicated, but that's what void means
Thanks Chris! I've had to read this a couple of times, but I think I can see how those differences apply.

If in1++ is pointing at the next sample, is ending the code with

*in1++;
*in2++;
*out1++;
*out2++;
just telling it to keep going?

(Sorry for all the questions - it just feels like a good opportunity to get stuck into the details when the plugin itself is so simple!)
Old 1 week ago
  #17
Airwindows
 
chrisj's Avatar
Quote:
Originally Posted by arkrabtree View Post
If in1++ is pointing at the next sample, is ending the code with

*in1++;
*in2++;
*out1++;
*out2++;
just telling it to keep going?

(Sorry for all the questions - it just feels like a good opportunity to get stuck into the details when the plugin itself is so simple!)
That's a tricky bit, sort of a C-ism. If you had X and X was an int and was 3, and you went

X++

the next time you looked X would be 4. I was just looking up 'C operator precedence' because I thought there was a context where you could get unexpected outputs (like using the X and only afterwards applying the increment), but I didn't find the 'gotcha' I was looking for. Point(er) being,

*X++

means now you are POINTING TO the next int, or the next whatever X is. That's relevant for VSTs and such, because if you're using floats (32 bit) it means 'now point 32 bits farther along in the data to see the next sample value', not 'sample gets one bigger'. And if you're using doubles (64 bit) it means 'now point 64 bits farther along in the data, etc'.

That's the purpose of that little pile of C code. The asterisks and double-pluses do abstract stuff that makes it be referring to a different place in memory.
Old 1 week ago
  #18
Gear Addict
 

Quote:
Originally Posted by arkrabtree View Post
Yeah, that makes complete sense, I just never stopped to think of it that way!
Sorry, I didn't meant to sound like I'm "schooling" you or anybody else. Having a conversation on an internet forum (vs in person) could be ..."interesting", to say at least.
Having said that, "a+b=x" will replace both a and b with the result.That's what plugins do (well...), no matter what the fancy gui's are telling us.That's true, even when they have a wet/dry slider. It is still a "result".
Old 6 days ago
  #19
Here for the gear
 

Quote:
Originally Posted by chrisj View Post
That's the purpose of that little pile of C code. The asterisks and double-pluses do abstract stuff that makes it be referring to a different place in memory.
Ah, that actually makes a lot of sense. Thanks (for this specific answer and for more generally working to demystify the whole thing)!

Quote:
Originally Posted by bandorr View Post
Sorry, I didn't meant to sound like I'm "schooling" you or anybody else. Having a conversation on an internet forum (vs in person) could be ..."interesting", to say at least.
No need to apologise: I am a proud student at the University Of Internet. I asked the question hoping for some "schooling" and I really appreciate your answer. Thanks!
Topic:
Post Reply

Welcome to the Gearslutz Pro Audio Community!

Registration benefits include:
  • The ability to reply to and create new discussions
  • Access to members-only giveaways & competitions
  • Interact with VIP industry experts in our guest Q&As
  • Access to members-only sub forum discussions
  • Access to members-only Chat Room
  • Get INSTANT ACCESS to the world's best private pro audio Classifieds for only USD $20/year
  • Promote your eBay auctions and Reverb.com listings for free
  • Remove this message!
You need an account to post a reply. Create a username and password below and an account will be created and your post entered.


 
 
Slide to join now Processing…
Thread Tools
Search this Thread
Search this Thread:

Advanced Search
Forum Jump
Forum Jump