Avatar

Please consider registering
Guest

sp_LogInOut Log In sp_Registration Register

Register | Lost password?
Advanced Search

— Forum Scope —




— Match —





— Forum Options —





Minimum search word length is 3 characters - maximum search word length is 84 characters

sp_Feed sp_TopicIcon
Zipper noise
No permission to create posts
February 7, 2015
3:13 pm
Avatar
JD Young
Leiden, The Netherlands
Admin
Forum Posts: 80
Member Since:
November 5, 2014
sp_UserOfflineSmall Offline

Hi Will, congratulations with releasing v6.5! :)

I’m making some variations on the delay plug-in in your fx book. I've implemented the 2-sample interpolation, but I’m still experiencing some zipper noise if I adjust the delay time (in ms) while playing audio. To be sure I didn’t do anything wrong I downloaded the ‘Chapter 7: StereoDelay’ project from your site, but it has the same problem.

Is there any way to eliminate this zipper noise completely? Maybe with a higher order interpolation?

All the best,

JD

February 7, 2015
8:46 pm
Avatar
W Pirkle
Admin
Forum Posts: 143
Member Since:
January 28, 2017
sp_UserOnlineSmall Online

Hi JD

This is an issue that happens with any plugin/GUI and is not related to the algorithm, though the delay-time control is one that emphasizes the problem. The thing you need to add is a way to slow down the abrupt changes that the GUI slider/knob generates. This will happen whenever the user changes any control, before the variable is applied to the algorithm. There are several implementations of this.

1. see if you can find the MMA DLS Level II spec - it is a spec for a software synth. The MMA (MIDI Manufacturer's Association) recommends using a "ramp generator" that fires each time the GUI control is changed; the underlying variable is slowly "ramped" up or down just a few ticks per sample period.

2. in the Steinberg VST3 SDK in the Note Expression Synth sample code, you can find this ramp generator implementation

3. there is a similar thread already on this forum here:

http://www.willpirkle.com/foru.....scillator/

One interesting approach there is to use a LPF to slow down the control change value.

The reason I do not add this code to the books is that it will complicate things a bit - in any implementation you will need to declare extra variables (at least one per GUI control) and in the case of the ramp generator, setup counter increment variables. Check out that VST3 code and you will see how all the GUI variables are doubled.

- Will

February 7, 2015
9:06 pm
Avatar
JD Young
Leiden, The Netherlands
Admin
Forum Posts: 80
Member Since:
November 5, 2014
sp_UserOfflineSmall Offline

Very helpful! Thanks :)

February 8, 2015
3:14 pm
Avatar
alexirae
Member
Members
Forum Posts: 11
Member Since:
November 24, 2013
sp_UserOfflineSmall Offline

Hi JD Young, also you can do something like this (taken from a comment that I made in http://musicdsp.org/showArchiv.....hiveID=257):

class CParamSmooth
{
public:
CParamSmooth(float smoothingTimeInMs, float samplingRate)
{
const float c_twoPi = 6.283185307179586476925286766559f;

a = exp(-c_twoPi / (smoothingTimeInMs * 0.001f * samplingRate));
b = 1.0f - a;
z = 0.0f;
}

inline float process(float in)
{
z = (in * b) + (z * a);
return z;
}

private:
float a;
float b;
float z;
};

Which is a parameter LPF, just instantiate one of those for your DelayTime parameter with smoothingTimeInMs around 1500 ms. The process function needs to be called in the process function of your Delay Effect every sample. For other parameters you can usually set values around 5 or 10 ms. Just experiment with it and tell me how it goes. Wink

February 13, 2015
1:41 am
Avatar
JD Young
Leiden, The Netherlands
Admin
Forum Posts: 80
Member Since:
November 5, 2014
sp_UserOfflineSmall Offline

Thank you very much Alex! This looks good! I will give it a go this weekend :)

February 13, 2015
1:48 am
Avatar
JD Young
Leiden, The Netherlands
Admin
Forum Posts: 80
Member Since:
November 5, 2014
sp_UserOfflineSmall Offline

I’m still modifying my delay algorithm and was trying to figure out how to read the hosts BPM from the midiClock() function, so I can sync the delay times with the project the plug-in will be used in. This doesn’t seem as straight forward as I had hoped. Is there a simple way to catch the BPM and the BPM changes real-time?

Btw I managed to create my first custom gui in v6.5 (and knobman). Great work Will!

Thanks to you both!

JD

February 13, 2015
9:26 pm
Avatar
W Pirkle
Admin
Forum Posts: 143
Member Since:
January 28, 2017
sp_UserOnlineSmall Online

Hi JD

Unfortunately you have to write your own BPM code as I don't have any readily available (maybe someone else does?) and use the RAFX midiClock() method.

http://www.blitter.com/~russto...../clock.htm

Glad you are having fun with the GUI designer. Several other book readers (and students) have made some really excellent GUIs using it, but the quality ultimately resides in the quality of the graphics you supply. In future versions of RAFX, I will add more support for some of the more esoteric VSTGUI4 control objects such as "row/column view" (listview or tableview).

KnobMan is pretty awesome but you should also check out SkinMan which makes GUI backgrounds - very impressive. Open the links below in YouTube to see the full-screen. The one at the bottom (Korg tuner) is very very cool!

- Will

February 19, 2015
3:20 pm
Avatar
JD Young
Leiden, The Netherlands
Admin
Forum Posts: 80
Member Since:
November 5, 2014
sp_UserOfflineSmall Offline

After some research I think I know what to do to get the BPM into my delay plug-in. I guess I could just count the clock messages in midiClock() with a simple incrementing int: m_ClockCount++ in this function. I could do the same in processAudioFrame() for the samples: m_SampleCount++. With these two variables (and m_nSampeRate) I could calculate the BPM and track changes in the BPM. I do wonder if this would only work as a RAFX plug-in or also port correctly to VST and AU using RAFX?

(It still seems a bit cumbersome to me that developers of sequencers don’t communicate the BPM and Time Signature in a more direct way… Or do they?)

Thanks for the example vids btw! I’m not much of a designer myself, but I have a friend who uses Photoshop to help me out from time to time. But Skinman might be a good tool for me!

JD

February 19, 2015
6:46 pm
Avatar
W Pirkle
Admin
Forum Posts: 143
Member Since:
January 28, 2017
sp_UserOnlineSmall Online

Hi JD

Yes, both Bar Markers and Time Signatures are sent by sequencers. The Time Signature message has two versions - one in which the receiving unit changes the time signature immediately (real time) and the other is non-real time. Your MIDI controller/keyboard will need to have sequencer functionality built-in so you would need to check for that. If using a MIDI DAW then that info is transmitted as the sequence plays through. Both messages are real-time system exclusive (SysEx) types.

These messages will be routed to the midiMessage() function in RackAFX. And, the MIDI stuff all ports directly in VST and AU - they are just simple call-forwards.

http://academic.pgcc.edu/~njud.....I/mtc.html

for more information on these messages.

- Will

October 29, 2017
5:34 am
Avatar
omelc
New Member
Members
Forum Posts: 1
Member Since:
October 29, 2017
sp_UserOfflineSmall Offline

2. in the Steinberg VST3 SDK in the Note Expression Synth sample code, you can find this ramp generator implementation

For those who might be interested, linear parameter interpolation is explained in the file VST3_SDK\doc\vstinterfaces\vst3Automation.html, section 'Automation Playback' (from vstsdk367_03_03_2017_build_352.zip).

October 29, 2017
4:35 pm
Avatar
W Pirkle
Admin
Forum Posts: 143
Member Since:
January 28, 2017
sp_UserOnlineSmall Online

A couple of notes:

The VST3 parameter interpolation is only activated with sample accurate automation in VST3 plugins only and only works for automation, not GUI controls (the original issue in the thread). RackAFX supports this as well for VST3 plugins created with MakeVST or RackAFX DLL as VST3 DLL and you can find the code in the MakeVST project files. 

RackAFX supports automatic parameter smoothing for GUI controls; there are videos posted of this in action, to prevent GUI zipper noise. The RackAFX parameter smoothing uses a simple LPF which alexirae contributed some time ago, and does not use the linear-ramp method.

- Will

Forum Timezone: America/New_York

Most Users Ever Online: 36

Currently Online: W Pirkle
4 Guest(s)

Currently Browsing this Page:
1 Guest(s)

Top Posters:

Skyler: 47

Peter: 41

Derek: 41

clau_ste: 39

Frodson: 38

Gwen: 32

EZB: 24

lppier: 23

Msaldaña: 18

Jorge: 17

Member Stats:

Guest Posters: 1

Members: 477

Moderators: 1

Admins: 4

Forum Stats:

Groups: 11

Forums: 30

Topics: 483

Posts: 1877

Newest Members:

Jaggxn, sam, annaharris, Marie Weaver, kev, Steven, Mr Anderson, mguy, omelc

Moderators: W Pirkle: 143

Administrators: Tom: 65, JD Young: 80, Will Pirkle: 0, W Pirkle: 143