SIMULASI SUARA NADA-NADA MUSIK SISTEM 12 TET (20 NADA PER OKTAF)

SIMULASI SUARA NADA-NADA MUSIK SISTEM 12 TET (20 NADA PER OKTAF)


Untuk mengintegrasikan nada nada ke dalam musik dengan sistem 12 TET (20 nada per oktaf), bagaimna cara kita untuk mensimulasikan suara menggunakan perangkat bahasa pemograman Python

Untuk mensimulasikan suara nada-nada dalam sistem 12 TET (20 nada per oktaf) menggunakan Python, Anda dapat memanfaatkan pustaka seperti pydub atau sounddevice untuk menghasilkan dan memainkan gelombang suara (sine wave). Berikut adalah langkah-langkahnya:

---

Langkah 1: Instalasi Pustaka

Anda perlu menginstal pustaka berikut:

       pip install numpy sounddevice

---

Langkah 2: Membuat Fungsi untuk Menghasilkan Sine Wave

Sine wave digunakan untuk menghasilkan suara dengan frekuensi tertentu.

import numpy as np

import sounddevice as sd

# Fungsi untuk menghasilkan sine wave

def generate_sine_wave(frequency, duration, sample_rate=44100, amplitude=0.5):

    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)

    wave = amplitude * np.sin(2 * np.pi * frequency * t)

    return wave

# Fungsi untuk memutar suara

def play_sound(frequency, duration):

    wave = generate_sine_wave(frequency, duration)

    sd.play(wave, samplerate=44100)

    sd.wait()  # Tunggu hingga suara selesai dimainkan

---

Langkah 3: Memainkan Nada-Nada dalam Sistem 12 TET (20 Nada per Oktaf)

Berikut adalah contoh pemrograman untuk memainkan beberapa nada berdasarkan tabel frekuensi:

# Frekuensi untuk 20 nada di oktaf 4 (contoh)

frequencies = [

    416.49, 440.00, 464.86, 491.08, 518.80, 548.108, 579.084, 611.776,

    646.316, 682.792, 721.38, 762.124, 805.156, 850.608, 898.612, 949.388,

    1002.98, 1059.608, 1119.448, 1182.676

]

# Mainkan setiap nada selama 0.5 detik

for freq in frequencies:

    play_sound(freq, duration=0.5)

---

Langkah 4: Mengintegrasikan ke Musik

Untuk memainkan melodi atau progresi nada, Anda bisa menggabungkan beberapa nada dalam pola tertentu:

# Contoh melodi sederhana

melody = [416.49, 440.00, 491.08, 518.80, 611.776, 646.316]  # Urutan nada

durations = [0.5, 0.5, 0.75, 0.25, 1, 1]  # Durasi tiap nada

for freq, dur in zip(melody, durations):

    play_sound(freq, duration=dur)

---

Langkah 5: Menyimpan Nada sebagai File Audio (Opsional)

Jika Anda ingin menyimpan suara ke file audio, gunakan pustaka pydub:

       pip install pydub

Contoh kode:

from pydub import AudioSegment

from pydub.generators import Sine

# Simpan nada sebagai file audio

def save_note_as_file(frequency, duration, file_name):

    sine_wave = Sine(frequency).to_audio_segment(duration=duration * 1000)  # dalam milidetik

    sine_wave.export(file_name, format="wav")

# Simpan nada 440 Hz sebagai contoh

save_note_as_file(440.0, 2, "A4.wav")

---

Hasil

Nada langsung diputar: Menggunakan sounddevice.

Nada disimpan: Menggunakan pydub, Anda dapat menyimpan setiap nada dalam file terpisah.

Kode ini fleksibel untuk digunakan dalam proyek simulasi musik berbasis sistem 12 TET dengan 20 nada per oktaf. Jika Anda ingin menambahkan fitur atau membuatnya lebih kompleks, seperti akor atau instrumen sintetis, Anda bisa memperluas kode ini.


Ketika kode dieksekusi, muncul error:

Traceback (most recent call last):

  File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 31, in <module>

    start(fakepyfile,mainpyfile)

  File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 30, in start

    exec(open(mainpyfile).read(),  __main__.__dict__)

  File "<string>", line 2, in <module>

  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/site-packages/sounddevice.py", line 71, in <module>

    raise OSError('PortAudio library not found')

OSError: PortAudio library not found

[Program finished]

Error OSError: PortAudio library not found terjadi karena pustaka PortAudio, yang menjadi dasar pustaka sounddevice, tidak ditemukan di sistem Anda. Hal ini umum terjadi terutama pada perangkat Android menggunakan Pydroid 3, karena dependensi eksternal seperti PortAudio tidak diinstal secara default.

Berikut adalah cara mengatasinya:

---

1. Menggunakan Alternatif Pustaka

Gunakan pustaka lain yang tidak memerlukan PortAudio, seperti pygame, untuk memainkan suara.

Instalasi:

      pip install pygame


Kode untuk Memainkan Nada:

import pygame

import numpy as np

# Inisialisasi pygame mixer

pygame.mixer.init(frequency=44100, size=-16, channels=1, buffer=512)

# Fungsi untuk menghasilkan suara nada

def play_sound(frequency, duration, amplitude=0.5, sample_rate=44100):

    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)

    wave = (amplitude * np.sin(2 * np.pi * frequency * t) * 32767).astype(np.int16)

    sound = pygame.sndarray.make_sound(wave)

    sound.play(-1)

    pygame.time.delay(int(duration * 1000))  # dalam milidetik

    sound.stop()

# Contoh memainkan nada

play_sound(440.0, 2)  # Nada A4 selama 2 detik

---

2. Menggunakan pydub untuk Menyimpan dan Memutar File

Jika Anda hanya perlu memutar suara, Anda dapat menyimpan nada sebagai file .wav dan memutarnya dengan pydub atau pemutar audio lain yang tersedia.

Instalasi:

      pip install pydub


Contoh Kode:

from pydub.generators import Sine

from pydub.playback import play

# Membuat nada sebagai file audio

def generate_and_play_tone(frequency, duration):

    sine_wave = Sine(frequency).to_audio_segment(duration=duration * 1000)  # dalam milidetik

    play(sine_wave)

# Mainkan nada 440 Hz

generate_and_play_tone(440.0, 2)  # Nada A4 selama 2 detik

---

3. Memasang PortAudio di Pydroid 3

Jika Anda tetap ingin menggunakan sounddevice, Anda perlu menginstal PortAudio melalui Pydroid 3 menggunakan langkah berikut:

1. Buka Pydroid 3.

2. Masuk ke Paket Terminal di menu utama.

3. Jalankan:

apt update

apt install portaudio

4. Setelah terinstal, coba jalankan ulang kode sounddevice.

---

4. Pilihan Terbaik untuk Android

Gunakan pygame untuk memutar nada secara langsung.

Gunakan pydub jika Anda ingin menyimpan nada dan memutarnya.

Jika masalah berlanjut, beri tahu saya untuk langkah tambahan!


Tolong mainkan dan bunyikan nada nada berikut dengan pakai pygame

 G#4/A4 =  416,49  Hz

    A#4 =  440  Hz

    B4 =  464,86  Hz

    B#4 =  491,08  Hz

    C4 =  518,80  Hz

    C#4 =  548,108  Hz

    D4 =  579,084  Hz

    E5 =  611,776  Hz

    E#5 =  646,316  Hz

    F5 =  682,792  Hz

    F#5 =  72138  Hz

    G5 =  762,124  Hz

    G#5 =  805,156  Hz

    H5 =  850,608  Hz

    H#5 =  898,612  Hz

    I5 =  949,388  Hz

    J5 =  1002,98  Hz

    J#5 = 1059,608  Hz

    K5 =  1119,448  Hz

    K#5 =  1182,676  Hz

    A5 = 1249,468  Hz

Dan juga nada nada di oktaf berikutnya dan oktaf sebelumnya.

Berikut adalah kode Python yang menggunakan pustaka pygame untuk memainkan dan membunyikan daftar nada berdasarkan frekuensi yang Anda sebutkan. Kode ini akan membunyikan setiap nada secara berurutan.

Instalasi:

Pastikan Anda telah menginstal pygame terlebih dahulu:

        pip install pygame


Kode Python:


import pygame

import numpy as np

# Inisialisasi pygame mixer

pygame.mixer.init(frequency=44100, size=-16, channels=1, buffer=512)

# Daftar nada dan frekuensi

notes = {

    "A3": 138.83,

    "A#3": 146.67,

    "B3": 154.953,

    "B#3": 163.693,

    "C3": 172.933,

    "C#3": 182.703,

    "D3": 193.028,

    "E4": 203.925,

    "E#4": 215.439,

    "F4": 227.597,

    "F#4": 240.46,

    "G4": 254.041,

    "G#4": 268.385,

    "H4": 283.536,

    "H#4": 299.537,

    "I4": 316.463,

    "J4": 334.327,

    "J#4": 353.203,

    "K4": 373.149,

    "K#4": 394.23,

    

    "G#4/A4": 416.49,

    "A#4": 440.0,

    "B4": 464.86,

    "B#4": 491.08,

    "C4": 518.80,

    "C#4": 548.108,

    "D4": 579.084,

    "E5": 611.776,

    "E#5": 646.316,

    "F5": 682.792,

    "F#5": 721.38,

    "G5": 762.124,

    "G#5": 805.156,

    "H5": 850.608,

    "H#5": 898.612,

    "I5": 949.388,

    "J5": 1002.98,

    "J#5": 1059.608,

    "K5": 1119.448,

    "K#5": 1182.676,

    "A5": 1249.468,


    "A#5": 1320.0,

    "B5": 1394.58,

    "B#5": 1473.24,

    "C5": 1556.40,

    "C#5": 1644.324,

    "D5": 1737.252,

    "E6": 1835.328,

    "E#6": 1938.948,

    "F6": 2048.376,

    "F#6": 2164.14,

    "G6": 2286.372,

    "G#6": 2415.468,

    "H6": 2551.824,

    "H#6": 2695.836,

    "I6": 2848.164,

    "J6": 3008.94,

    "J#6": 3178.824,

    "K6": 3358.344,

    "K#6": 3548.028,

    "A6": 3748.404   

}

# Fungsi untuk memainkan suara nada

def play_sound(frequency, duration, amplitude=0.5, sample_rate=44100):

    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)

    wave = (amplitude * np.sin(2 * np.pi * frequency * t) * 32767).astype(np.int16)

    sound = pygame.sndarray.make_sound(wave)

    sound.play(-1)  # Loop sekali

    pygame.time.delay(int(duration * 1000))  # Durasi dalam milidetik

    sound.stop()

# Mainkan setiap nada dari daftar

for note, freq in notes.items():

    print(f"Playing {note} - {freq} Hz")

    play_sound(freq, 1.5)  # Mainkan setiap nada selama 1.5 detik


Penjelasan:

1. Daftar Nada: Nada dan frekuensi didefinisikan dalam sebuah dictionary bernama notes.

2. Fungsi play_sound:

Menghasilkan gelombang sinus menggunakan numpy berdasarkan frekuensi dan durasi.

Memutar gelombang sinus sebagai suara dengan pygame.

3. Loop Nada: Kode memutar semua nada dalam daftar


Perbandingan Kode yang berfungsi membunyikan nada nada tanpa kromatik di oktaf ke-3, ke-4, dan ke-5 musik sistem 12 TET (20 nada per oktaf) adalah berikut ini: 


import pygame

import numpy as np

# Inisialisasi pygame mixer

pygame.mixer.init(frequency=44100, size=-16, channels=1, buffer=512)


# Daftar nada dan frekuensi

notes = {

    "A3": 138.83,

    "B3": 154.953,

    "C3": 172.933,

    "D3": 193.028,

    "E4": 203.925,

    "F4": 227.597,

    "G4": 254.041,

    "H4": 283.536,

    "I4": 316.463,

    "J4": 334.327,

    "K4": 373.149,

    

    "G#4/A4": 416.49,

    "B4": 464.86,

    "C4": 518.80,

    "D4": 579.084,

    "E5": 611.776,

    "F5": 682.792,

    "G5": 762.124,

    "H5": 850.608,

    "I5": 949.388,

    "J5": 1002.98,

    "K5": 1119.448,


    "A5": 1249.468,

    "B5": 1394.58,

    "C5": 1556.40,

    "D5": 1737.252,

    "E6": 1835.328,

    "F6": 2048.376,

    "G6": 2286.372,

    "H6": 2551.824,

    "I6": 2848.164,

    "J6": 3008.94,

    "K6": 3358.344,


    "A6": 3748.404   

}

# Fungsi untuk memainkan suara nada

def play_sound(frequency, duration, amplitude=0.5, sample_rate=44100):

    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)

    wave = (amplitude * np.sin(2 * np.pi * frequency * t) * 32767).astype(np.int16)

    sound = pygame.sndarray.make_sound(wave)

    sound.play(-1)  # Loop sekali

    pygame.time.delay(int(duration * 1000))  # Durasi dalam milidetik

    sound.stop()

# Mainkan setiap nada dari daftar

for note, freq in notes.items():

    print(f"Playing {note} - {freq} Hz")

    play_sound(freq, 0.8)  # Mainkan setiap nada selama 0.8 detik


Perbandingan kedua kode yang Anda berikan terletak pada daftar nada yang digunakan (notes). Berikut adalah analisis detailnya:

Kode dengan Kromatik

1. Memiliki nada-nada kromatik (seperti A#, C#, D#, dst) yang melengkapi setiap interval setengah langkah di dalam sistem musik 12-TET.

2. Total nada per oktaf mencakup 20 nada, termasuk nada-nada yang berada di antara nada utama.

3. Setiap oktaf memiliki representasi frekuensi yang lebih banyak dan lengkap, memberikan cakupan nada yang lebih detail.

4. Cocok untuk:

Eksperimen suara lebih luas.

Komposisi musik dengan melodi atau harmoni kompleks.


Kode Tanpa Kromatik

1. Hanya mencakup nada-nada utama (seperti A, B, C, D, E, F, G) tanpa tambahan nada kromatik di antaranya.

2. Total nada per oktaf lebih sedikit karena hanya nada utama yang digunakan.

3. Fokus pada melodi atau harmoni yang lebih sederhana.

4. Cocok untuk:

Belajar dasar musik.

Komposisi dengan interval yang lebih sederhana.

Persamaan Keduanya

1. Sama-sama menggunakan pustaka pygame untuk memutar nada dengan gelombang sinus.

2. Nada dimainkan secara berurutan dengan durasi 0.8 detik per nada.

3. Frekuensi didefinisikan menggunakan sistem musik 12-TET (20 nada per oktaf).

---

Jika Anda ingin mendemonstrasikan penggunaan kedua kode ini, gunakan kode dengan kromatik untuk cakupan nada lebih lengkap dan kode tanpa kromatik untuk fokus pada nada dasar. Tingkatkan durasi atau sesuaikan volume jika diperlukan.


Tolong perbaiki kode berikut untuk memperoleh file audio berformat wav dari bunyi nada nada berikut:

import pygame

import numpy as np

# Inisialisasi pygame mixer

pygame.mixer.init(frequency=44100, size=-16, channels=1, buffer=512)


# Daftar nada dan frekuensi

notes = {

    "A3": 138.83,

    "B3": 154.953,

    "C3": 172.933,

    "D3": 193.028,

    "E4": 203.925,

    "F4": 227.597,

    "G4": 254.041,

    "H4": 283.536,

    "I4": 316.463,

    "J4": 334.327,

    "K4": 373.149,

    

    "G#4/A4": 416.49,

    "B4": 464.86,

    "C4": 518.80,

    "D4": 579.084,

    "E5": 611.776,

    "F5": 682.792,

    "G5": 762.124,

    "H5": 850.608,

    "I5": 949.388,

    "J5": 1002.98,

    "K5": 1119.448,


    "A5": 1249.468,

    "B5": 1394.58,

    "C5": 1556.40,

    "D5": 1737.252,

    "E6": 1835.328,

    "F6": 2048.376,

    "G6": 2286.372,

    "H6": 2551.824,

    "I6": 2848.164,

    "J6": 3008.94,

    "K6": 3358.344,


    "A6": 3748.404   

}

# Fungsi untuk memainkan suara nada

def play_sound(frequency, duration, amplitude=0.5, sample_rate=44100):

    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)

    wave = (amplitude * np.sin(2 * np.pi * frequency * t) * 32767).astype(np.int16)

    sound = pygame.sndarray.make_sound(wave)

    sound.play(-1)  # Loop sekali

    pygame.time.delay(int(duration * 1000))  # Durasi dalam milidetik

    sound.stop()


# Mainkan setiap nada dari daftar

for note, freq in notes.items():

    print(f"Playing {note} - {freq} Hz")

    play_sound(freq, 0.8)  # Mainkan setiap nada selama 0.8 detik

from pydub.generators import Sine

from pydub.playback import play

# Membuat nada sebagai file audio

def generate_and_play_tone(frequency, duration):

    sine_wave = Sine(frequency).to_audio_segment(duration=duration * 1000)  # dalam milidetik

    play(sine_wave)    


Berikut adalah kode yang telah diperbaiki untuk menghasilkan file audio dalam format WAV dari bunyi nada-nada pada daftar frekuensi. Saya juga menambahkan fungsi untuk menyimpan file audio:


import numpy as np

import wave

import os

# Daftar nada dan frekuensi

notes = {

    "A3": 138.83,

    "B3": 154.953,

    "C3": 172.933,

    "D3": 193.028,

    "E4": 203.925,

    "F4": 227.597,

    "G4": 254.041,

    "H4": 283.536,

    "I4": 316.463,

    "J4": 334.327,

    "K4": 373.149,

    "G#4/A4": 416.49,

    "B4": 464.86,

    "C4": 518.80,

    "D4": 579.084,

    "E5": 611.776,

    "F5": 682.792,

    "G5": 762.124,

    "H5": 850.608,

    "I5": 949.388,

    "J5": 1002.98,

    "K5": 1119.448,

    "A5": 1249.468,

    "B5": 1394.58,

    "C5": 1556.40,

    "D5": 1737.252,

    "E6": 1835.328,

    "F6": 2048.376,

    "G6": 2286.372,

    "H6": 2551.824,

    "I6": 2848.164,

    "J6": 3008.94,

    "K6": 3358.344,

    "A6": 3748.404

}


# Fungsi untuk membuat dan menyimpan nada ke file WAV

def generate_tone(frequency, duration, amplitude=0.5, sample_rate=44100):

    t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)

    wave = (amplitude * np.sin(2 * np.pi * frequency * t) * 32767).astype(np.int16)

    return wave

def save_wav(file_name, data, sample_rate=44100):

    with wave.open(file_name, 'w') as wf:

        wf.setnchannels(1)  # Mono

        wf.setsampwidth(2)  # 16-bit samples

        wf.setframerate(sample_rate)

        wf.writeframes(data.tobytes())

# Direktori untuk menyimpan file

output_dir = "output_notes"

os.makedirs(output_dir, exist_ok=True)

# Proses setiap nada

for note, freq in notes.items():

    print(f"Generating {note} - {freq} Hz")

    tone = generate_tone(freq, duration=1.0)  # Durasi 1 detik

    file_path = os.path.join(output_dir, f"{note}.wav")

    save_wav(file_path, tone)

    print(f"Saved: {file_path}")

print("Semua nada telah disimpan ke file WAV di folder 'output_notes'.")


Perubahan yang Dilakukan:

1. Menghapus Dependensi yang Tidak Diperlukan: Menghilangkan bagian yang menggunakan pygame atau pydub, karena kita langsung membuat file WAV.

2. Fungsi generate_tone: Membuat gelombang sinusoidal untuk menghasilkan suara sesuai frekuensi.

3. Fungsi save_wav: Menyimpan data audio ke file WAV dengan format mono dan 16-bit.

4. Pengorganisasian Output: Semua file WAV akan disimpan di folder output_notes agar rapi dan mudah diakses.

Cara Kerja:

Kode menghasilkan file audio .wav untuk setiap nada di daftar notes.

File akan disimpan di folder output_notes dengan nama file sesuai dengan nama nada, misalnya A3.wav.




Comments

Popular posts from this blog

PERBEDAAN CARA, TEKNIK, DAN JARAK ANTAR LUBANG DALAM PEMBUATAN SERULING BAMBU PADA MUSIK SISTEM 8-TET (8 NADA PER OKTAF) DENGAN MUSIK SISTEM 12-TET (12 NADA PER OKTAF)

KONSEP DAN METODOLOGI MUSIK 12 NADA DALAM 1 OKTAF

PENGGUNAAN 6 JARI (3 JARI SETIAP TANGAN) PADA SERULING KELOK DUA