# I understand x(-1) theory, but how is it working in the code? Please help. | FX Book Questions | Forum

guest

— Forum Scope —

— Match —

— Forum Options —

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

Member
Members
November 17, 2015 - 11:20 am
Member Since: November 17, 2015
Forum Posts: 48
Offline

So I understand the following in theory, however I don't understand how this code is actually grabbing or playing the previous sample.
If anybody could explain this to me, it would help so much!

I don't understand how xn_1 equal x(n-1) in theory because xn_1 is just a variable that equals another variable which is m_f_z1_left. How does it grab the previous sample?

float xn = pInputBuffer[0];

// Read Delay samp is x(n-1)
float xn_1 = m_f_z1_left;

// Difference Equation
float yn = m_f_a0_left*xn + m_f_a1_left*xn_1;

//Write Delay with current x(n)
m_f_z1_left = xn;

// Output sample is y(n)
pOutputBuffer[0] = yn*m_fVolume;

Leiden, The Netherlands
November 17, 2015 - 6:58 pm
Member Since: November 5, 2014
Forum Posts: 80
Offline

Hi Skyler,

The processAudioFrame() function this code is in, gets called (executed) every time a sample is ready to be processed. This is something Will took care for us behind the scenes, so we donâ€™t have to think about that. What you do need to be aware of, is that your plug-in itself is a c++ class in which you can declare member variables like m_f_z1_left that stay â€˜aliveâ€™ beyond the scope of the processAudioFrame() function. On the other hand you have the local variables xn and yn that are declared in the processAudioFrame() function itself. These will be deleted when the function reaches its end.

So letâ€™s see what happens when we loop through the processAudioFrame() function a few times:

1: In the first run the current sample will be stored in xn at the beginning of the function: float xn = pInputBuffer[0]. At the end of the function this value xn will be stored in the member variable: m_f_z1_left = xn.

2. In the second run the (new) current sample will be stored in xn again: float xn = pInputBuffer[0]. Then, the value that is stored in the member variable m_f_z1_left - which is the xn value of the previous run â€“ will be stored in float xn_1 = m_f_z1_left. This is now your 1 sample delay.

3. and so onâ€¦

If you get the difference between local variables (like xn and yn), and member variables (like m_f_z1_left) you should be able to figure it out. Read up on the subjects of â€˜scopeâ€™ and â€˜persistence of dataâ€™ if you want to be thorough 😉 Hope this helps!

All the best,

JD

Member
Members
November 18, 2015 - 3:52 am
Member Since: November 17, 2015
Forum Posts: 48
Offline

Awesome, Thanks a lot JD. This is what I needed, the direction I should be learning in. It makes a lot more sense. Thanks again!

Forum Timezone: America/New_York

Most Users Ever Online: 152

Currently Online:
5 Guest(s)

1 Guest(s)

Top Posters:

Chaes: 56

Skyler: 48

StevieD: 46

Derek: 46

Frodson: 45

Peter: 43

TheSmile: 43

Nickolai: 43

clau_ste: 39

jeanlecode: 37

Member Stats:

Guest Posters: 1

Members: 768

Moderators: 1

Forum Stats:

Groups: 13

Forums: 42

Topics: 842

Posts: 3347

Moderators: W Pirkle: 689