Arduino ile Müzik

By | 31 Ocak 2015

Arduino UNO ‘nun taklidi olan bir kart hediye aldım geçenlerde. Daha önce Arduino üzerinde hiç çalışmadığımdan internette biraz örneklerine baktım ve teker teker örnekleri uygulamaya başladım. Sonra bir piezo ile ses çıkarma uygulamasından sonra aklıma frekans bilgilerini kullanarak basit bir müzik çalar yapma fikri geldi. Notalamayı eski monofonik telefonlarda kullandığımız gibi yapmaya çalıştım.

Gerekli malzemeler:

1) Arduino UNO veya taklidi :)

2) Piezo

3) UNO’yu bilgisayara bağlamak için USB kablo

arduino ile müzik

arduino ile müzik

Yukarıda görüleceği üzere, 12 nolu kapıyı ve GND kapısını kullandım. Devre kısmı bu kadar. Benim için önemli kısım kodlama kısmı idi. Zaten işin keyif aldığım kısmı da burası.

Öncelikle ne özellikte bir program yapacağımızı belirleyelim.

1) Bir oktavdaki 12 sesi çalabilmeli.

2) Alt ve üst perdeye geçebilmeli.

3) Tempo özelliği olmalı.

4) Bir şarkıyı tanımlamak ve çaldırmak dinamik olmalı.

İşte bu 4 özelliğe biraz yakından bakalım:

1) Oktavdaki 12 ses nedir? 7 Nota yok muydu?

piyanoHepimizin bildiği gibi 7 tane nota var ama bir de ara notalar var. Piyanodaki 7 beyaz ve 5 siyah notayı hatırlayın. Bunlar bir araya geldiğinde 1 perde (oktav) ses dizisini oluşturmuş oluyor.

Notaların ülkelere göre farklı isimleri olsa da standartlaşmış bir kaç nota kodlaması var. Bunlardan en yaygın kullanılanlarından biri C-D-E-F-G-A-B kodlaması. Burada Do notası C harfi ile temsil ediliyor. Sonra sırayla diğer harfler kullanılıyor.

2) Alt ve Üst Perdeye Çıkmak Derken !!?

Yukarıdaki 12 tane nota bir perdeyi oluşturuyor. Bunun önünde ve ardında yine aynı şekilde perdeler devam ediyor. Piyanoda sağa doğru notalar inceliyor yani frekansları yükseliyor. Sola gittikçe de kalınlaşıyor yani frekansları düşüyor. Perde numaralarını soldan sağa 1-2-3 diye numaralandıralım. Her perde yükselişinde (yani sağa gittikçe) aynı notanın frekansı iki katına çıkıyor. Mesela, 0. perdedeki do notasının frekansı 16,35 iken 1.perdedeki do notasının frekansı 32,70 oluyor. Bunların hepsini bir tabloda görelim.

 frekanslar

Dikkat ederseniz her nota perde yükseldikçe frekansını ikiye çıkarıyor. Bir de notalar arasındaki frekansların logaritmik bir oranı vardı ama konservatuar bitirme projesine döndürmeyelim işi. Bize lazım olan kısımları yazsak kafi.

3) Tempo özelliği şeysi

1 dakikadaki vuruş sayısına tempo deniyor. Bu metronom ile ölçülür. Veya elinize kronometre alıp da ölçebilirsiniz. Bu tempo olayını milisaniye cinsinden ifade etmek istersek şöyle bir hesaplama yapmak gerek.

60 saniye = 60.000 milisaniye

100 tempo çalan bir şarkıda 100 tam nota olduğunu varsayalım. 1 tam nota için 60.000/100 = 600 milisaniye süre gerekli.

120 tempo çalan bir şarkıda 1 tam nota için 60.000/120 = 500 milisaniye süre gerekli.

Çok kabaca olsa da bu hesaplar işimizi görecek.

4) Şarkıyı dinamik tanımlamak ve çaldırmak

Konunun en başında da belirttiğim gibi kodlamada eski monofonik cep telefonlarındaki kodlamaya benzer bir yapı kullanacağım.

Bir notayı 2 karakter ile tanımlıyorum. İlk karakter nota ismi, ikinci karakter nota süresi.

Nota süresi için bir tam notayı 8 uzunluk olarak varsaydım. Buna göre yarım nota 4, çeyrek nota 2 olacak. Örnek yapalım:

C8 : Tam Do notası

F4 : Yarım Fa notası

Buna göre 12 ses için karakter tanımlamalarımızı yapalım:

C – c – D – e – E – F – f – G – g – A- b – B

Buradaki karakterler tamamen sizin isteğinize kalmıştır. Genelde dinlediğimiz şarkılar 4. perde civarındadır. Bu sebeple default olarak programı 4. perdeden başlatacağız. Öncelikle program için gerekli bir fonksiyon tanımlayalım. harfcevir fonksiyonu kendisine gönderilen nota harfine göre uygun frekansı hesaplar. Frekans için şarkının oktav (perde)  değerini de hesaba alır. Boşluk (es) notası için “-” karakterini tanımladım.

Bundan sonrasında şarkıyı string bir yapıda tanımlayıp string işlemleri ile parçalayarak parçaları sescal fonksiyonuna göndereceğiz. Bu fonksiyon şöyle olabilir.

sescal fonksiyonunda oktav değiştirme ile ilgili bir kontrol var. Şarkı içerisinde “OO” tanımlaması ile oktavı bir yukarı çıkarabiliriz. “oo” tanımlaması ile de bir aşağı indirebiliriz. (Not: Sıfır değil oktavın o’su) Yani “O” veya “o” notası ile ses çıkartmayıp oktav değişimi tanımlamış oluyoruz.

Hatırlarsanız F4 dediğimizde 4 ifadesi yarım nota anlamına geliyordu. Buradaki 4 kısmını char yapısında alacağız. Fakat matematiksel işlemler için int tipine çevrilmesi gerekir. Kullanacağımız rakam aralığı 1-8 arasında olacağı için şu şekilde bir işlem ile “char to int” işlemini gerçekleştirebiliriz.

char tipindeki ‘4’  ifadesinin karşılığı 1×34 ‘tür. ‘0’ ifadesinin karşılığı da 1×30 ‘dur. Bunları birbirinden çıkarırsak sadece sayı kısmı kalır. Bu durumda sonucu matematiksel işlemlerde kullanabiliriz.

T = ‘4’ – ‘0’ = 4 sonucunu bulabiliriz. Bu 4/8 anlamındadır. (Tam notayı 8 olarak baz almıştık)

Buradaki nota uzunluğunu 60.000/Tempo ifadesi ile çarpmamız gerekir. Buradan da notanın kaç milisaniye çalınacağını hesaplayabilirsiniz.

Şimdi string bir şarkıyı parçalayacak bir kod yazalım.

String ifade ikişer karakter olarak taranır. Bu taramada ilk karakter nota, ikinci karakter süre olarak alınıp sescal fonksiyonuna iletilir. Bu fonksiyon harfcevir fonksiyonundan frekans bilgisini alıp kendisi süreyi hesaplar ve sesi dışarı gönderir.

sescal fonksiyonunda noTone ifadesi var. Bu ifade üretilen sesi durdurmak içindir. Her nota arasında küçük bir bekleme eklemek için 50 ms bir bekleme eklenebilir. Gerçi bu durumda tempo süresinde bir miktar uyumsuzluk oluşacaktır. Buradaki farkı nota uzunluğundan kısaltabilirsiniz. Sonuç olarak senfoni orkestrasına iş yapmıyoruz.

13 nolu kapıya bir LED ilave edip nota boyunca ledi yaktırıp küçük bir görsel efekt ekleyebiliriz. Bir de sürpiz olarak Ümit Besen’den Nikah masasını ekledim. Güle güle kullanmanız dileğiyle…

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir