Page 1 of 1

### Making a guitar tuner in pixilang

Posted: Wed Jul 14, 2021 3:30 pm
Because I am curious how this works I want to create a guitar tuner app in pixilang! My approache is to first create a spectrum analyser because that's generating data that can be used for pitch detection. I know a little about programming but this is new to me so I want to ask: Is a spectrum visualiser a good direction to go? However I will make the spectrum analyser first because it will be a learn-full experience and it's cool Any questions about this project will go in this topic because otherwise I need to create countless topics and that would be a little unclear.

### fft()?

Posted: Wed Jul 14, 2021 8:29 pm
Ah I was looking to make fft() but I see in the documentation that there is an built-in fft() function. The documentation is a little concise. What do the parameters mean exactly? Parameters ( inverse, im, re, size )
• Inverse; What kind of value is expected?
• im; what does it mean?
• re; what does it mean?
• size; I suppose it is the size of the size of my audio stream buffer?

### Re: Making a guitar tuner in pixilang

Posted: Thu Jul 15, 2021 10:51 pm
inverse: 0 - direct FFT; 1 - inverse transform;
im - imaginary part
re - real part
size - FFT size

From sound to spectrum:

Code: Select all

``````fft_size = 1024 //must be a power of two
im = new( fft_size, 1, FLOAT )
re = new( fft_size, 1, FLOAT )
//put your signal to the re[] array
clean( im )
fft( 0, im, re )
//now im[x] and re[x] contain your signal in the frequency domain
//x: 0...fft_size/2
//   0 = 0 Hz (DC)
//   1 = sample rate / 2 / fft_size
//   2 = sample rate / 2 / fft_size * 2
//   ...
//   fft_size / 2 = sample rate / 2
``````
Back to sound (time domain):

Code: Select all

``````fft( 1, im, re )
//now you can find your original audio signal in the re[0...fft_size-1] array``````

### Re: Making a guitar tuner in pixilang

Posted: Fri Jul 16, 2021 9:21 pm
Thanks for the examples alexander!

I have searched trough the documentation but couldn't find a way to take the whole screen and move every pixel one pixel upwards. Is this possible in an easy way? The effector has some function that does this approximately but I need something that does exactly this.

Code: Select all

``````set_pixel_size( WINDOW_XSIZE / 4096 )
resize( get_screen(), WINDOW_XSIZE, WINDOW_YSIZE )

fn audio_callback(
\$stream,
\$userdata,
\$channels,
\$frames,
\$output_time_in_system_ticks,
\$in_channels,
\$latency_in_frames )
{
if \$in_channels >= 0
{
copy( visual_buf, \$in_channels[ 0 ] )
}
ret( 0 ) //output is empty
}

fft_size = 4096
visual_buf = new( fft_size, 1, INT16 )
clean( visual_buf )

// create lists for fft
im = new( fft_size, 1, FLOAT )
re = new( fft_size, 1, FLOAT )

set_audio_callback( audio_callback, 0, 44100, INT16, 2 )
enable_audio_input( 1 )

while 1
{
// position variables
scr = get_screen()
xsize = WINDOW_XSIZE
ysize = WINDOW_YSIZE
left = -xsize/2
right = xsize/2
top = -ysize/2
bottom = ysize/2

x = 0 while x < fft_size
{
re[x] = visual_buf[x]
x + 1
}

clean(im)
fft(0, im, re)

x = 0 while x < fft_size
{
\$freq = interpolation(0,fft_size/2,re[x])
dot(left+x,bottom-1,get_color(\$freq,\$freq/2,100))
x + 1
}

// I want all pixels to go upwards one step each frame

while( get_event() ) { if EVT[ EVT_TYPE ] == EVT_QUIT { halt } }

frame()
}

fn interpolation(\$x, \$y, \$z) {ret((\$z - \$x) / (\$y - \$x))}``````

### Re: Making a guitar tuner in pixilang

Posted: Sun Jul 18, 2021 12:04 am
take the whole screen and move every pixel one pixel upwards
Here is the trick:
pixi( get_screen(), 0, -1 )
But that doesn't work for moving down...
If you need to move the screen down, use more correct code:

Code: Select all

``````//Program init:
scr = get_screen()
scr2 = clone(scr)
//...
//Frame drawing:
copy(scr2,scr)
pixi(scr2,0,1)
``````