Ana içeriğe atla

C# ile Sesin Dalga Boylarını - Şekillerini Çizdirmek

Bu makalemizde yukarıdaki örnek resimde görüldüğü gibi sesin dalga boyunu veya dalga şekillerini nasıl yazdırabiliriz bu sorunun cevabını arıyor olacağız.

Öncelikle bu projemizin .NET 4.0 ve sonraki sürümlerinde başarılı olarak çalıştığını vurgulamakta fayda olacaktır. Çünkü Chart nesnesi, C# Form bünyesine, .NET 4.0'dan sonra eklenmiş bir nesnedir.

Vakit kaybetmeden başlayalım. Öncelikle bütün ses işleme, ses verileri elde etme, ses analizleri gibi konularda sizin yardımınıza koşacak nitelikteki profesyonel bir kütüphane olan "NAudio" kütüphanesini projemize import etmeliyiz.

NAudio Kütüphanesini Projemize Nasıl Ekleyebiliriz?



  1. Öncelikle NAudio 1.8 Released yazısına tıklayarak kütüphaneyi doğrudan indiriyoruz.
  2. Daha sonra sağ taraftan projemizin bulunduğu klasöre tıklayıp "Add References" seçeneğini seçip "Browse" seçeğinden kütüphaneyi seçiyoruz.
  3. Visual Studio 2017 Türkçe olanlar ise "Hizmet Başvurusu Ekle" ve "Gözat" seçeneklerinden bu işlemi gerçekleştirebilirler.


  • Ekleme işleminden sonra projemizin arayüzüne bir button ve bir Chart nesnesi eklenir.
  •  Daha sonra OpenFileDialog nesnesiyle .wav formatı için Dialog penceresi, Button'un Click Eventinde aşağıdaki gibi çağrılır;


1
2
3
4
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Audio Files (.wav)|*.wav";
            ofd.ShowDialog();
            string path = ofd.FileName;

 Eğer OpenFileDialog nesnesinde bir sıkıntı yaşamadıysanız diğer kodlarınızı aşağıdaki gibi yazarak, Chart nesnesine, seçmiş olduğunuz .wav formatındaki bir ses dosyasının dalga formlarını çizdirebilirsiniz.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
if (ofd.ShowDialog() == DialogResult.OK)
  {
    chart1.Series.Add("wave");
    chart1.Series["wave"].ChartType = 
 DataVisualization.Charting.SeriesChartType.FastLine;
    chart1.Series["wave"].ChartArea = "ChartArea1";
     NAudio.Wave.WaveChannel32 wave = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(path));
     byte[] buffer = new byte[16384];
     int read = 0;
                while(wave.Position<wave.Length)
     {
      read = wave.Read(buffer, 0, 16384);
      for (int i = 0; i < read/4; i++)
          {                    
 chart1.Series["wave"].Points.Add(BitConverter.ToSingle(buffer, i * 4));
          }
 }
   }

Yukarıdaki işlemlerden sonra aşağıdaki gibi bir ekran çıktısı alacaksınızdır;


İlgili Projenin GitHub Linki için;


Makalemizin Devamında Ses Verisinin Değerlerini Elde Etme, Ses Verisi Üzerinde Data Mining (Veri Madenciliği) Yöntemlerini de Ekliyor Olacağım. Soru ve Görüşlerinizi Yorum Olarak Aktarabilirsiniz.

Yorumlar

Bu blogdaki popüler yayınlar

Arduino Buzzer için Örnek Müzik Kodları

Bugün ki yazımda programlaması tamamıyla bana ait olan bazı buzzer kodlarını yazımın devamında paylaşıyor olacağım. Öncelikle bağlantı şemasıyla başlayalım; Malzemeler: Arduino (Uno, Nano, Mega) 100 Ohm Direnç Breadboard Bağlama Tarifi: Buzzer'da iki bacak bulunur. Buzzer'ın üstüne baktığınızda bacaklardan birisinin hizasında (+) yazar. Bu bacağı 8 No.lu pine bağlayabilirsiniz. veya istediğiniz herhangi başka bir digital bacak da olabilir. Kodunuzu da ona göre düzenlemeniz gerekir. İkinci bacağı da direnç üzerinden GND (-) Toprak hattına bağlamak gerekir. Bağlantı Şeması: Yukarıdaki şemada siyah (-), kırmızı (+) ucu temsil etmektedir. Ben kodlara ilgili notaların frekanslarını ekledim. Örnek olarak da 2 adet müziği buraya ekleyeceğim. sizler diğer müziklerin notalarını öğrendikten sonra duraksamaları deneme yanılma yoluyla bulabilirsiniz. Takıldığınız yerde aşağıya yorum bırakırsanız seve seve yardımcı da olabilirim. Notalar: 1 2 3 4 5 6 7

16x2 LCD I2C (i2c) Hataları ve Çözümler

Merhaba arkadaşlar arduino I2C modülü kullanımında oluşan bazı hatalardan bahsetmek istiyorum. Öncelikle bu modülle görüntü alamıyorsanız arkasındaki potansiyometreyi sağa ve sola çevirerek uygun konstrata getirin bu sebeple yazılar görünmüyor olabilir. Bağladığınızda arduino kapanıyorsa kısa devre vardır lehim aralıklarını kontrol edin temas olabiliyor. Eğer tek karakter ekranda çıkıyor diğer karakterler çıkmıyorsa aşağıda verdiğim kütüpaneyi yükleyin sorununuz çözülecektir. Eğer buna rağmen görüntü alamıyorsanız LCD panel adresiniz farklı olabilir  LiquidCrystal_I2C lcd(0x27, 16, 2);  kod satırındaki " 27 " yi " 3f " yapın. Yani şöyle olmalı  LiquidCrystal_I2C lcd(0x3f, 16, 2);  Bu şekilde büyük olasılıkla görüntü alamama sorununuz çözülecektir. I2C Port bağlantıları şöyle olmalıdır: gnd-gnd vcc - 5 v sda- A4 scl-A5 pinine bağlanmalıdır. Örnek Kod: #include <Wire.h> #include <LiquidCrystal_I2C.h> // LCD adres 0x3f 16 kara

PID Algoritmalı Çizgi İzleyen Robot (PID Line Follower)

PID var olan bir problemin çözümünde  Oranı, integrali ve Türevi toplayarak bir hata oranı çıkarır ve bunu minimuma indirgemek için bir yol geliştirilir. Daha sonra PID'nin detaylı açıklamasını yaparım. Bu yazıdaki amacım hani hep gördüğünüz virajları çok hızlı dönen çizgi izleyenlerin nasıl yapıldıklarını nacizane göstermek. Malzemeler: Arduino Nano veya UNO Pololu QTR 8RC Kızıl ötesi sensör dizisi Pololu TB6612FNG Motor Sürücü 2 Adet Redüktörlü 6V DC Motor 9V Tercihen Duracell Pil (Arduino beslemesi için)  11.1V bir Li-Po pil (Motor sürücü için) Bağlantı Şeması: Kaynak Kodu: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 #include <QTRSensors.h> #define Kp 0 // Kendi deneyimlerinizle bulmanız gerekli küçük bir değer ile başlayıp, büyütebilirsiniz en kararlı Kp değerini bulana kadar.. #