Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
Dale Rosen, Carlos Reyes en Rob Koch
DATT 2000
Stap 1: Probleem
Gitaarpedalen beperken de muzikant tot het pedaalplatform. Oplossing: bouw en integreer een functionaliteit voor gitaarpedalen in de gitaar zelf. Hierdoor kan de muzikant vrij over het podium bewegen, waarbij de gitaarhals als interface wordt gebruikt in plaats van beperkt te zijn tot de locatie van het pedaal. We zullen dit concept onderzoeken door een bitcrusher/sample rate-effectapparaat te maken.
Stap 2: Projectcontext
Er zijn veel gitaarpedalen die door muzikanten worden gebruikt om het geluid van hun gitaren te manipuleren. De meeste hiervan bevinden zich meestal in rack-gebaseerde of stompbox-eenheden, waardoor de controle van de effecten wordt beperkt tot de locatie van de effecteenheid. Door het apparaat op de gitaar te monteren, kunnen spelers de parameters van het effect overal op het podium regelen. Dit betekent dat ze niet worden beperkt en de vrijheid hebben om te bewegen voor hun prestaties.
Aangezien Arduino alleen 8-bits audio kan, is het onmogelijk om high-fidelity-signaalverwerking uit te voeren. Dit is de reden waarom we de effecten hebben gekozen die we hebben gemaakt, omdat ze zijn gebaseerd op het creëren van een vervormd geluid met lage getrouwheid. Dit zijn de enige effecten die redelijkerwijs mogelijk zijn met een Arduino.
Stap 3: Benodigde onderdelen/gereedschappen
● Klopboormachine
● Draadknippers
● Draadstrippers
● Soldeerbout
● Heet lijmpistool
● Desoldeerpomp
● Gitaar● Behuizing
● Solderen
●Hete lijm
Arduino
●Protobord
● Gecoate draad
● Audio-aansluitingen (x2)
● Potentiometers (x3)
● Condensatoren: 2,2 uF (x2)
●Blootgestelde koperdraad
● Schroeven (M3.5 *8)
● Weerstanden: 1 k, 10 k, 1,2 k, 1,5 k, 390 k
● * Op Amp (LM358) / * Transistor (2N3442)
Stap 4: Technische strategie
Interne circuits
Invoer uitvoer
We moeten het audiosignaal dat van een gitaar komt, converteren naar iets dat de Arduino kan gebruiken en wijzigen. We zullen dan het signaal dat van de arduino komt terug moeten omzetten in een audiosignaal. Arduino leest spanningen van 0V tot 5V, audiosignalen zijn van -1V tot 1V. Deze conversies worden gedaan met behulp van weerstanden. Het signaal wordt ook omgezet in het uitgangscircuit.
Arduino-bibliotheek: ArduinoDSP
Projectbeschrijving (Interface)
Knoppen Knop 1: Sample Rate
Knop 2: Bit Crusher
Knop 3: Bit Shifter
Stap 5: Coderen
#include "dsp.h"
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
booleaanse div32; booleaanse div16;
vluchtige booleaanse f_sample; vluchtige byte badc0; vluchtige byte badc1; vluchtige byte ibb;
int fx1; int fx2; int fx3; int fx4;
intcnta; int ict; int icnt1; int icnt2; int cnt2; int iw; int iw1; int iw2; byte-bb;
byte dd[512]; // Audiogeheugenarray 8-bit
void setup() { setupIO();
// herlaad wave na 1 seconde fill_sinewave();
// stel adc prescaler in op 64 voor 19 kHz bemonsteringsfrequentie cbi (ADCSRA, ADPS2); sbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); // 8-bits ADC in ADCH-register sbi (ADMUX, ADLAR); sbi(ADMUX, REFS0); cbi(ADMUX, REFS1); cbi(ADMUX, MUX0); cbi(ADMUX, MUX1); cbi(ADMUX, MUX2); cbi(ADMUX, MUX3); // Timer2 PWM-modus ingesteld op snelle PWM cbi (TCCR2A, COM2A0); sbi (TCCR2A, COM2A1); sbi (TCCR2A, WGM20); sbi (TCCR2A, WGM21); // Setup voor Timer2 cbi (TCCR2B, WGM22); // Timer2 Klok Prescaler naar: 1 sbi (TCCR2B, CS20); cbi (TCCR2B, CS21); cbi (TCCR2B, CS22); // Timer2 PWM-poort sbi inschakelen (DDRB, 3); //cli(); cbi (TIMSK0, TOIE0); sbi (TIMSK2, TOIE2); iw1 = badc1;
}
lege lus() {
// controleer de status van de effectpotentiometer en draaischakelaar readKnobs ();
// ************* // ***Normaal*** // *************
if (fx1 == 0 && fx2 == 0 && fx3 == 0 && fx4 == 0) {byte input = analogRead (links); uitvoer (links, invoer); }
// ************* // ***Phasor*** // *************
als (fx4 > 100) {
fx1 = 0; fx2 = 0; fx3 = 0;
while (!f_sample) {// wacht op voorbeeldwaarde van ADC} // Cyclus 15625 KHz = 64uSec PORTD = PORTD | 128; f_sample = onwaar; bb = badc1; dd[icnt1] = bb; // schrijf naar buffer fx4 = iw * badc0 / 255; // schaal vertraagd monster met potentiometer iw1 = dd[icnt2]; // lees de vertragingsbuffer badc0 = badc0 / 20; // grenswaarde tot 512 icnt1++; icnt2 = icnt1 - badc0; icnt2 = icnt2 & 511; // limietindex 0.. icnt1 = icnt1 & 511; // limietindex 0..511 iw2 = iw1 + bb; iw2 = iw2 / 2; bb = iw2; OCR2A = bb; // Voorbeeldwaarde naar PWM-uitvoer
POORT = POORT ^ 128; uitgang (links, PORTD); // Uitgang}
// *********** // ***Flanger*** // *********** if (fx3 > 100) {
fx1 = 0; fx2 = 0; fx4 = 0;
while (!f_sample) {// wacht op voorbeeldwaarde van ADC} // Cyclus 15625 KHz = 64uSec
PORTD = PORTD | 128; f_sample = onwaar; bb = dd[icnt]; // lees de vertragingsbuffer iw = 127 - bb; // aftrekken offset fx3 = iw * badc0 / 255; // schaal vertraagd monster met potentiometer iw1 = 127 - badc1; // trek offset af van nieuwe steekproef iw1 = iw1 + iw; // voeg uitgesteld monster en nieuw monster toe als (iw1 127) iw1 = 127; // Audiobegrenzer bb = 127 + iw1; // voeg offset toe dd [icnt] = bb; // bewaar sample in audiobuffer icnt++; icnt = icnt & 511; // grens bufferindex 0..511 OCR2A = bb; // Voorbeeldwaarde naar PWM-uitvoer
POORT = POORT ^ 128; uitgang (links, PORTD); // Uitgang
} }
void readKnobs() { fx1 = analogRead(1); fx2 = analoog lezen (2); fx3 = analoog lezen (3); fx4 = analoog lezen(4);
}
void fill_sinewave() { float pi = 3.141592; zweven dx; vlotter fd; vlotter fcnt; dx = 2 * pi / 512; // vul de 512 byte bufferarry voor (iw = 0; iw <= 511; iw++) {// met 50 perioden sinewawe fd = 127 * sin (fcnt); // grondtoon fcnt = fcnt + dx; // in het bereik van 0 tot 2xpi en 1/512 stappen bb = 127 + fd; // voeg dc offset toe aan sinewawe dd [iw] = bb; // schrijf waarde in array
} }
//************************************************** **************** // Timer2 Interrupt Service op 62,5 KHz // hier wordt het audio- en potsignaal gesampled met een snelheid van: 16Mhz / 256 / 2 / 2 = 15625 Hz ISR(TIMER2_OVF_vect) {
PORTB = PORTB | 1;
div32 = !div32; // deel timer2-frequentie / 2 tot 31,25 kHz als (div32) { div16 =! div16; if (div16) {// sample kanaal 0 en 1 afwisselend zodat elk kanaal wordt gesampled met 15,6 kHz badc0 = ADCH; // haal ADC-kanaal 0 sbi (ADMUX, MUX0); // zet multiplexer op kanaal 1 } else {badc1 = ADCH; // haal ADC-kanaal 1 cbi (ADMUX, MUX0); // zet multiplexer op kanaal 0 f_sample = true; } ibb++; ibb--; ibb++; ibb-; // korte vertraging voor start conversie sbi (ADCSRA, ADSC); // start volgende conversie}
}
Stap 6: Video
Mogelijke problemen ● Pickup is iets te zwak om het circuit van stroom te voorzien - een opamp nodig. - In de video hebben we een signaalversterker gebruikt. (De grijze doos ligt op de tafel.)