Pwm ile sinyal oluşturup Piyano yapma

Başlatan Elektrik2012, 27 Ağustos 2013, 16:15:45

Elektrik2012

Merhaba abilerim Kolay gelsin.Ccs c ile pwm sinyal oluşturup nota üretmek istiyorum.Örneğin 1 nota do olsun 1 nota çalmasını istiyorsak 1 butona basıcaz 2.Re olsun 2 buton gibi Do,re,mi,fa,sol,la,si Ben yaptım fakat frekansları tutturamadım için tam sesi alamadım isiste Birde siz denermsiiniz?Şimdiden çok teşekkür ederim.
Notaların frekansı :
Do    261,6 Hz
Re    293,7 Hz
Mi    329,6 Hz
Fa    349,2 Hz
Sol    392,0 Hz
La    440,0 Hz
Si    493,9 Hz
Do    523,5 Hz

berat23

çalgı işlerinde frekanslar tek ton olmaz, harmonik lazım. sadece bu frekanslarla ses üretirsen tek tonlu bir bip sesi duyarsın.

bunların yanında benim anlamadığım nereyi yapamadın? pwm falan dediğine göre sinüsü örnekledin onu mu çalmaya çalışıyorsun?

Elektrik2012

Merhaba ilgilendiginiz için çok teşekkür ederim Benim ismim nurullah  Daha 16 yaşındayım bir şeyler üretmeye çalışıyorum Öğrenemeye çalışıyorum.Yok daha önceden yapmıştım şuan kodlar elimde Yok :D

metaltrrocker

Vivaldi Summer(first part)-msp430
Bu tarz bişeymi yapmak istiyorsunuz.Gerçi burda ben direk hafızaya yazıp yapmıştım ama keypad tarzı butonlar eklenebilir.Böyle bişey yapmak istiyorsan pwm ile uğraşmana gerek yok.portu uygun frekanslarda logic low ve logic high yapman yeterli.

Elektrik2012

#4
ilgilendiginiz için teşekkürler.Evet öyle bir şey yapmak istiyorum peki onu nasıl yapıcam biraz detay verirmsiniizz?Bi örnek programcık   :)

Yani şöyle bir şey mi?
output_high(Pın_b0);
delay_ms(500);
output_low(PIN_B0);
delay_ms(500);

metaltrrocker

#5
Hocam tek frekans için hesaplamayı vereyim gerisini siz yazarsınız zaten.
Doğal La notası için frekansımız=> 440Hz
burdan periyodunu buluyoruz   => 1/440=2.272 X 10^(-3) saniye
o da şuna eşittir                        => 2272 mikrosaniye

yani la notasını elde etmek için portun ilgili pinini 2272 mikrosaniye süre açık ve kapalı olacak.
yani 1136 mikrosaniye ilgili pin logic high ve 1136 mikrosaniye logic low olacak.bu şekilde sonsuz döngüde bir tane kod yazıp derleyin bi bakın La notasını duymanız lazım.İşin mantığı bu şekilde.İlerki olaylarda if else ekleyip birde notalar için tek tek fonsiyon yazarsınız. tuşa basıldıysa ilgili notayı çalıştırsın gibi.

mesaj birleştirme:: 27 Ağustos 2013, 19:27:09

while(1)
{
output_high(PIN_B0);
delay_us(1136);
output_low(PIN_B0);
delay_us(1136);
}
örnek kod.

Elektrik2012

#6
Hocam gerçekten çok teşekkür ederim :DHocam işin mantııgını çözdüm sayenizde:D Peki bu virgüllü olanalr örneğin re notası 293,7 o zaman 294 alıcam
1/294=0,0034013605442177*1000=3,401 3401 mikrosaniye 1700,5 ben 1700 alıcam değil mi? delay_us(1700)

XX_CİHAN_XX

Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Gökhan BEKEN

PWM'in değerlerini kaç verecem diye düşünmene gerek yok. Kalibre denen bişey var. Akort cihazını eline al(alternatif olarak android telefonlara uygulama kurabilir veya pc ye program kurabilirsin), devreyi sürekli pwm'in sinyalini artıracak şekilde 0 dan başlat, notalar akort aletinde istediğin frekansa geldiğinde durdur , displayde gösterdiğin o anki pwm değerini not al. Bunu bütün notalar için yaparsın. Sonra gerisi kolay.
Özel mesaj okumuyorum, lütfen göndermeyin.

metaltrrocker

Alıntı yapılan: Elektrik2012 - 27 Ağustos 2013, 20:41:00
Hocam gerçekten çok teşekkür ederim :DHocam işin mantııgını çözdüm sayenizde:D Peki bu virgüllü olanalr örneğin re notası 293,7 o zaman 294 alıcam
1/294=0,0034013605442177*1000=3,401 3401 mikrosaniye 1700,5 ben 1700 alıcam değil mi? delay_us(1700)
Hocam küsüratları yakın değere yuvarlarsınız çok fazla etkilenmiyor notasal olarak baktığımızda.Bende videoda yuvarlamıştım çoğu değeri.

pisayisi

Bip bip şeklinde  basit  sesler alabilceksin bir piyano akustiğinde ses alınamayacağını biliyorsun sanırım ;D
Murat

metaltrrocker

Alıntı yapılan: pisayisi - 28 Ağustos 2013, 00:42:18
Bip bip şeklinde  basit  sesler alabilceksin bir piyano akustiğinde ses alınamayacağını biliyorsun sanırım ;D
Önceki mesajlarımda bunu belirittim.

Gökhan BEKEN

Bu arada 1lik, 2lik, 4,8,16,32.... 64lük  notaların nasıl kullanıldığını biliyorsanız melodi çalabilirsiniz.
Özel mesaj okumuyorum, lütfen göndermeyin.

Elektrik2012

İlgilendiginiz için hepinie ayrı ayrı teşekkür ederim Bu bilgileriniz benim için çokm önemli hepinizin dedikelrinim dikkate alacağım  ;D

metaltrrocker

for(int i=0;i<400;i++)
{
output_high(PIN_B0);
delay_us(1136);
output_low(PIN_B0);
delay_us(1136);
}

Atıyorum 1 lik LA notasını bu temsil etsin
peki 1 lik Sol notasını oluştururken dikkat etmen gereken yer şu
for(int i=0;i<xxx;i++)
{
output_high(PIN_B0);
delay_us(1275);
output_low(PIN_B0);
delay_us(1275);
}

Burda xxx diye yazdığım yeri değiştirmek gerekiyor(400 yazamayız).Neden diye soracak olursanız.Portu high ve low yaptığımızda tam bir kare dalga örneği elde ediyoruz ve bunun ile La notası için elde ettiğimiz tek dalganın periyot süreleri eşit değil.bunun için Sol notasının for döngü süresini değiştireçeğiz.

Örnek:
1136 * 400= 1275 * x
burdan for döngüsünün olması gereken döngü sayısı 356'dir.Eger açıklama karışık geldi ise görsel olarak basit birşey hazırlayabilirim.
Düzeltirsek;
for(int i=0;i<356;i++)
{
output_high(PIN_B0);
delay_us(1275);
output_low(PIN_B0);
delay_us(1275);
}