Page:12

## Octaver Pedal. 6 years 10 months ago #19

• JR
• Senior Member
• Posts: 77
• Karma: 6
The octaver effect generates an octaved signal which is derived from the original guitar input signal by halving (octave-down) or doubling (octave-up) the frequency. In order to do it, a small portion of the signal is stored in a buffer and then played at half or double rate.

The octaver.ino pedal can do an octave-down and octave-up. The potentiometer 0 controls the mode, the first 1/3 of the turn is octave-down, the middle point is normal sound and the last 1/3 of the turn is octave-up.

To implement the effect two buffers are used in parallel to store the signal and playing it again at double rate. The buffers are written at the same time but they are read with different indexes. When buffer A is starting, buffer B is in the middle point, and therefore when buffer A is in the middle point, buffer B is finishing. Each buffer writes in a different DAC (DAC0 and DAC1) which are hardware summed out of Arduino.
I did this buffer mistmatch in order to avoid the popping effect which is very common in digital pitch shifted effects.
• Potentiometer0: The rotation selects octave-down, normal or octave-up mode.
• Potentiometer1: Not used.
• Potentiometer2: Volume control.
• Mix Switch: when selected it mixes the original and the octaved signal

octaver.ino
// Licensed under a Creative Commons Attribution 3.0 Unported License.
// Based on rcarduino.blogspot.com previous work.
// www.electrosmash.com/pedalshield

/*octaver.ino creates an octave-up or octave-down signal from the original one.*/

int LED = 3;
int FOOTSWITCH = 7;
int TOGGLE = 2;

#define MAX_DELAY 10000
uint16_t sDelayBuffer0[MAX_DELAY-1];
uint16_t sDelayBuffer1[MAX_DELAY-1];
unsigned int write_pt=0;
unsigned int Delay_Depth, increment, divider=0, buffer0, buffer1;

void setup()
{
//turn on the timer clock in the power management controller
pmc_set_writeprotect(false);
pmc_enable_periph_clk(ID_TC4);

//we want wavesel 01 with RC
TC_Configure(TC1, 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK2);
TC_SetRC(TC1, 1, 238); // sets <> 44.1 Khz interrupt rate 109
TC_Start(TC1, 1);

// enable timer interrupts on the timer
TC1->TC_CHANNEL[1].TC_IER=TC_IER_CPCS;
TC1->TC_CHANNEL[1].TC_IDR=~TC_IER_CPCS;

//Enable the interrupt in the nested vector interrupt controller
//TC4_IRQn where 4 is the timer number * timer channels (3) + the channel number
//(=(1*3)+1) for timer1 channel1
NVIC_EnableIRQ(TC4_IRQn);

//DAC Configuration
analogWrite(DAC0,0);  // Enables DAC0
analogWrite(DAC1,0);  // Enables DAC0
}

void loop()
{
}

void TC4_Handler() //Interrupt at 44.1KHz rate (every 22.6us)
{
TC_GetStatus(TC1, 1); //Clear status interrupt to be fired again.

//Adjust Delay Depth based in pot2 position.
Delay_Depth = MAX_DELAY-1;

//Increse/reset delay counter.
write_pt++;
if(write_pt >= Delay_Depth) write_pt = 0;

if (POT0>2700)
{
}
else if (POT0>1350)
{
}
else
{
divider++;
if (divider>=2)
{
divider=0;
}
}

out_DAC0=map(out_DAC0,0,4095,1,POT2);
out_DAC1=map(out_DAC1,0,4095,1,POT2);

//Write the DACs
dacc_set_channel_selection(DACC_INTERFACE, 0);       //select DAC channel 0
dacc_write_conversion_data(DACC_INTERFACE, out_DAC0);//write on DAC
dacc_set_channel_selection(DACC_INTERFACE, 1);       //select DAC channel 1
dacc_write_conversion_data(DACC_INTERFACE, out_DAC1);//write on DAC
}

You can listen this Octaver effect in SoundCloud.

#### File Attachment:

File Name: octaver.rar
File Size: 2 KB

There are a lot of ways to implement octavers or pitch-shifting effects. In this code I have implemented a Delay Based Pitch Shifting Algorithm described by D. Goswami, H. Narula and C. Rogers.

To improve the performance and remove the audible popping a fade out technique could be used:
Two 30ms long buffers hold the channel buffers A and B. Both channels begin with a 30ms delay but the gain of channel A starts at one while the gain of channel B is zero. The delay of channel A is steadily decreased and as the delay starts to approach zero, the gain begins to steadily decrease while channel B’s gain begins to increase and its delay decrease. Here the gain of channel A and channel B are both decreasing and increasing respectively at the same rate to maintain their sum at one, keeping a constant amplitude out. This crossover area between the two gains is referred to as crossfading because one channel fades out and the other fades in. The crossfading helps the transition from a close to 0ms delay to 30ms delay seem continuous and smooth.

## Octaver Pedal. 5 years 9 months ago #173

 jasolag OFFLINE New Member Posts: 5 Karma: 1 Hi JR, I tried using the octaver effect and it sounds pretty good. However, there is a delay between the original sound and the modified sound. Is there a way to reduce this latency to the minimum? Thanks. The administrator has disabled public write access.

## Octaver Pedal. 5 years 9 months ago #174

 JR OFFLINE Senior Member Posts: 77 Thank you received: 31 Karma: 6 The easiest way to reduce the latency could be playing with the current code (octaver.ino) parameters. Try reducing the value of#define MAX_DELAY 10000to something smaller like 8000, 5000, 3000, etc... There are other ways of implement octaver pedals (as mentioned above) but we did not have time yet to play with other codes... keep it simple The administrator has disabled public write access.

## Octaver Pedal. 5 years 6 months ago #240

 dwhacks OFFLINE New Member Posts: 4 Thank you received: 1 Karma: 0 Would it be possible to run both octaves at the same time and maybe have a volume adjustement for each (like the EHX Micro POG)? Is we can get the latency to really low levels this would be pretty amazing. The administrator has disabled public write access.

## Octaver Pedal. 4 years 9 months ago #398

 iosonosempreio OFFLINE New Member Posts: 1 Karma: 0 Would it be possible to run both octaves at the same time and maybe have a volume adjustement for each (like the EHX Micro POG)? This is the reason why I ordered the shield a few days ago, I'm still waiting, but I'll probably try building that effect as soon as I get my hands on it! I know how to handle an Arduino, but unfortunately I do not know anything about sound processing (I'm a visual designer ). I'm going to learn a lot of stuff then... So I'm wondering, is there any particular issue in doing that? The administrator has disabled public write access.

## Octaver Pedal. 4 years 9 months ago #399

 Ray OFFLINE Moderator Posts: 703 Thank you received: 149 Karma: 44 its a good idea, I never though about doing that but its cool! It may be some limitation but I reckon that its plausible, just generating both signals and summing them at the end of it... You can start a new topic once you try to do it so we can contribute The administrator has disabled public write access.

## Octaver Pedal. 4 years 6 months ago #439

 vittoles OFFLINE New Member Posts: 2 Karma: 0 Hi guys! my name is Dan,just starting in Arduino world. i wanna mod POT0 to have multiple octave down value. i mean normal position ,no pitch full clockwise, and maybe 10 "step" to get 2 octave down fully counter clockwise... how to code that please? regards. The administrator has disabled public write access.

## Octaver Pedal. 4 years 6 months ago #441

 Ray OFFLINE Moderator Posts: 703 Thank you received: 149 Karma: 44 Welcome Dan If i understood it correctly ( maybe not ) its a very cool idea, the code always gives you 1 octave down or up. The key part of the code is this: if (POT0>2700) { read_pt_A = read_pt_A + 2; read_pt_B = read_pt_B + 2; } else if (POT0>1350) { read_pt_A = read_pt_A + 1; read_pt_B = read_pt_B + 1; } else { divider++; if (divider>=2) { read_pt_A = read_pt_A + 1; read_pt_B = read_pt_B + 1; divider=0; } } basically: - if POT0 is full clockwise: reduces the buffer 1 sample - if POT0 is middle: keeps buffer same size - if POT0 is full anticlockwise: use a divider to increase de size 1 sample. try changing the numbers on: read_pt_A = read_pt_A + 2; (try a 1, 2, 3, 4) and you have other octaves, although as far as I remember the super high ones sound a bit odd. you can also change the range of the POT0 (POT0>2700) or (POT0>1350) adding more ranges to more octaves. The administrator has disabled public write access.

## Octaver Pedal. 4 years 6 months ago #444

 vittoles OFFLINE New Member Posts: 2 Karma: 0 my problem is to get 1/2 octave down , 1/3 octave down,1/4 octave down.. i can't find how to divide 1 octave in 5 pot position... best regards. The administrator has disabled public write access.
 Page:12
Time to create page: 0.312 seconds
Joomla SEF URLs by Artio