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
Post a Comment