1-bit Audio and the Arduino - Duke

Post on 11-Feb-2022

8 views 0 download

Transcript of 1-bit Audio and the Arduino - Duke

1-bit Audio and the Arduino

David J. Zielinski

Overview1. Terminology of Sound2. Atari 2600

a. clock division frequenciesb. linear feedback shift registers

3. Arduino Unoa. Specificationsb. Audio Generation Methodsc. Code Examples and Demosd. Arduino Duee. Future Work

sound waves are oscillations in air pressure. The amplitude (viewed on y axis) is proportional to the change in pressure

1 = Peak amplitude2 = Peak-to-peak amp3 = RMS amplitude 4 = Wave period

loudness is the perceptual sense of amplitude.

quiet vs loud

frequency is the number of repeating events per unit time.

pitch is the perceptual sense of frequency.

bit depth is seen as quantization on the y axis

Retail availability 1977Introductory price 199 USDUnits sold 30 millionCPU MOS 6507 @ 1.19 MHzMemory 128 bytes RAM, 4 kB ROM

Atari 2600

● MOS 6532 (RIOT) Ram-I/O-Timer● MOS 6507. Smaller/Cheaper version of the 6502

(used in Apple, Atari, Commodore)● Television Interface Adaptor (TIA)

AtariTIA Chip

● non-frame buffer design!● reading input controllers● sound effects

○ 2 independent noise generators

○ 5-bit frequency divider○ 4-bit audio control (sets

waveform)○ 4-bit volume control

Jay Glenn Miner (May 31, 1932 – June 20, 1994) was a famous American integrated circuit designer, known primarily for his work in multimedia chips and as the "father of the Amiga". Lead developer of the TIA chip.

String/TubeResonance Pitch Perception

100 hz - root200 hz - octave300 hz - 5th400 hz - octave500 hz - Major 3rd600 hz - minor 3rd

octave: 200/100 2 25th: 300/200 3/2 1.54th: 400/300 4/3 1.33_Maj3: 500/400 5/4 1.25min3: 600/500 6/5 1.26th: 500/300 5/3 1.66_

C C# D D# E F F# G G# A A# B C

blue = equal temperamentred = just intonation

pitch

freqratio

one reason classic video games sound distinctive is the utilization of the clock division technique which results in a scale based on the undertone series.

blue = just intonationred = harmonic undertone

cents

Pitch

Gioseffo Zarlino (1517-1590) was an Italian music theorist and composer of the Renaissance.

First proposed the idea of the undertone series.

Hermann Ludwig Ferdinand von Helmholtz(1821 – 1894) was a German physician and physicist who made significant contributions to several widely varied areas of modern science.

Argued that sympathetic resonance is at least as active in under partials as in over partials

Harmonic Undertone Demo

http://jackaudio.org/

4 bit poly, 5 bit poly, 9 bit poly

XOR (exclusive or)

A B Output

0 0 0

0 1 1

1 0 1

1 1 0

Linear Feedback Shift RegisterPoly4: Taps at 2 and 3

1 0 0 1 output: 1Now

1 1 0 0Future

Demo of LFSR

Poly4: taps at 2,3Poly5: taps at 2,4Poly9: taps at 4,8

Arduino UnoFlash / Program Memory32 KB

SRAM / Variable Memory2 KB

Clock Speed16 MHz

5v $30

Why arduino?● low cost. leave installed for installation. ● input: knobs, switches, pressure sensors,

accelerometers, ultrasonic distance, temperature, capacitive sensing.

● output: usb, control motors, lights, and audio● making things is more fun then buying things● open source hardware/software● manufactured in Italy ● subset of C++

Where can you get it(and components)?

In Person: Radio Shack [northgate mall]

Hobbyist: sparkfun.comadafruit.com

Pro: digikey.comnewark.com

Methods of Running

● With a computer. Use arduino to read input, then send via serial message (via USB cable) to computer for further action.

● Stand alone. Arduino reads input and does any processing on board.

Methods to Generate AudioType Pro Con

tone function call ● part of standard libraries. ● pitch is accurate.

● monophonic (1 pitch at a time).

● square wave only.

add on shield ● actual audio output (24bit, 44k). ● arduino uno processor is too slow.

● shield costs $$

pin toggle in main loop

● generate arbitrary 1-bit waveforms. ● polyphonic (multiple pitches).● simple programming

● 1-bit waveforms● pitch not accurate● highest pitch limited by

amount of processing

pin toggle in interrupt

● generate arbitrary 1-bit waveforms. ● polyphonic (multiple pitches).● pitch is accurate

● 1-bit waveforms● complicated programming● need buffer = latency

Things you will need:

How does electricity work?

How to convert 5v to 0.45v ?Solution: voltage divider

What does this look like?

Pitch Linear

void loop(){ int v = analogRead(A0); int v_half=v/2; if(current_sample<v_half) digitalWrite(2,HIGH); else digitalWrite(2,LOW); current_sample=(current_sample+1)%v;}

Pitch Expvoid loop(){ int v = analogRead(A0); int vp=int(pow(v,2.0)/5000.0); int v_half=vp/2;

if(current_sample<v_half) digitalWrite(2,HIGH); else digitalWrite(2,LOW); current_sample=(current_sample+1)%vp;}

samples

input value

Noisevoid loop(){ int v = analogRead(A0); int vp=int(pow(v,2.0)/5000.0); if(current_sample==0) { int val=random(2); if(val==1) digitalWrite(2,HIGH); else digitalWrite(2,LOW); } current_sample=(current_sample+1)%vp;}

Dual Pitch

void loop(){ int v = analogRead(A0); int v2 = analogRead(A1); s1.set_freq(v); s1.tick(); s2.set_freq(v2); s2.tick();}

AND aka Ring Modvoid loop(){ int v = analogRead(A0); int v2 = analogRead(A1); s1.set_freq(v); s2.set_freq(v2); int d=s1.get_val(); int d2=s2.get_val(); byte f=d&d2; digitalWrite(2,f); }

A B Output0 0 00 1 01 0 01 1 1

XOR aka Korg MS-20 Ring Modvoid loop(){ int v = analogRead(A0); int v2 = analogRead(A1); s1.set_freq(v); s2.set_freq(v2); int d=s1.get_val(); int d2=s2.get_val(); byte f=d^d2; digitalWrite(2,f); }

A B Output0 0 00 1 11 0 11 1 0

byte val=pgm_read_byte_near(pos); if(val>128) digitalWrite(2,HIGH); else digitalWrite(2,LOW); pos++; if(pos>pos_end) pos=start_pos;

Program Material

Decimation Delay

byte val=delay_array[d_pos]; int prob=random(0,1024);

dv=(val>0 && prob<decay) || pbyte; delay_array[d_pos]=dv; d_pos=(d_pos+1)%dtime;

digitalWrite(3,val); digitalWrite(2,pbyte);

Looper

if (sensorVal>0) {pbyte=pitch_sample<phalf;triggered=true;

} pitch_sample=(pitch_sample+1)%pmax; byte val=delay_array[d_pos]; if(triggered) delay_array[d_pos]=pbyte; else delay_array[d_pos]=val; d_pos=(d_pos+1)%dtime;

digitalWrite(2,pbyte); digitalWrite(3,val);

Arpeggiation

byte notes[6]={1,2,4,8,4,2};int vpn=sensor_val*notes[current_note];int v_half=vpn/2;digitalWrite(2,current_sample<v_half);

current_sample=(current_sample+1)%vpn;note_sample++; if(note_sample>samples_per_note){ note_sample=0; current_note=(current_note+1)%6; }

Arduino Due

Due Uno

Clock Speed 84 Mhz 16 Mhz

SRAM (Variables) 96 KB 2 KB

Flash (Program) 512 KB 32 KB

Voltage 3.3v 5v

Analog Input 12 [12 bit] 6 [10 bit]

Analog Output (D/A) 2 0

Digital Pins 54 14

Price $50 $30

Guitar Effect Pedal

Active Paintings

Skull Drum and Leg-Tar

P10 Project 100, 1k, 10k, ... channel installation

Thank You!

Wet Ink Ensemble@ Casbah8pmfeaturing Kenneth Stewart's "Make It Opaque"