Mündəricat:
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-13 06:56
Dale Rosen, Carlos Reyes və Rob Koch
DATT 2000
Addım 1: Problem
Gitara pedalları musiqiçini pedal platformasına məhdudlaşdırır. Həll yolu: Gitara pedallarının funksionallığını qurun və gitaranın özünə yerləşdirin. Bu, musiqiçinin pedal taxtasının yeri ilə məhdudlaşmaq əvəzinə gitara boynunu interfeys olaraq istifadə edərək səhnədə sərbəst hərəkət etməsinə imkan verir. Bir bitcrusher/nümunə dərəcəsi təsir cihazı quraraq bu konsepsiyanı araşdıracağıq.
Addım 2: Layihə Konteksti
Musiqiçilərin gitaralarının səsini idarə etmək üçün istifadə etdikləri bir çox gitara pedalı var. Bunların çoxu ümumiyyətlə rack-based və ya stump box vahidlərindədir, buna görə də effektlərin nəzarətini effekt bölməsinin yerləşdiyi yerə məhdudlaşdırır. Cihazı gitaraya quraşdırmaq, oyunçuların səhnənin istənilən yerində efekt parametrlərini idarə etməsinə imkan verir. Bu, məhdudlaşdırılmayacaqları və performansları üçün hərəkət etmək sərbəstliyinə sahib ola biləcəkləri deməkdir.
Arduino yalnız 8 bitlik səs qabiliyyətinə malik olduğundan, yüksək sədaqətli siqnal emalı etmək mümkün deyil. Efektləri aşağı sədaqətlə, təhrif olunmuş bir səs yaratmağa əsaslandığı üçün seçdiyimiz təsirlərin səbəbidir. Bunlar bir Arduino ilə mümkün olan yeganə təsirlərdir.
Addım 3: Ehtiyac duyulan hissələr / alətlər
● Zərbəli Matkap
● Tel kəsicilər
● Tel çıxarıcılar
● Havya
● İsti Yapışqan Tabancası
● Sökülmə Pompası
● Gitara ● Qutusu
● Lehim
● İsti yapışqan
● Arduino
● Proto Board
● örtülmüş tel
● Audio Jaklar (x2)
● Potansiyometrlər (x3)
● Kondansatörler: 2.2 uF (x2)
● Açıq Mis Tel
● Vintlər (M3.5 *8)
● Rezistorlar: 1 k, 10 k, 1,2 k, 1,5 k, 390 k
● * Op Amp (LM358) / * Transistor (2N3442)
Addım 4: Texniki Strategiya
Daxili Dövrə
Giriş/Çıxış
Gitardan gələn səs siqnalını arduinonun istifadə edə və dəyişdirə biləcəyi bir şeyə çevirməliyik. Arduino -dan gələn siqnalı yenidən səs siqnalına çevirməliyik. Arduino 0V -dan 5V -a qədər gərginlik oxuyur, səs siqnalları -1V -dən 1V -ə qədərdir. Bu dönüşümlər rezistorlardan istifadə etməklə həyata keçirilir. Siqnal çıxış dövrəsində də çevriləcək.
Arduino Kitabxanası: ArduinoDSP
Layihənin Təsviri (İnterfeys)
Düymələr Topuzu 1: Nümunə Hızı
Topuz 2: Bit Kırıcı
Düymə 3: Bit dəyişdirici
Addım 5: Kod
#"dsp.h" daxil edin
#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit)) #debine sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))
boolean div32; boolean div16;
uçucu boolean f_sample; uçucu bayt badc0; uçucu bayt badc1; uçucu bayt ibb;
int fx1; int fx2; int fx3; int fx4;
int cnta; int icnt; int icnt1; int icnt2; int cnt2; int iw; int iw1; int iw2; bayt bb;
bayt dd [512]; // Audio Yaddaş Array 8-Bit
void setup () {setupIO ();
// 1 saniyədən sonra dalğanı yenidən doldurun fill_sinewave ();
// 19kHz nümunə götürmə tezliyi cbi (ADCSRA, ADPS2) üçün adc prescaler -ı 64 -ə təyin edin; sbi (ADCSRA, ADPS1); sbi (ADCSRA, ADPS0); // ADCH Register sbi-də 8-bit ADC (ADMUX, ADLAR); sbi (ADMUX, REFS0); cbi (ADMUX, REFS1); cbi (ADMUX, MUX0); cbi (ADMUX, MUX1); cbi (ADMUX, MUX2); cbi (ADMUX, MUX3); // Timer2 PWM rejimi sürətli PWM cbi (TCCR2A, COM2A0) olaraq təyin edilmişdir; sbi (TCCR2A, COM2A1); sbi (TCCR2A, WGM20); sbi (TCCR2A, WGM21); // Timer2 cbi üçün quraşdırma (TCCR2B, WGM22); // Timer2 Clock Prescaler: 1 sbi (TCCR2B, CS20); cbi (TCCR2B, CS21); cbi (TCCR2B, CS22); // Timer2 PWM Port Enable sbi (DDRB, 3); // cli (); cbi (TIMSK0, TOIE0); sbi (TIMSK2, TOIE2); iw1 = badc1;
}
boşluq döngəsi () {
// effekt potensiometrinin və fırlanan açarın readKnobs () vəziyyətini yoxlayın;
// ************* // ***Normal*** // *************
if (fx1 == 0 && fx2 == 0 && fx3 == 0 && fx4 == 0) {byte input = analogRead (solda); çıxış (sol, giriş); }
// ************* // *** Phasor *** // *************
əgər (fx4> 100) {
fx1 = 0; fx2 = 0; fx3 = 0;
while (! f_sample) {// ADC -dən Nümunə Dəyərini gözləyin} // Dövr 15625 KHz = 64uSec PORTD = PORTD | 128; f_sample = yalan; bb = badc1; gg [icnt1] = bb; // tampona yaz fx4 = iw * badc0 / 255; // potensialiometr iw1 = dd [icnt2] ilə gecikmiş nümunə miqyası; // gecikmə tamponunu oxuyun badc0 = badc0 / 20; // 512 icnt1 ++ ilə məhdudlaşdırın; icnt2 = icnt1 - badc0; icnt2 = icnt2 & 511; // limit indeksi 0.. icnt1 = icnt1 & 511; // limit indeksi 0..511 iw2 = iw1 + bb; iw2 = iw2 / 2; bb = iw2; OCR2A = bb; // PWM Çıxışına Nümunə Dəyəri
PORTD = PORTD ^ 128; çıxış (sol, PORTD); // Çıxış}
// ************* // *** Flanşer *** // ************* əgər (fx3> 100) {
fx1 = 0; fx2 = 0; fx4 = 0;
while (! f_sample) {// ADC -dən Nümunə Dəyərini gözləyin} // Dövr 15625 KHz = 64uSec
PORTD = PORTD | 128; f_sample = yalan; bb = gg [icnt]; // gecikmə tamponunu oxuyun iw = 127 - bb; // subset ofset fx3 = iw * badc0 / 255; // potensialiometr iw1 = 127 ilə gecikmiş nümunə miqyası - badc1; // yeni nümunədən subset ofset iw1 = iw1 + iw; // gecikmiş nümunə və yeni nümunə əlavə edin, əgər (iw1 127) iw1 = 127; // Səs məhdudlaşdırıcısı bb = 127 + iw1; // ofset əlavə et dd [icnt] = bb; // nümunəni audio tamponda icnt ++ saxla; icnt = icnt & 511; // limit tampon indeksi 0..511 OCR2A = bb; // PWM Çıxışına Nümunə Dəyəri
PORTD = PORTD ^ 128; çıxış (sol, PORTD); // Çıxış
} }
void readKnobs () {fx1 = analogRead (1); fx2 = analogRead (2); fx3 = analogRead (3); fx4 = analogRead (4);
}
void fill_sinewave () {float pi = 3.141592; float dx; float fd; float fcnt; dx = 2 * pi / 512; // (iw = 0; iw <= 511; iw ++) {// üçün 512 baytlıq buferi doldurun, sinewawe fd = 127 * sin (fcnt) 50 dövrlə; // əsas ton fcnt = fcnt + dx; // 0 ilə 2xpi və 1/512 artımlar aralığında bb = 127 + fd; // sinewawe dc ofset əlavə edin dd [iw] = bb; // diziyə dəyər yazın
} }
// ********************************************** ****************** // 62.5 KHz -də Timer2 Interrupt Service // burada səs və pot siqnalı nümunə olaraq alınır: 16Mhz / 256/2/2 = 15625 Hz ISR (TIMER2_OVF_vect) {
PORTB = PORTB | 1;
div32 =! div32; // timer2 tezliyini / 2 -ni 31.25kHz -ə bölün, əgər (div32) {div16 =! div16; if (div16) {// nümunə kanal 0 və 1 alternativ olaraq hər bir kanal 15.6kHz badc0 = ADCH ilə nümunələnir; // ADC kanalını 0 sbi (ADMUX, MUX0) əldə edin; // multiplekseri 1 kanala təyin et} başqa {badc1 = ADCH; // ADC kanal 1 cbi (ADMUX, MUX0) alın; // multiplekseri 0 kanalına qoy f_sample = true; } ibb ++; ibb--; ibb ++; ibb--; // dönüşüm başlamazdan əvvəl qısa gecikmə sbi (ADCSRA, ADSC); // növbəti çevrilməyə başla}
}
Addım 6: Video
Potensial Problemlər ● Pikap elektrik dövrəsi üçün bir az zəifdir - bir op amp lazımdır. - Videoda bir siqnal gücləndiricisindən istifadə etdik. (Masada uzanan boz qutu.)