két szólamú hang

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
berjoska
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2015. január 7. szerda, 9:15

két szólamú hang

HozzászólásSzerző: berjoska » 2015. január 7. szerda, 10:33

/*
két lábon két külön freki példaprogram

nem elegáns program verzió

ha a kottán ilyet látsz az azt jelenti, hogy egyszerre két hangot
kell megszólaltani. A 12 és a 13 lábat 2db 100 ohmos ellenálással egyesítjük
ezután egy 1uF kondival egy 16 ohmos hangszórón keresztöl kötjük a GND re.

Ha a kottán ilyet látsz az aszt jelenti, hogy egyszerre két hangot
kell megszólaltani.A 12 és a 13 lábat 2db 100 ohmos ellenálással egyesítjük
ezután egy 1uF kondival egy 16 ohmos hangszórón keresztöl kötjük a GND re
Ha erősíteni akarjuk akkor a hangszóró helyre kötjük az előerősítőt,
de azért az a 16 ohmos ellenálásnak kell ott lennie.

12pin----|100ohm|----| ^ erősítő felé ^
|----|1uF kondi|------|hangszóró/16ohm|------GND
13pin----|100ohm|----|

A dallam jogvédett, ezért kizárólag csak szemléltetésre szolgál.
mav signál kotta digitalizálása
Hz1/Hz2/hosssz

[880 \ 0 \ t]
[987 \ 0 \ t]
[880 \ 0 \ 2*t]
[1175 \ 740 \ t]
[1175 \ 784 \ t]
[880 \ 740 \ 3*t]
hossz = 172 ms
*/
int hossz = 172; // ütem hossz
int a = 880; // Hz
int b = 987;
int c = 1175;
int d = 740;
int e = 784;




void setup() {

}

void loop() {

tone(12, a);
delay(hossz);

tone(12, b);
delay(hossz);

tone(12, a);
delay(hossz * 2);
// a lábon a hang addig szól ameddig nem
// cseréljük másra vagy nem tiltjuk le
tone(12, c);
tone(13, d);
delay(hossz);

tone(12, c);
tone(13, e);
delay(hossz);

tone(12, a);
tone(13, d);
delay(hossz*3);

noTone(12); // láb hang le tiltva!
noTone(13);
delay(2000);

***************************************

/*

két lábon két külön freki példaprogram

elegáns program verzió

itt az "pitches.h" mellékletben tárolt szabányos
frekvenciából nyerjük a külömböző frekvenciákat.


*/

#include "pitches.h"
int hossz = 172;





void setup() {

}

void loop() {

tone(12, NOTE_A5);
delay(hossz);

tone(12, NOTE_B5);
delay(hossz);

tone(12, NOTE_A5);
delay(hossz * 2);
// a lábon a hang addig szól ameddig nem
// cseréljük másra vagy nem tiltjuk le
tone(12, NOTE_D6);
tone(13, NOTE_FS5);
delay(hossz);

tone(12, NOTE_D6);
tone(13, NOTE_G5);
delay(hossz);

tone(12, NOTE_A5);
tone(13, NOTE_FS5);
delay(hossz*3);

noTone(12); // láb hang le tiltva!
noTone(13);
delay(2000);
}


}
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.

Avatar
csabeszq
Bitfaragó
Hozzászólások: 670
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: két szólamú hang

HozzászólásSzerző: csabeszq » 2015. január 7. szerda, 11:24

Én egy lábon vonatkürtöt csináltam AVR alatt (Attiny85). A diesel vonatot úgy emuláltam, hogy egyszerre 3 egymáshoz közeli frekvencián szólt fűrészjel.

KIMENET=fűrész1(t) + fűrész2(t) + fűrész3(t)

Mondjuk legyen 380Hz, 400Hz, 420Hz. A konkrét értékekre már nem emlékszem. Szóval a három függvényt összeadva elég jó kürtöt kaptam 8 biten.

A kérdés, hogy 1 lábon hogyan csinálsz PWM-mel 8 bites DAC-ot.
- a trükk lényege, hogy 20 kHz fölött már nem hallasz semmit
- Veszel egy 8 bites timer-t, 8MHz-s órajelllel előosztás nélkül
- A timer 256-nál fordul körbe, 8000000 / 256 = 31.25kHz frekvenciával megy, ezt már nem hallod
- Beállítod, hogy mondjuk OCR0A BOTTOM-nál 1 legyen, compare match-nál 0. Az OC0A lábra kell a zümmert kötni.

Szóval, amikor OCR0A-ba beírtam 10-et, akkor 10/256 %-os PWM-et kaptam, amikor meg 200-at, akkor 200/256 %-os volt a PWM.

Innentől a dolog meglehetősen egyszerű volt, a kiszámolt hullámalakot beírtam OCR0A-ba, ezt pedig a hardver PWM "lejátszotta" az OC0A lábon. A zümmerem meg dudált, mint egy igazi Diesel.
:)


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég