7203030031
Transcript of 7203030031
PROYEK AKHIR
PEMBUATAN KOMPOSER (LAGU) PADA PERSONAL COMPUTER (PC) BERBASIS
DIGITAL SIGNAL PROCESSING (DSP) (Dengan Efek)
ASIH IRAWATI NRP. 7203 030 031
Dosen Pembimbing :
Tri Budi Santoso ST, MT
NIP. 132 128 464
Bima Sena Bayu Dewantara, SST NIP. 132 232 762
JURUSAN TEKNIK TELEKOMUNIKASI
POLITEKNIK ELEKTRONIKA NEGERI SURABAYA S U R A B A Y A 2006
i
PEMBUATAN KOMPOSER (LAGU) PADA PERSONAL COMPUTER (PC) BERBASIS DIGITAL SIGNAL PROCESSING (DSP)
(Dengan Efek)
Oleh: Asih Irawati 7203 030 031
Proyek Akhir ini Diajukan Sebagai Salah Satu Syarat Untuk
Memperoleh Gelar Ahli Madya (A.Md) di
Politeknik Eletronika Negeri Surabaya Institut Teknologi Sepuluh Nopember Surabaya
Disetujui Oleh : Tim Penguji Proyek Akhir: Dosen Pembimbing: 1. Drs. Miftahul Huda, MT 1. Tri Budi Santoso ST, MT NIP. 132 055 257 NIP. 132 128 464 2. Sritrusta Sukaridhoto, ST 2.Bima Sena Bayu D, SST NIP. 132 300 372 NIP. 132 232 762 3. Ari Wijayanti, ST NIP. 132 303 877
Mengetahui
Ketua Jurusan Tekomunikasi
Drs. Miftahul Huda, MT
NIP. 132 055 257
ii
ABSTRAK
Pengolahan sinyal digital dapat dimodelkan dengan perangkat lunak. Hasil proyek akhir ini akan digunakan sebagai media untuk pembuatan lagu dengan penambahan efek audio digital sebagai salah satu aplikasi dari pengolahan sinyal digital. Komposer merupakan sistem yang mampu memadukan dan mengolah nada-nada tunggal menjadi sebuah lagu. Pada saat ini komposer dibuat pada telepon seluler. Suara musik yang dihasilkan berupa susunan dari nada-nada tunggal yang telah melalui proses pembangkitan nada-nada tunggal, penambahan efek, penggabungan nada-nada dan pengemasan lagu.
Pembuatan komposer ini dilengkapi dengan efek audio digital. Efek audio digital merupakan proses modifikasi sinyal suara atau audio dengan teknologi digital sehingga dihasilkan suara yang berbeda dari suara aslinya. Efek audio digital yang dihasilkan pada proyek akhir ini terdiri dari tiga efek, yaitu echo, reverb dan chorus.
Kata kunci : Pengolahan sinyal digital, echo, reverb dan chorus.
iii
ABSTRACT
Digital signal processing (DSP) can be implemented using software. The result of this final project will using as media for creating a song with adding digital audio effects. Composer is a system that capable to combine and process the single tones become a song. At the moment composer can only be made at mobile phone. Sound of music yielded composition from single tones that through single tones generating process, effects adding, tones combining and packing a song from the music notes, then this notes are combined and processed using Snack Tcl/tk and C++ programming.
This composer making is completed with digital audio effects. Digital Audio effects represent the process of signal voice modification or audio with digital technology so it result different voice from its original voice. Digital Audio effects produced three effects in this final project there are echo, reverb and chorus Keyword : Digital signal processing, echo, reverb, and chorus.
iv
KATA PENGANTAR
Assalamu’alaikum WR.Wb. Alhamdulillah! Puji syukur kehadhirat Allah SWT atas rahmat dan
hidayah-Nya sehingga dapat menyelesaikan proyek akhir ini dengan baik. Adapun judul proyek akhir ini adalah:
PEMBUATAN KOMPOSER (LAGU) PADA PERSONAL COMPUTER (PC) BERBASIS DIGITAL SIGNAL PROCESSING (DSP)
(DENGAN EFEK)
Proyek Akhir ini disusun sebagai salah satu syarat untuk memperoleh gelar Ahli Madya (A.Md.) di Politeknik Elektronika Negeri Surabaya, Institut Teknologi Sepuluh Nopember Surabaya (ITS).
Dalam menyelesaikan proyek akhir ini berdasarkan teori-teori yang telah diperoleh dalam perkuliahan, literature dan bimbingan dari dosen pembimbing serta pihak pihak lain yang telah memberi semangat dan bantuan.
Penulis menyadari bahwa buku ini jauh dari kesempurnaan, oleh karena itu saran dan kritik yang bersifat membangun dari pembaca sangat diharapkan demi kesempurnaan buku ini.
Harapan penulis adalah semoga apa yang telah dituangkan dalam buku proyek akhir ini dapat bermanfaat bagi penulis, rekan-rekan mahasiswa khususnya dan seluruh pembaca pada umumnya. Akhir kata penulis ucapkan terima kasih kepada semua pihak yang telah membantu dalam menyelesaikan proyek akhir ini.
Wassalamu’alaikum Wr.Wb.
Surabaya, Agustus 2006 Penulis
v
UCAPAN TERIMA KASIH
Puji syukur yang tak terhingga penulis sampaikan kehadirat Allah SWT Sang Penguasa Alam Raya karena atas rahmat, taufik dan hidayah-Nya penulis dapat menyelesaikan Proyek Akhir ini. Penulis menyadari bahwa tanpa bantuan dari berbagai pihak, buku proyek akhir ini tidak akan dapat tersusun. Oleh karena itu, pada kesempatan ini penulis ingin mengucapkan terima kasih yang sebesar-besarnya kepada :
1. Bapak Tri Budi Santoso ST,MT selaku dosen pembimbing tugas akhir.
2. Bapak Bima yang telah meluangkan waktunya guna penyelesaian proyek akhir ini
3. Bapak Dr.Ir. Titon Dutomo selaku direktur Politeknik Elektronika Negeri Surabaya-ITS.
4. Bapak Drs Miftahul Huda, MT selaku ketua jurusan Teknik Telekomunikasi Politeknik Elektronika Negeri Surabaya.
5. Semua dosen dan staf Politeknik Elektronika Nageri Surabaya - ITS, bidang keahlian Telekomunikasi atas didikannya dan dukungan selama ini.
6. Keluargaku yang selama ini memberikan dukungan moril, material, dan sayangnya.
7. Teman-teman di Politeknik Elektronika Negeri Surabaya bantuan dan dukungannya.
8. Teman-teman seperjuangan untuk proyek akhir atas dukungan dan kekompakannya.
9. Dan semua pihak yang telah membantu dalam penyelesaian proyek akhir ini.
Akhir kata, penulis ucapkan terima kasih yang sebesar-besarnya
dan semoga buku ini dapat memberikan manfaat bagi kita semua.
Surabaya, Agustus 2006
Penulis
vi
DAFTAR ISI HALAMAN JUDUL……………………………………………… i LEMBAR PENGESAHAN ………………………………..……... ii ABSTRAK………………………………………………………… iii ABSTRACT…...…………………………………………………... iv KATA PENGANTAR..……………………………………………. v UCAPAN TERIMA KASIH………………………………………. vi DAFTAR ISI.…………………………………………………..….. vii DAFTAR GAMBAR……………………………………………… ix DAFTAR TABEL…………………………………………………. x BAB I. PENDAHULUAN………………………………………… 1
1.1. LATAR BELAKANG……………...…………………. 1 1.2. PERUMUSAN MASALAH………..………………..... 2 1.3. BATASAN MASALAH….………..…………………... 2 1.4. TUJUAN DAN MANFAAT…………………………... 2 1.5. METODOLOGI ………………….……………………. 2 1.6. SISTEMATIKA PEMBAHASAN..…………………… 3
BAB II. DASAR TEORI…………………………………………... 5
2.1. UMUM……………………………………………….... 5 2.2. Snack Tcl/tk .................................................................... 5
2.2.1. Snack 2.2……………………………………....... 5 2.2.2. Tcl/tk 8.3.0………………………………………. 5 2.2.3. Perintah Dasar Tcl / Tk dan Snack........................ 6
2.3. Konsep Dasar Visual C++…………………………… 7 2.4. Frekuensi Suara Musik………………………………… 7 2.5. Pengenalan Not Musik…………………………………. 9
2.5.1. Sistem Not Balok Angka………………………... 9 2.5.2. Sistem Not Balok Huruf………………………… 9
2.6. Efek Audio Digital…………………………………….. 10 2.6.1. Efek Echo………………………………………. 10 2.6.2. Reverberation………..………………………….. 11 2.6.3. Chorus…………………………………………... 11
2.7. Atenuasi………………………………………………... 12 2.8. Sinyal Audio…………………………………………… 12
2.8.1 Operasi Sinyal…………………………………… 13 2.8.1.Pergeseran…………………………………….. 13 2.8.2 Penjumlahan………………………………….. 14
vii
2.8.3 Perkalian……………………………………… 14
BAB III. PERENCANAAN DAN PEMBUATAN PERANGKAT LUNAK.............................................................................. 15
3.1. Perencanaan Sistem.................................................... 15 3.2 Pembuatan ekstensi...................................................... 16
3.2.1. Membangun ektensi.............................................. 17 3.3. Penentuan Frekuensi Nada-nada Tunggal................... 19 3.4. Pembangkitan Nada-nada Tunggal.............................. 20
3.4.1 Pembangkitan Nada dengan Pemrograman C++... 20 3.4.2 Pembangkitan Nada dengan Tcl/T......................... 21
3.5. Penambahan Efek Audio Digital................................. 22 3.5.1 Efek Echo............................................................... 22 3.5.2 Efek Reverb........................................................... 23 3.5.3 Efek Chorus........................................................... 24
3.6. Penggabungan Nada-Nada........................................... 25 3.6.1 Pemanggilan Gabungan pada C++........................ 26 3.6.2 Penyimpanan Gabungan Nada-Nada dalam
Bentuk .wav.......................................................... 26
3.7. Pengemasan Lagu........................................................ 27 3.7.1 Pembuatan Tampilan.............................................. 27
BAB IV. PENGUJIAN DAN ANALISA........................................ 29 4.1. Pengujian Lagu Sebelum Penambahan Efek............... 29
4.1.1 Pengujian Lagu Ibu Kita Kartini........................... 31 4.2. Pengujan Efek Echo..................................................... 32
4.2.1 Pengujian Lagu Ibu Kita Kartini........................... 33 4.3. Pengujian Efek Reverb................................................ 34
4.3.1 Pengujian Lagu Ibu Kita Kartini........................... 36 4.4 Pengujian Efek Chorus................................................. 37
4.4.1 Pengujian Lagu Ibu Kita Kartini........................... 39 BAB V PENUTUP............................................................................ 41
5.1. Kesimpulan.................................................................. 41 5.2. Saran............................................................................ 41
DAFTAR PUSTAKA........................................................................ 43 LAMPIRAN DAFTAR RIWAYAT HIDUP
viii
DAFTAR GAMBAR Gambar 2.1 Wish Interpreter........................................................ 6 Gambar 2.2 Blok Diagram echo …………..................................... 10 Gambar 2.3 Lintasan gelombang bunyi yang merambat menuju
pendengar.................................................................. 11
Gambar 2.4 Diagram efek Chorus ………………………………. 11 Gambar 2.5 Pelemahan suatu sinyal ……………………………... 12 Gambar 2.6 Operasi pergeseran sinyal …………………………... 13 Gambar 2.7 Operasi penjumlahan sinyal........................................ 14 Gambar 2.8 Operasi perkalian dua sinyal............................................ 14 Gambar 3.1 Blok diagram pembuatan lagu.................................... 15 Gambar 3.2 Blok Diagram Pembuatan Ektensi………………. 16 Gambar 3.3 Spesifikasi lokasi dari file Snack dan Tcl include....... 17 Gambar 3.4 Spesifikasi stub........................................................... 18 Gambar 3.5 Spesifikasi librari dari Snack dan Tcl ......................... 18 Gambar 3.6 Output dalam bentuk dll.............................................. 19 Gambar 4.1 Tampilan awal dari piano ................................... 29 Gambar 4.2.a Bentuk Sinyal Nada-nada Dasar Tanpa Efek ........... 31 Gambar 4.2.b Sinyal Masukan............................................ ............ 31 Gambar 4.3 Bentuk Sinyal Nada-nada Dasar untuk Efek Echo..... 33 Gambar 4.3.a Hasil pengujian waktu tunda efek echo 20 ms.......... 34 Gambar 4.3.b Hasil pengujian waktu tunda efek echo 50 ms......... 34 Gambar 4.4 Bentuk Sinyal Nada-nada Dasar untuk Efek Reverb... 37 Gambar 4.4.a Hasil pengujian waktu tunda efek reverb 20 ms....... 37 Gambar 4.4.b Hasil pengujian waktu tunda efek reverb 50 ms....... 38 Gambar 4.5 Bentuk Sinyal Nada-nada Dasar untuk Efek Chorus... 39 Gambar 4.5.a Sinyal keluaran efek chorus..................................... 39 Gambar 4.5.b Sinyal keluaran efek chorus dengan evvelope......... 40
ix
DAFTAR TABEL
Tabel 1 Sejumlah ekstensi yang dibangkitkan oleh C++.............. 7 Tabel 2 Nilai dasar frekuensi dari not musik............................... 8 Tabel 3 Tabel Frekuensi Tiap Oktaf ............................................ 9
x
B A B I PENDAHULUAN
1.1 LATAR BELAKANG
Dewasa ini komputer memegang peranan penting dalam perkembangan produksi teknologi audio. Dengan penerapan hardware dan software yang tepat sistem komputer dapat digunakan untuk pembuatan lagu, perekaman, pengeditan, mixing, mastering dan streaming di internet. Hal ini mebuat penerapan pengolahan sinyal audio seperti equalizer dan digital audio effects dengan sistem komputer semakin luas [1].
Demikian halnya dengan pengolahan sinyal secara digital yang telah diterapkan begitu luas. Dari peralatan instrumentasi dan kontrol, peralatan musik, peralatan kesehatan dan peralatan lainnya [2]. Sebagai penerapan dari pengolahan sinyal digital menggunakan sistem komputer, untuk itu pembuatan komposer (lagu) pada personal komputer menggunakan digital signal processing dengan efek ini merupakan salah satu aplikasi dari perkembnagan teknologi pengolahan sinyal
Komposer adalah seseorang yang menulis musik, dalam hal ini orang tersebut menulis musik dalam bentuk not-not musik yang memungkinkan orang lain untuk memainkannya [3]. Tetapi dalam proyek akhir ini yang dimaksud dengan komposer adalah sebuah software yang dapat memadukan not-not musik menjadi sebuah lagu Saat ini komposer hanya dapat dibuat pada mobile phone. Dengan pengolahan sinyal digital, bahasa pemrograman Snack Tcl/tk dan visual C++ akan diperoleh sebuah software dimana komposer atau lagu tersebut dapat ditampilkan pada personal komputer .
Pembuatan sebuah lagu dapat dilakukan melalui proses pembangkitan frekuensi dari not-not musik yang kemudian diolah dengan bahasa pemrograman Snack Tcl/tk dan visual C++. Dengan mengolah frekuensi-frekuensi tersebut akan diperoleh suara yang berlainan dari tiap nada. Dari nada-nada tersebut akan diatur dan dipadukan sehingga akan menghasilkan sebuah lagu.
Proyek akhir ini menggunakan alat musik piano sebagai sumber suara. Bentuk alat musik piano dapat dibuat menggunakan script Snack tcl/tk dan pembangkitan suara dari tiap-tiap notnya menggunakan bahasa pemrograman visual C++, dimana kedua program tersebut telah
1
2 di-ektensi terlebih dahulu. Not-not dari alat musik piano yang telah dibangkitkan tersebut (nada) kemudian digabungkan sehingga dapat menjadi sebuah lagu dengan nada-nada tunggal maupun dengan penambahan efek
Sedangkan untuk efek menu pilihannya meliputi echo, reverb dan chorus. Untuk memilih efek yang ingin dimainkan, pengguna dapat memilih pilihan yang berkaitan dengan efek tersebut.
1.2 PERUMUSAN MASALAH
Dari pembahasan diatas maka permasalahan yang mungkin akan terjadi yaitu bagaimana menggabungkan nada-nada tersebut menjadi satu lagu yang akan menghasilkan suara dengan penambahan efek. Implementasi dari efek audio digital menggunakan pemrograman C++ dapat direalisasikan dan ditampilkan. 1.3 BATASAN MASALAH
Permasalahan pada proyek akhir ini dibatasi untuk lagu pada alat musik piano. Pengujian lagu dilakukan dengan menguji tiap nada dan menggabungkannnya. Pembuatan komposer ini menggunakan bahasa pemrograman Snack 2.2, Tcl/Tk 8.3.0. dan C++. Efek audio digital yang digunakan adalah echo, reverb dan chorus. 1.4 TUJUAN DAN MANFAAT
Tujuan dari proyek akhir ini adalah untuk mendayagunakan perangkat lunak dengan cara mengembangkannya sedemikian rupa sehingga dapat digunakan untuk pembuatan lagu. Pembuatan digital audio effects ini berbasis perangkat lunak. Oleh karena itu, agar kegunaannya lebih mudah digunakan pemograman Snack Tcl/tk dan C++.
Hasil dari proyek akhir ini diharapkan dapat bermanfaat untuk memperoleh wawasan yang lebih luas tentang teknologi dunia musik yaitu pembuatan lagu pada personal computer. Sehingga teknologi ini nantinya dapat dikembangkan dan diimplementasikan ke sebuah sistem yang lebih baik. 1.5 METODOLOGI
Untuk menyelesaikan proyek akhir ini, dilakukan langkah-langkah sebagai berikut:
3a) Perancangan Sistem
Perancangan sistem berdasarkan blok diagram pada gambar 3.1. Dengan bantuan blok diagram tersebut diharapkan mempermudah perancangan perangkat lunaknya.
b) Perancangan Perangkat Lunak Pembuatan komposer ini dilakukan dengan mensintesa nilai frekuensi dari not-not dasar yang telah dibangkitkan dan kemudian dibuat lagu dalam bentuk .wav. Penambahan efek digunakan untuk memberi variasi pada lagunya.. Bahasa pemrograman yang digunakan adalah snack tcl/tk dan C++.
c) Pembuatan dan Pengujian Perangkat Lunak Dari hasil perancangan sistem dan perancangan perangkat lunak, akan diwujudkan suatu perangkat lunak berdasarkan perencanaan tersebut. Dalam hal ini akan dilakukan pengujian masing-masing bagian dari sistem sebelum diintegrasikan dalam suatu perangkat lunak.
d) Eksperimen dan Analisa Sistem Sistem yang telah terbangun akan diuji unjuk kerjanya. Menguji semua not-not dasar berikut performa masing-masing untuk kemudian diperbaiki dan disempurnakan. Sehingga dapat ditampilkan lagu dengan penambahan efek antara lain echo, reverb dan chorus.
1.6 SISTEMATIKA PEMBAHASAN Buku laporan proyek akhir ini terdiri dari 5 (lima) bab, dimana
masing-masing bab mempunyai kaitan satu sama lain, yaitu: BAB 1 : Memberikan latar belakang tentang permasalahan,
tujuan, masalah dan batasan masalah yang dibahas dalam proyek akhir ini.
BAB 2 : Memberikan dasar teori untuk menunjang penyelesaian masalah dalam proyek akhir ini. Teori dasar yang diberikan meliputi : pemrograman Snack-Tcl/tk dan C++, nilai frekuensi suara musik, pengenalan not musik dan efek audio digital antara lain echo, reverb dan chorus.
4 BAB 3 : Melakukan perencanaan dari blok diagram yang telah
dibuat. Selanjutnya dilakukan pembuatan perangkat lunak untuk pembuatan lagu.
BAB 4 : Melakukan pengujian terhadap perangkat lunak yang telah dibuat sekaligus akan dilakukan analisa pada pembuatan sebuah lagu dengan penambahan efek.
BAB 5 : Memberi kesimpulan tentang hasil yang telah diperoleh dan saran yang selayaknya dilakukan bila proyek akhir ini dilanjutkan.
B A B II TEORI DASAR
2.1 U M U M
Pada bab ini akan diberikan teori dasar yang melandasi permasalahan dan penyelesaiannya yang diangkat dalam proyek akhir ini. Teori dasar yang diberikan meliputi: pemrograman Snack-Tcl/tk, pemrograman C++, frekuensi suara musik, pengenalan not musik dan efek audio digital. Selanjutnya akan dibahas secara detail dalam bab ini.
2.2 SNACK Tcl/Tk 2.2.1 Snack 2.2
Snack adalah tool pengolahan suara yang didesain sebagai ekstensi untuk bahasa script. Saat ini Snack bekerja dengan bahasa script Tcl/Tk, Phyton dan Ruby. Snack memiliki perintah-perintah untuk play, record, process dan memvisualisasi suara. Snack menyediakan obyek suara tingkat tinggi, dengan manajemen penyimpanan yang fleksibel dan streaming support. Snack dapat bekerja pada banyak format file suara. Dengan software yang merupakan hasil integrasi dari Tcl/Tk dan Snack, maka dapat diberikan beberapa dasar-dasar dari program tersebut [4].
. 2.2.2 Tcl/Tk 8.3.0
Tcl adalah bahasa perintah berbasis string. Bahasa tersebut memiliki beberapa konstruksi dasar dan relatif sedikit sintaks, yang membuatnya mudah dipelajari. Tcl didesain untuk melekatkan blok-blok program assembly pada aplikasi. Tcl akan diinterpretasikan saat aplikasi berjalan. Interpreter membuatnya mudah untuk membangun dan memperbaiki aplikasi kita dalam bentuk yang interaktif. Mekanisme dasar adalah semuanya berhubungan dengan string dan pergantian string, sehingga sangat mudah untuk ditampilkan apa yang sedang dilakukan oleh interpreter. Tcl singkatan dari Tool Command Language. Sebuah perintah yang mengerjakan sesuatu, seperti mengeluarkan string, menghitung ekspresi matematika, atau menampilkan widget pada layar. Tk adalah Graphical Toolkit extension dari Tcl, menyediakan bermacam-macam item standar antarmuka GUI untuk memfasilitasi secara cepat, pengembangan aplikasi tingkat tinggi [4].
Berikut beberapa program dasar yang nantinya diaplikasikan dalam proyek akhir ini, diantaranya:
5
6 2.2.3 Perintah Dasar Tcl / Tk dan Snack A. Bekerja dengan menggunakan wish interpreter
Untuk bekerja dengan menggunakan Tcl console, maka jalankan interpreter wish. Wish singkatan dari “Windows Shell”. Ini adalah sebuah interpreter Tcl dimana Tk sekaligus termasuk di dalamnya, sehingga wish bisa memahami perintah Tcl dan Tk. Untuk menggunakan wish interpreter, maka bukalah Start – Program – Tcl – Wish. Kemudian akan muncul tampilan gambar dibawah ini :
Gambar 2.1 Wish Interpreter
Pada saat wish interpreter dijalankan, maka tampil dua window.
Satu window adalah Console, dimana kita dapat mengetikkan perintah setelah prompt %. Window yang lain adalah sebuah “toplevel” window, dimana beberapa elemen grafik dari perintah tcl/tk seperti button, listbox dll akan terlihat. Toplevel menunjukkan berbagai macam widget Tk untuk membangun GUI (Graphical User Interface), sebagai hasil pengetikan script tcl/tk pada Console [4].
B. Syntax
Tcl/Tk adalah sebuah bahasa pemrograman berorientasi text. Tcl/Tk memperlakukan semua perintah dan argument sebagai text. Untuk menulis sebuah program Tcl/Tk, kita secara mudah menulis satu perintah setelah satu lainnya. Sebuah perintah bisa berupa perintah Tcl/Tk yang tersedia secara langsung ataupun membuat prosedur tersendiri [4].
72.3 KONSEP DASAR VISUAL C++
Visual C++ menggunakan perangkat pengembangan aplikasi yang menggunakan C++ sebagai bahasa pemrogaman dan dapat digunakan untuk membuat aplikasi berbasis Windows maupun berbasis teks (aplikasi konsol). Perangkat ini menyediakan lingkungan yang dinamakan IDE (Integrated Development Enviroment) yang memungkinkan pemakai membuat, mengkompalisasi, menggabungkan, dan menguji program dengan cepat dan mudah .
Beberapa komponen penting dalam Visual C++ adalah sebagai berikut [5] :
Ekstensi Keterangan .dsp Berkas ini berisi definisi dasar sebuah proyek,
berisi informasi tentang bagaimana aplikasi diciptakan berdasarkan berkas-berkas yang terdapat pada project workspace.
.dsw Berisi informasi tentang isi proyek.
.opt Berisi data tentang pengaturan-pengaturan dalam proyek; misalnya, menyimpan informasi tentang kemungkinan aplikasi bisa di debug atau tidak.
.cpp Berisi kode sumber C++
.h Merupakan berkas judul (header file), yang umumnya berisi definisi kelas atau berisi prototipe fungsi.
.rc Berisi resource Microsoft Windows (ikon, bitmap, dan berbagai kontrol) yang digunakan oleh aplikasi
.ico Berkas ikon untuk aplikasi
.exe Berkas yang dapat dieksekusi secara langsung (executable).
Tabel 1 Sejumlah ekstensi yang dibangkitkan oleh C++ 2.4 FREKUENSI SUARA MUSIK
Equally Tempered Scale (ETS) adalah suatu cara yang tepat untuk menentukan frekuensi musik. Frekuensi untuk not-not tunggal dihitung berdasarkan standart frekuensi yaitu sebesar 440 Hz. Frekuensi dari ETS berhubungan dengan beberapa instrument tertentu, seperti piano .
8 Dengan menggunakan standart frekuensi sebesar 440 Hz, untuk
mencari nilai frekuensi nada-nada yang lain digunakan rumus [6] :
12/2440][ nHzFrequency ×= ..........(2.1)
Dimana : Hz = Frekuensi dari nada 440 = Ketentuan nilai untuk nada dasar A n = langkah (oktaf) dari kunci-kunci yang akan di cari C sampai
B pada tabel 12 = jumlah keseluruhan langkah yang ada tabel untuk mencari
nilai frekuensi
Sebagai contoh untuk mencari nilai frekuensi dari nilai sebelumnya adalah dengan menggunakan nilai dari nilai angka dasar 440 mengurangi nilai langkah pada nilai n sebagai contoh :
Hzf 2290.3942440 12/4 =×= − ...........(2.2)
Tabel dibawah ini merupakan dasar yang digunakan untuk
menuliskan nilai frekuensi dari not musik secara matematis sebagai berikut [7] :
Tabel 2 Nilai dasar frekuensi dari not musik
Note Frekuensi Note Frekuensi C 262 F# 370
C# 277 G 392
D 294 G# 415
D# 311 A 440
E 330 A# 466
F 349 B 495
Berdasarkan rumus diatas, dapat dicari nilai-nilai frekuensi untuk
not-not yang lain diantaranya sebagai berikut :
9
Tabel 3 Tabel Frekuensi Tiap Oktaf dengan Ketentuan Nilai Dasar
NADA AWAL Oktaf 1 Oktaf 2 Oktaf 3 Oktaf 4 Oktaf 5 C 130.8 261.7 523.3 1046.6 2093.2
C# 138.6 277.2 554.4 1108.8 2217.7
D 146.8 293.7 587.4 1174.8 2349.6
D# 155.6 311.2 622.3 1244.6 2489.3
E 164.8 329.7 659.3 1318.6 2637.3
F 174.6 349.2 698.5 1397.0 2794.0
F# 185.0 370.0 740.0 1480.0 2960.1
G 196.0 392.0 784.0 1568.0 3136.0
G# 207.6 415.3 830.6 1661.2 3322.5
A 220.0 440.0 880.0 1760.0 3520.0
A# 233.1 466.2 932.3 1864.6 3729.2
B 246.9 493.9 987.7 1975.5 3951.0
2.5 PENGENALAN NOT MUSIK
Dalam penulisan musik (notasi) dikenal ada dua sistem, yaitu [8]:
2.5.1 Sistem Not Balok Angka Sistem ini menggunakan angka-angka, dengan sebutannya masing-
masing :
1 2 3 4 5 6 7 1 2.5.2 Sistem Not Balok Huruf Sistem not balok ini merupakan perpaduan yang terdiri dari beberapa unsur yang saling mendukung satu sama lainnya dengan sebutan abjad, yaitu :
c d e f g a b c’ Dari kedua sistem tersebut diatas, yang banyak dikenal secara menyeluruh adalah sistem not balok. Oleh karena itu dalam memperlajari cara menulis dan membaca not balok berikut ini, akan dibantu dengan not angka.
10 2.6 EFEK AUDIO DIGITAL
Efek audio banyak digunakan pada pengolahan sinyal audio digital untuk keperluan industri musik. Teknologi ini digunakan untuk menambahkan efek tertentu pada sinyal audio atau modifikasi sinyal audio. Efek audio secara garis besar dibagi menjadi empat, yaitu [9]:
♦ Efek berbasis amplitude sinyal Contoh : volume control, panning (ping-pong), compression, noise gating dan attach delay
♦ Efek berbasis time delay Contoh : echo, reverb dan chorus
♦ Efek distorsi bentuk sinyal Contoh : efek distorsi
♦ Efek berbasis respon frekuensi (filter digital) Contoh : equalizer, pitch shifting
Dalam proyek akhir ini yang dipelajari adalah efek audio berbasis time delay. Efek audio digital adalah efek audio yang didasarkan pada penambahan waktu penundaan pada sinyal masukan. Waktu tunda dirumuskan sebagai berikut:
Waktu tunda (detik) = ukuran sample / frekuensi sampling (Hz)
Berikut akan diuraikan bagaimana efek audio digital dilakukan: 2.6.1 Efek Echo
Efek echo merupakan penambahan dari sinyal masukan dengan sebuah sinyal tertunda dan ini akan menghasilkan echo tunggal. Sinyal tertunda adalah sinyal yang dimainkan beberapa saat setelah sinyal masukan dimainkan. Waktu tunda echo berkisar antara 50 – 70 milidetik.
Gambar 2.2 Blok Diagram echo
Efek echo melibatkan dua operasi dasar yaitu waktu tunda dan
penjumlahan. Atenuasi diberikan pada sinyal tertunda yang menunjukkan level sinyal echo. Secara matematis sinyal echo diperoleh dengan persamaan :
11y(n) = x(n) + ax(n-k) ................(2.3)
dimana x(n) adalah sinyal masukan, a adalah nilai atenuasi, x(n-k) adalah sinyal tertunda, dan y(n) adalah sinyal keluaran [10]. 2.6.2 Reverberation
Reverberation (gema) adalah hasil pemantulan suatu bunyi yang terjadi di dalam suatu ruang. Dalam suatu ruangan terdapat gelombang suara yang langsung mencapai pendengar dan ada juga gelombang suara yang memantul pada dinding, langit-langit ruangan dan lantai sebelum mencapai pendengar, yang kemudian disebut sebagai gelombang terpantul. Peristiwa tersebut ditunjukkan pada gambar dibawah [10]:
Gambar 2.3 Lintasan gelombang bunyi
yang merambat menuju pendengar
Secara matematis sinyal reverb dapat diperoleh dari persamaan berikut : y(n) = x(n) + a1•x(n-d1) +a2•x(n-d2) + a3•x(n-d3) + a4•x(n-d4) .......(2.4)
2.6.3 Chorus
Efek chorus dapat terjadi dengan menjum-lahkan sebuah echo ke sinyal asli dan kemudian merubah nilai delay echo antara maksimum dan minimum. Efek ini dapat diimplementasikan secara matematis dengan menggunakan persamaan :
y[n] = x[n] + x[n-Δ[n]] .............(2.5) dimana : Δ [n] adalah sebuah fungsi diskrit dan delay periodik. Diagram efek ini dapat dilihat pada gambar dibawah [10]:
12
Gambar2.4 Diagram efek Chorus
2.7 ATENUASI
Apabila sebuah sinyal dilewatkan suatu medium sering kali mengalami berbagai perilaku dari medium atau kanal yang dilaluinya. Ada satu mekanisme dimana sinyal yang melewati suatu medium mengalami kelemahan energi yang selanjutnya dikenal sebagai atenuasi (pelemahan atau redaman) sinyal [1].
Gambar 2.5 Pelemahan suatu sinyal
Dalam bentuk operasi matematik sebagai pendekatannya peristiwa
ini dapat diberikan sebagai berikut: h(t) = a*s(t) ...................(2.6)
Dalam hal ini nilai a<1, yang merupakan konstanta pelemahan yang
terjadi. Kejadian ini sering muncul pada sistem transmisi, dan munculnya konstanta pelemahan dihasilkan dari berbagai proses yang kompleks dalam media transmisi [1].
2.8 SINYAL AUDIO Bunyi merambat pada medium udara sebagai gelombang longitudinal. Adanya getaran molekul pada udara menyebabkan perubahan jarak antar molekul udara satu dengan yang lain. Ketika molekul udara semakin berdekatan maka menyebabkan adanya tekanan atau kompresi. Ketika molekul udara semakin berpindah peristiwa ini dikenal sebagai rarefraction. Udara yang telah mengalami rarefraction dan kompresi akan menjangkau gendang telinga, sehingga menyebabkan gendang telinga bergetar dan kita dapat mendengarkan bunyi.
13 Sinyal audio diukur dalam dB ( decibel). Standar decibel digunakan untuk mengukur bunyi sama dengan cara mengukur suara manusia. Misalnya jika kita ingin menguatkan volume audio standart maka level audio telah ditingkatkan sekitar 6 dB. Bagaimanapun, seberapa banyak energi tambahan diperlukan untuk mencapai doubling secara berulang menurut sebagaimana nyaraing suara yang akan dimulai. Sinyal elektrik audio analog berasal dari berbagai standart, tetapi secara khas, mereka merupakan arus searah yang berubah-ubah kekuatannya. Dengan cepat mengubah tegangan tinggi dan rendah pada sinyal audio sesuai dengan rarefaction dan kompresi suara, meskipun tidak harus [1]. 2.8.1 Operasi Sinyal 2.8.1.1 Pergeseran
Pergeseran merupakan satu bentuk operasi dasar pada sebuah sinyal waktu kontinyu dimana komponen-komponen sinyal tersebut dipindahkan posisinya setelah operasi tersebut dijalankan. Seperti kebiasaan kita yang lebih mudah membayangkan sinyal dalam domain waktu, maka operasi-operasi pergeseran bisa berupa sebuah penundaan waktu (delay) [1]. Pergeseran sinyal secara matematis memungkinkan untuk bernilai positif atau negatif. Dalam pergeseran dimana At yang bernilai negatif, maka bentuk sinyal akan mengalami penundaan. Sedangkan suatu bentuk pergeseran dimana At bernilai positif maka hasil akhirnya berupa pengajuan waktu sinyal [1] .
Gambar 2.6 Operasi pergeseran sinyal
14 2.8.1.2 Penjumlahan Proses penjumlahan sinyal seringkali terjadi pada peristiwa transmisi sinyal melalui medium. Sinyal yang dikirimkan oleh pemancar setelah melewati medium tertentu misalnya udara akan mendapat pengaruh kanal, bisa naiknya level tegangan atau menurunnya level tegangan tergantung komponen yang dijumlahkan sehingga pada bagian penerima akan mendapatkan sinyal sebagai hasil jumlahan sinyal asli dari pemancar dengan sinyal yang terdapat pada kanal tersebut [1].
Gambar 2.7 Operasi penjumlahan sinyal
2.8.1.3 Perkalian Perkalian sering dijumpai pada kondisi real. Pada rangkaian mixer, rangkaian produk modulator dan frequency multiplier operasi perkalian merupakan bentuk standar yang sering kali dijumpai. Bentuk blok diagram dari operasi dua sinyal dapat diberikan pada gambar berikut [1].
Gambar 2.8 Operasi perkalian dua sinyal
B A B III PERENCANAAN DAN PEMBUATAN
PERANGKAT LUNAK 3.1 PERENCANAAN SISTEM
Perencanaan sistem pembuatan komposer (lagu) ini digambarkan dengan blok diagram seperti pada gambar 3.1
Gambar 3.1 Blok Diagram Pembuatan Lagu
15
16 Dari blok diagram diatas dapat dijelaskan langkah-langkah dalam
pembuatan lagu. : 1. Menentukan frekuensi nada-nada tunggal dari alat musik piano.
Dengan menggunakan standart frekuensi sebesar 440 Hz dan dengan formulasi yang telah ada.
2. Setelah diketahui frekuensi nada-nada tunggal dari piano tersebut maka frekuensi-frekuensi tersebut diolah dan dibangkitkan dalam suatu formulasi dengan menggunakan pemrograman C++ dan Snack-Tcl/Tk.
3. Nada-nada yang telah dibangkitkan tersebut dapat ditambahkan dengan efek audio digital yaitu echo, reverb dan chorus.
4. Selanjutnya nada-nada akan digabungkan dengan pemrograman C++ dan Snack-Tcl/Tk.
5. Hasil dari penggabungan nada-nada tersebut dihasilkan sebuah lagu. 3.2 PEMBUATAN EKSTENSI
Dibawah ini adalah tuntunan langkah demi langkah untuk pemakai Windows menggunakan MS Visual C++ 6.0.
Gambar 3.2 Blok Diagram Pembuatan Ektensi
173.2.1 Membangun ekstensi Contoh tersebut terdiri dari sebuah Makefile dan script konfigurasi yang dapat digunakan pada semua platform Unix. Dibawah ini adalah tuntunan langkah demi langkah untuk pemakai Windows menggunakan MS Visual C++ 6.0. 1. Buatlah Win32 Dynamic-Link Library project. (File/New...). Beri
nama 'Square' dan klik Ok kemudian Finish. 2. Tambahkan file square.c ke project (Project/Add to project/Files...). 3. Spesifikasi lokasi dari file Snack dan Tcl include.
(Project/Settings..., C/C++ tab, Category: Preprocessor, Additional include directories.) Dengan instalasi default C:\Program Files\Tcl\include\,C:\Program Files\Snack2.0\include\
Gambar 3.3 Spesifikasi lokasi dari file Snack dan Tcl include
4. Spesifikasi stubs (Project/Settings... C/C++ tab, Category: General,
Preprocessor definitions.) USE_SNACK_STUBS, USE_TCL_STUBS, USE_TK_STUBS.
18
Gambar 3.4 Spesifikasi stub
5. Spesifikasi librari dari Snack dan Tcl (Link tab, Category: Input,
Object/library modules) tclstub83.lib tkstub83.lib snackstub20.lib dan lokasinya (Additional library path). C:\Program Files\Tcl\lib\,C:\Program Files\Snack2.0\lib\.
Gambar 3.5 Spesifikasi librari dari Snack dan Tcl
6. Tentukan nama file output dalam bentuk dll menjadi
libsquare.dll. (Category: General, Output file name).
19
Gambar 3.6 Output dalam bentuk dll
7. Buat extensinya. 8. Cobalah extensi menggunakan script diatas. Edit script tersebut
dan tentukan koneksi ke dll dalam load command.
3.3 PENENTUAN FREKUENSI NADA-NADA TUNGGAL Equally Tempered Scale (ETS) adalah suatu cara yang tepat untuk
menentukan frekuensi musik. Frekuensi untuk not-not tunggal dihitung berdasarkan standart frekuensi yaitu sebesar 440 Hz. Frekuensi dari ETS berhubungan dengan beberapa instrument tertentu, seperti piano .
Dengan menggunakan standart frekuensi sebesar 440 Hz, untuk mencari nilai frekuensi nada-nada yang lain digunakan rumus :
12/2440][ nHzFrequency ×= ..........(2.1)
Dimana : Hz = Frekuensi dari nada 440 = Ketentuan nilai untuk nada dasar A n = langkah (oktaf) dari kunci-kunci yang akan di cari C sampai
B pada tabel 12 = jumlah keseluruhan langkah yang ada tabel untuk mencari
nilai frekuensi
Berdasarkan rumus diatas, dapat dicari nilai-nilai frekuensi untuk not-not yang lain diantaranya sebagai berikut :
20
Tabel 3 Tabel Frekuensi Tiap Oktaf
NADA AWAL Oktaf 1 Oktaf 2 Oktaf 3 Oktaf 4 Oktaf 5 C 130.8 261.7 523.3 1046.6 2093.2
C# 138.6 277.2 554.4 1108.8 2217.7
D 146.8 293.7 587.4 1174.8 2349.6
D# 155.6 311.2 622.3 1244.6 2489.3
E 164.8 329.7 659.3 1318.6 2637.3
F 174.6 349.2 698.5 1397.0 2794.0
F# 185.0 370.0 740.0 1480.0 2960.1
G 196.0 392.0 784.0 1568.0 3136.0
G# 207.6 415.3 830.6 1661.2 3322.5
A 220.0 440.0 880.0 1760.0 3520.0
A# 233.1 466.2 932.3 1864.6 3729.2
B 246.9 493.9 987.7 1975.5 3951.0
3.4 PEMBANGKITAN NADA-NADA TUNGGAL 3.4.1 Pembangkitan Nada dengan Pemrograman C++
Pada pemrograman Snack, kita bisa mendefinisikan beberapa obyek perintah baru yang berhubungan dengan Snack sound dan mengubah traknya. Hal ini dapat diwujudkan dengan menggunakan Snack C library.
int A1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=440.0; if(fopen("gabungan2.txt","r")==NULL) gabung=fopen("gabungan2.txt","w"); else gabung=fopen("gabungan2.txt","a"); /* Get the sound structure for this sound. */
21 sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]);
fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } Untuk nada-nada yang lain dibuat dengan menggunakan program
yang sama. Perubahan yang dilakukan hanya pada pemanggilan nama nada dan pada frekuensi yang digunakan oleh nada tersebut. Misalnya, pada program nada A1 di atas kita menggunakan int A1 maka untuk nada yang lain hanya mengganti nama A dengan nama lain, misalmya D. Untuk masing-masing nada menggunakan frekuensi yang berbeda-beda. Oleh karena itu, untuk membedakan suara dari nada-nada tersebut harus mengganti frekuensi dari nada yang digunakan. Selain itu, untuk memanggil nada-nada tersebut juga dilakukan perintah yang berbeda. //Pemanggilan Nada A Snack_AddSubCmd(SNACK_SOUND_CMD,"A1", (Snack_CmdProc *) A1, NULL); //Pemanggilan Nada D Snack_AddSubCmd(SNACK_SOUND_CMD,"D", (Snack_CmdProc *) D, NULL); 3.4.2 Pembangkitan Nada Dengan Tcl/Tk
Software yang dibuat pada Tcl/Tk merupakan script menggunakan ekstensi. File script dapat dibuat dari berbagai editor. Dalam hal ini bisa digunakan editor notepad, wordpad, dsb. Untuk penyimpanan file, pada akhir nama file harus ditambahkan “.tcl”. #/usr/local/bin/wish # 'info sharedlibext' returns .dll on Windows and .so on most Unix systems load square set f [snack::filter generator 440.0 30000 0.0 sine 5000]
22 snack::sound s snack::sound u wm resizable . 0 0 proc Beep {freq} { $::f configure $freq s stop s play -filter $::f } Pemanggilan serta tampilan untuk nada A1 pada Tcl/Tk adalah sebagai berikut : s length 5000 pack [button .b1 -text A1 -height 10 -width 3 -background white -command {s A1;s play}] -side left -pady 10 Sedangkan untuk memanggil nada A1 dari software Visual C++ adalah dengan menggunakan perintah -command {s A1;s play}]. Nama pemanggilan nadanya harus disesuaikan dengan nada yang dituliskan pada Visual C++. Misalnya, pada Visual C++ dituliskan int C maka pemanggilan pada Tcl/Tk juga harus sama yaitu s A1.
3.5 PENAMBAHAN EFEK AUDIO DIGITAL 3.5.1 Efek Echo
Penambahan efek echo dimaksudkan untuk memberikan delay pada sinyal input yakni berupa sinyal suara yang telah dibangkitkan. Pada efek echo, sinyal masukan dijumlahkan dengan sinyal tertunda yang telah dilemahkan kemudian sinyal tertunda yang telah dilemahkan dijumlahkan dengan sinyal masukan untuk kemudian dimasukkan kembali ke blok delay, hal ini dapat dilihat pada blok diagram echo (2.2). Dengan frekuensi sampling sebesar 12000 Hz, delay yang digunakan sebesar 50 ms.
Berdasarkan persamaan (2.3), dapat dibuat suatu program untuk membuat efek echo, yaitu :
// Echo void echo(x,y,w) double *x,*y; int w; { int delay=50; // delay dalam milidetik // frekuensi sampling = 12000 Hz int i; for(i=0;i<w+var_echo*12*delay;++i)
23 { if(i<var_echo*12*delay) y[i]=x[i]; if(i>=var_echo*12*delay) y[i]=x[i]+0.75*x[i-var_echo*12*delay]; if(i>w) y[i]=0.75*x[i-var_echo*12*delay]; } } 3.5.2 Efek Reverb
Penambahan efek reverb dimaksudkan untuk memberikan efek gema dimana sinyal input tersebut akan dipantulkan. Efek reverb sebenarnya adalah hampir sama dengan efek echo hanya saja suara yang dihasilkan terdengar saling bertumpukkan. Dalam implementasi program dilakukan dengan menjumlahkan sinyal asli dengan sinyal multi echo. Dengan frekuensi sampling sebesar 12000 Hz, delay yang digunakan sebesar 50 ms.
Berdasarkan persamaan (2.4), dapat dibuat suatu program untuk membuat efek reverb, yaitu : //Reverb void echo(x,y,w) double *x,*y; int w; { int i; int d=50; // d=delay dalam milidetik , frekuensi sampling = 12000Hz int minDelay = 12*d; //minimum delay, untuk echo1 int delay; double *echo1,*echo2,*echo3,*echo4; echo1 = (double*)calloc(sizeof(double),w+6000); echo2 = (double*)calloc(sizeof(double),w+6000); echo3 = (double*)calloc(sizeof(double),w+6000); echo4 = (double*)calloc(sizeof(double),w+6000); // bikin echo1 delay = minDelay; for(i = 0; i < w+6000;i++){ if( i < delay){ echo1[i] = 0; } else if ( i < w+delay){ echo1[i] = 0.8*x[i-delay]; } else{
24 echo1[i] = 0; } } // bikin echo2 sampai echo4 // tambahkan semua echo dengan data asli for(i = 0; i < w+6000; i++){ y[i] = 0; if( i < w){ y[i] = x[i]; } y[i] = y[i] + echo1[i] + echo2[i] + echo3[i] + echo4[i]; } } 3.5.3 Efek Chorus
Penambahan efek chorus dimaksudkan untuk memberikan suara yang naik turun atau acak, hal ini dapat terjadi dengan menjumlahkan echo ke sinyal asli dan kemudian mengubah nilai delay echo antara maksimum dan minimum. Dengan frekuensi sampling sebesar 12000 Hz, delay yang digunakan sebesar 50 ms.
Berdasarkan persamaan (2.5), dapat dibuat suatu program untuk membuat efek chorus, yaitu :
// Chorus void chorus(x,y,w) double *x,*y; int w; { int i; int d=50; // d=delay dalam milidetik , frekuensi sampling = 12000 Hz FILE *test; test=fopen("test.txt","w"); var_chorus = (((float)rand()/RAND_MAX)*5)+5; fprintf(test,"%d",(int)var_chorus); fclose(test); for(i=0;i<w+(int)var_chorus*12*d;++i) { if(i<(int)var_chorus*12*d) y[i]=x[i]; if(i>=(int)var_chorus*12*d) y[i]=x[i]+x[i-(int)var_chorus*12*d]; if(i>w) y[i]=x[i-(int)var_chorus*12*d]; } }
253.6 PENGGABUNGAN NADA-NADA
Penggabungan pada Visual C++ disimpan dalam bentuk File.txt. Dalam program Visual C++ menggunakan perintah sebagai berikut :
FILE *gabung;
Selain perintah di atas juga terdapat perintah yang lain yaitu : if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a");
Maksud dari program di atas adalah jika nada yang ditekan belum ada maka akan dibuat file baru, tetapi jika nada tersebut sudah ada maka akan disimpan dalam satu file secara berurutan.
Penggabungannya akan dipanggil dalam software Tcl/Tk. Program pada Visual C++ yang akan dipanggil adalah sebagai berikut : int Gabung(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; int jumlahNada = 100; int jumlahSample = 5000; dat.x = (double*)calloc(jumlahSample*jumlahNada,sizeof(double)); gabung=fopen("gabungan2.txt","r"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) fscanf(gabung,"%lf",&dat.x[i]); fclose(gabung); return TCL_OK; }
Setelah proses penggabungan, maka akan dilakukan proses pembacaan. Jika tidak ditambah program Baca maka program gabung tidak akan bisa bekerja. Berikut dibawah ini adalah program untuk membaca gabungan:
26 int Baca(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; Sound *sound; Sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) Snack_SetSample(sound,0, i, 1000*dat.x[i]); return TCL_OK; }
Pemanggilan dua program di atas tergabung dalam satu perintah pada Tcl/Tk. Pemanggilan ini dimaksudkan agar penggabungan nada-nada tunggal tersebut bisa dibaca oleh software Tcl/Tk. 3.6.1 Pemanggilan Gabungan Pada Visual C++
Program Gabung pada Visual C++ nantinya akan dipanggil pada Tcl/Tk. Program yang digunakan juga seperti halnya pemanggilan nada-nada. Programnya adalah sebagai berikut :
u button .agabungan -text Gabung -command {u gabung;u baca;} pack .agabungan -side bottom -pady 5 3.6.2 Penyimpanan Gabungan Nada-Nada dalam Bentuk .wav
Nada-nada yang telah digabungkan akan ditampilkan dalam bentuk .wav. Program untuk menyimpan penggabungan nada-nada tersebut dan menampilkannya sehingga menjadi .wav menggunakan Windows Media Player dibuat pada software Tcl/Tk. Program tersebut adalah sebagai berikut :
u length 60000 button .agabungan -text Gabung -command {u gabung;u baca;u write hasil.wav;u play} pack .agabungan -side bottom -pady 5
Program ini merupakan lanjutan dari program pemanggilan program Gabungan pada Visual C++. Sehingga program tersebut dapat ditulis dalam satu baris.
273.7 PENGEMASAN LAGU 3.7.1 Pembuatan Tampilan
Untuk membuat tampilan pada Proyek Akhir ini menggunakan software Tcl/Tk. Tampilan yang dibuat adalah seperti di bawah ini :
Gambar 3.7 Tampilan Piano
Program yang digunakan untuk membuat tuts-tuts piano tersebut
misalnya adalah sebagai berikut :
pack [button .b1 -text C -height 10 -width 3 -background white -command {s C;s play}] -side left -pady 10
Program di atas adalah program untuk membuat tombol dari nada C. Program tersebut digabung menjadi satu dengan program pemanggil suara nada C pada C++. Beberapa perintah yang digunakan adalah sebagai berikut :
-text C digunakan untuk menuliskan teks pada tombol -height 10 digunakan untuk membuat panjang tombol (vertikal) -width 3 digunakan untuk membuat lebar tombol (horisontal) -background white digunakan untuk warna tombol -side left digunakan untuk posisi tombol yang berurutan ke kiri -pady 10 digunakan untuk membuat jarak antar tombol
Sedangkan untuk membuat tuts-tuts piano yang berwarna hitam dengan mengatur dan menentukan nilai posisinya, misalnya sebagai berikut :
pack [button .b30 -text Cis -height 4 -width 1 -background black -command {s Cis;s play}] -side left -pady 10 place .b30 -relx 0.023 -rely 0.04
28
****Halaman ini Sengaja Dikosongkan****
BAB 4 PENGUJIAN DAN ANALISA
Pada bab ini akan dibahas pengujian dari sistem perangkat lunak dari pembuatan lagu. Pada prinsipnya pengujian ini dilakukan untuk menguji keluaran dari efek audio digital yang telah dibuat.. Dengan demikian akan diketahui tingkat keberhasilan dari sistem yang telah dibuat. Pengujian yang dilakukan meliputi :
• Pengujian dan analisa lagu dengan efek echo • Pengujian dan analisa lagu dengan efek reverb • Pengujian dan analisa lagu dengan efek chorus
Tampilan awal dari perangkat lunak untuk pembuatan lagu
dibangun dengan menggunakan software snack tcl.tk, seperti terlihat pada gambar 4.1 berikut :
Gambar 4.1 Tampilan awal dari piano 4.1 PENGUJIAN LAGU SEBELUM PENAMBAHAN EFEK
Pengujian lagu sebelum penambahan efek dilakukan untuk mengetahui perbedaan antara lagu sebelum penambahan efek dan setelah penambahan efek. Hal ini dapat dibuktikan dengan ouput suara tiap nada dan output suara dari gabungan nada-nadanya. Sehingga hasil dari tiap nada dan gabungan nada (lagu) dapat digambarkan bentuk sinyal dengan menggunakan fasilitas Microsoft Excel. Seperti terlihat pada gambar 4.2 berikut :
29
30
NADA C
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
NADA D
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
NADA E
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
NADA F
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
NADA G
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
31
NADA A
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
NADA B
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
NADA C’
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Gambar 4.2.a Bentuk Sinyal Nada-nada Dasar Tanpa Efek 4.1.1 Pengujian Lagu Ibu Kita Kartini
Untuk pengujian lagu Ibu Kita Kartini hasil penggabungan dari nada-nada tersebut adalah :
-15
-10
-5
0
5
10
15
0 5000 10000 15000 20000 25000 30000 35000
Gambar 4.2.b Sinyal Masukan
32 4.2 PENGUJIAN EFEK ECHO
Untuk melakukan pengujian efek echo digunakan pemrograman snack tcl/tk dan C++ . Pada proyek akhir ini pengujian dilakukan dengan memberikan input berupa nada-nada yang akan menghasilkan sinyal sinus dari rumus pembangkitan nada dengan delay sebesar 50 ms, frekuensi sampling yang digunakan sebesar 12000 Hz.
Hasil yang didapat berupa ouput suara dari tiap nada dan output suara dari gabungan nada-nadanya. Sehingga hasil dari tiap nada dan gabungan nada (lagu) dapat digambarkan bentuk sinyal dengan menggunakan fasilitas Microsoft Excel, seperti terlihat pada gambar 4.3 berikut :
NADA C
-20
-15
-10
-5
0
5
10
15
20
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
NADA D
-20
-15
-10
-50
5
10
15
20
0 1000 2000 3000 4000 5000 6000
Jumlah D at a
NADA D
-20
-10
0
10
20
0 2000 4000 6000
Jumlah Data
Am
plitu
do
NADA F
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah D at a
33NADA G
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
NADA A
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah D at a
NADA B
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
NADA C’
-20
-10
0
10
20
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
Gambar 4.3 Bentuk Sinyal Nada-nada Dasar untuk Efek Echo
Untuk setiap nada yang ditampilkan, jika didengarkan secara
seksama suara yang dihasilkan akan mengalami penundaan atau delay. Dimana suara dari nada-nada yang telah ditekan tadi akan dimainkan beberapa saat setelah suara asli dimainkan. Waktu tunda yang digunakan sebesar 20 ms dan 50 ms. 4.2.1 Pengujian Lagu Ibu Kita Kartini
Pengujian pada lagu ini adalah hasil dari sinyal masukan yang telah diberi echo. Hasil penggabungan dari nada-nada tersebut adalah :
34 a. Untuk waktu tunda sebesar = 20 ms
-20
-10
0
10
20
0 10000 20000 30000 40000
Jumlah Data
Am
plitu
do
Gambar 4.3.a Hasil pengujian waktu tunda efek echo 20 ms
b. Untuk waktu tunda sebesar = 50 ms
-20
-15
-10
-5
0
5
10
15
20
0 5000 10000 15000 20000 25000 30000 35000
J uml a h Da t a
Gambar 4.3.b Hasil pengujian waktu tunda efek echo 50 ms
Dari pengujian yang telah dilakukan untuk lagu Ibu Kita Kartini,
maka dapat dijelaskan bahwa jika input suara nada-nada diberikan kontinyu, sebelum output mengeluarkan delay yang kesekian maka sudah tertumpuk oleh sinyal aslinya. Namun akan terdengar jelas jika dberi input suara yang berupa lagu. Sinyal keluaran efek echo merupakan hasil penjumlahan dari sinyal masukan dengan sinyal tertunda yang mengalami atenuasi. 4.3 PENGUJIAN EFEK REVERB
Untuk melakukan pengujian efek reverb digunakan pemrograman snack tcl/tk dan C++ . Pada proyek akhir ini pengujian dilakukan dengan memberikan input berupa nada-nada yang akan menghasilkan sinyal sinus dari rumus pembangkitan nada dengan delay sebesar 50 ms dan menggunakan frekuensi sampling sebesar 12000 Hz.
35Hasil yang didapat berupa ouput suara dari tiap nada yang ditekan
dan output suara dari gabungan nada-nadanya. Sehingga hasil dari tiap nada dan gabungan nada (lagu) dapat digambarkan bentuk sinyal dengan menggunakan fasilitas Microsoft Excel, seperti terlihat pada gambar 4.4 berikut :
NADA C
-20
-15
-10
-5
0
5
10
15
20
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
NADA D
-40-30
-20-10
010
2030
40
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
NADA E
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Juml ah Dat a
NADA F
-30
-20
-10
0
10
20
30
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
NADA G
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
36
NADA A
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h D a t a
NADA B
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
NADA C’
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h D a t a
Gambar 4.4 Bentuk Sinyal Nada-nada Dasar untuk Efek Reverb 4.3.1 Pengujian untuk Lagu Ibu Kita Kartini
Pengujian pada lagu ini adalah hasil dari sinyal masukan yang telah diberi efek reverb. Hasil penggabungan dari nada-nada tersebut adalah :
a. Untuk waktu tunda sebesar = 20 ms
-30
-20-10
0
1020
30
0 10000 20000 30000 40000
Jumlah Data
Am
plitu
do
Gambar 4.4.a Hasil pengujian waktu tunda efek reverb 20 ms
37b. Untuk waktu tunda sebesar = 50 ms
-40-30-20-10
010203040
0 10000 20000 30000 40000
Jumlah Data
Am
plitu
do
Gambar 4.4.b Hasil pengujian waktu tunda efek reverb 50 ms
Untuk efek reverb, waktu tunda dan nilai atenuasi yang digunakan
bervariasi. Ini dikarenakan output dari efek reverb adalah suara yang menggema atau bersahut-sahutan. Ini dapat dilihat dari contoh pengujian saat lagunya dimainkan. Dengan menambahkan input suara dengan delay sebanyak empat kali dimana untuk delay pertama dikalikan sebesar 10% dari frekuensi samplingnya, 20% untuk delay kedua dan selanjutnya sampai empat kali. Dari bentuk sinyal diatas dapat digambarkan bahwa sinyal akan mengalami kenaikan untuk pertama kali kemudian sinyal akan mengalami kondisi yang kontinyu dan pada akhirnya sinyal akan mengalami penurunan hingga sinyal tersebut habis. Oleh karena itu untuk efek reverb sinyal keluarannya dilakukan dengan menjumlahkan sinyal asli dengan sinyal multi echo. 4.4 PENGUJIAN EFEK CHORUS
Untuk melakukan pengujian efek chorus digunakan pemrograman snack tcl/tk dan C++ . Pada proyek akhir ini pengujian dilakukan dengan memberikan input berupa nada-nada yang akan menghasilkan sinyal sinus dari rumus pembangkitan nada dengan frekuensi sampling yang digunakan sebesar 12000 Hz.
Hasil yang didapat berupa ouput suara dari tiap nada dan output suara dari gabungan nada-nadanya. Sehingga hasil dari tiap nada dan gabungan nada (lagu) dapat digambarkan bentuk sinyal dengan menggunakan fasilitas Microsoft Excel, seperti terlihat pada gambar 4.5 berikut :
38 Nama Nada
Efek chorus Efek Chorus dengan Envelope
Nada C
-30
-20
-10
0
10
20
30
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
Nada D
-25
-20
-15
-10
-5
0
5
10
15
20
25
0 1000 2000 3000 4000 5000 6000
Jumlah Data
Ampl
itudo
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
J uml a h D a t a
Nada
E
-30
-20
-10
0
10
20
30
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah D at a
Nada F
-25-20-15-10-505
1015
2025
0 1000 2000 3000 4000 5000 6000
Jumlah D at a
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah D at a
Nada
G
-30
-20
-10
0
10
20
30
0 1000 2000 3000 4000 5000 6000
J ml a h D a t a -15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah Data
Ampl
itudo
39Nada
A
-30
-20
-10
0
10
20
30
0 1000 2000 3000 4000 5000 6000
J uml a g Da t a
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah Data
Ampl
itudo
Nada B
-30
-20
-10
0
10
20
30
0 1000 2000 3000 4000 5000 6000
J uml a h Da t a
-15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah Data
Ampl
itudo
Nada C’
-30
-20
-10
0
10
20
30
0 1000 2000 3000 4000 5000 6000
J umla h D a t a -15
-10
-5
0
5
10
15
0 1000 2000 3000 4000 5000 6000
Jumlah Data
Ampl
itudo
Gambar 4.5 Bentuk Sinyal Nada-nada Dasar untuk Efek Chorus
4.4.1 Pengujian untuk Lagu Ibu Kita Kartini
Pengujian pada lagu ini adalah hasil dari sinyal masukan yang telah diberi efek chorus. Agar suara yang dihasilkan lebih halus, maka dilakukan proses hamming sehingga sinyal keluarannya adalah sinyal chorus dengan nvelope. Hasil penggabungan dari nada-nada tersebut adalah :
-30
-20
-10
0
10
20
30
0 10000 20000 30000 40000
Jumlah D at a
Gambar 4.5.a Sinyal Keluaran Efek Chorus
40
-15
-10
-5
0
5
10
15
0 10000 20000 30000 40000
Jumlah D at a
Gambar 4.5.b Sinyal keluaran efek chorus dengan Envelope
Secara konsep efek chorus akan menghasilkan sinyal suara yang
berayun-ayun (sinyal sinus atau sinyal segitiga). Sehingga jika didengarkan suaranya akan naik turun dengan waktu tunda yang bervariasi. Efek chorus dapat terjadi dengan menjumlahkan sebuah echo sinyal masukan dan kemudian mengubah nilai delay echo antara maksimum dan minimum.
Dari gambar 4.5.a terlhat gambar sinyal yang telah mengalami efek chorus. Suara yang dihasilkan ketika diberi efek chorus terdengar sangat berisik atau kasar, hal ini dikarenakan delay yang diberikan bervariasi.Untuk memperhalus suara yang dihasilkan maka pada programnya diberi penambahan proses hamming. Proses hamming adalah proses yang digunakan untuk membatasi sinyal yang tidak beraturan. Sehingga setelah dilakukan proses hamming suara yang dihasilkan terdengar lebih halus. Hal ini terlihat pada gambar 4.5.b yaitu sinyal keluaran efek chorus dengan envelope (setelah mengalami proses hamming).
BAB V PENUTUP
5.1 KESIMPULAN
Dari hasil yang didapatkan, dapat diambil kesimpulan bahwa : 1. Berdasarkan uji coba yang dilakukan, hasil dari pembuatan
komposer pada personal computer ini adalah lagu yang ditampilkan dalam bentuk .wav.
2. Penambahan efek audio digital dapat memberikan variasi terhadap lagunya.
3. Efek echo dilakukan dengan menjumlahkan antara sinyal masukan dengan sinyal tertunda.
4. Efek reverb merupakan hasil dari sejumlah pengulangan yang terjadi di sebuah ruangan dalam implementasi program dilakukan dengan menjumlahkan sinyal asli dengan sinyal multi echo.
5. Efek chorus merupakan gabungan sinyal masukan dengan sinyal tertunda dimana nilai tunda bervariasi. Untuk mendapatkan suara yang lebih halus pada efek chorus dapat dilakukan proses hamming.
5.2 SARAN
Dalam proyek akhir ini banyak sekali kekurangan sehingga kami mempertimbangkan beberapa saran-saran agar lebih baik:
1. Pembuatan komposer ini diharapkan dapat diaplikasikan pada alat musik yang lain.
2. Diperlukan adanya pengembangan dari efek-efek yang lain. 3. Tampilan dalam Tcl/Tk sebaiknya dengan menu tampilan yang
lebih beragam.
41
42
****Halaman ini Sengaja Dikosongkan****
DAFTAR PUSTAKA [1] Linda Ratnawati, “Pembuatan 10 Channel Digital Audio
Equalizer dan Digital Audio Effects Berbasis Perangkat Lunak” , Proyek Akhir PENS-ITS. 2004
[2] http://wiryana.pandu.org/artikel/dsp_02/[3] http://en.wikipedia.org/wiki/Composer [4] Bima Sena Bayu Dewantara, “Pelatihan Digital Signal
Processing”, PENS – ITS. 2004 [5] Dwinardani Shinta, “Perangkat Lunak Untuk kompresi Audio
Dengan Differential PCM”, Proyek Akhir PENS-ITS. 2005 [6] http://library.thinkquest.org/18160/frequency.htm [7] Lynn Ashley, “Equally Tempered Scale”,
http://ashley.net/music/notefreq.htm, 2001 [8] Ds. Soewito M, “Teknik Termudah Menulis dan Membaca Not
Balok”, Bogor.1993 [9] Tri Budi Santoso, Hary Octavianto, “Petunjuk Praktikum
Pengolahan Sinyal Digital (Berbasis TMS32C5402)”, PENS-ITS.2005.
[10] Miftahul Huda, Henggar Budiman, Tri Budi Santoso, Linda Ratnawati, Fanny Setiowati, ”Implementasi Equaliser Audio Digital 10 Kanal dan Efek Audio Digital dengan Matlab”, IES PENS – ITS.2004
[11] www.harmony-central.com/Effects/Article/Echo[12] www.harmony-central.com/Effects/Article/Reverb[13] www.harmony-central.com/Effects/Article/Chorus
43
LAMPIRAN
1. TAMPILAN AWAL #!/bin/sh # the next line restarts using wish \ exec wish8.4 "$0" "$@" package require -exact snack 2.2 snack::sound s option add *font {Helvetica 12 bold} pack [frame .a] -side top label .a1 -text "PEMBUATAN KOMPOSER (LAGU) PADA PERSONAL COMPUTER (PC)" -foreground darkgoldenrod pack .a1 -side top -padx 5 label .a2 -text "BERBASIS DIGITAL SIGNAL PROCESSING (DSP)" -foreground darkgoldenrod pack .a2 -side top -after .a1 -padx 5 label .a3 -text "(DENGAN EFEK)" -foreground darkgoldenrod pack .a3 -side top -after .a2 -padx 5 label .a4 -text "Oleh" -foreground darkgoldenrod pack .a4 -side top -after .a3 -padx 5 label .a5 -text "ASIH IRAWATI" -foreground darkgoldenrod pack .a5 -side top -after .a4 -padx 5 label .a6 -text "7203.030.031" -foreground darkgoldenrod pack .a6 -side top -after .a5 -padx 5 label .a7 -text "Jurusan Telekomunikasi" -foreground darkgoldenrod pack .a7 -side top -after .a6 -padx 5 label .a8 -text "Poleteknik Elektronika Negeri Surabaya (PENS)" -foreground darkgoldenrod pack .a8 -side top -after .a7 -padx 5 label .a9 -text "Institut Teknolologi Sepuluh Nopember (ITS)" -foreground darkgoldenrod pack .a9 -side top -after .a8 -padx 5 label .a10 -text "Surabaya 2006" -foreground darkgoldenrod pack .a10 -side top -after .a9 -padx 5 pack [label .l1 -text ""]
45
46 pack [frame .c] label .c1 -text "Silahkan Pilih Efek yang Anda Suka:" -foreground brown -font {Helvetica 18 bold} pack .c1 -side top -padx 5 -expand yes pack [frame .b] button .b.exit -text Exit -command exit button .b.echo2 -text "ECHO" -height 2 -width 15 -background white -foreground brown -font {Helvetica 10 bold} -command {Run echo50.tcl} -state normal button .b.reverb -text "REVERB" -height 2 -width 15 -background white -foreground brown -font {Helvetica 10 bold} -command {Run reverb.tcl} -state normal button .b.chorus -text "CHORUS" -height 2 -width 15 -background white -foreground brown -font {Helvetica 10 bold} -command {Run chorus.tcl} -state normal pack .b.echo2 .b.reverb .b.chorus .b.exit -side left -padx 20 -pady 20 .b.echo2 configure -state normal .b.reverb configure -state normal .b.chorus configure -state normal proc Run {script {demoFlag 0}} { set i [interp create] load {} Tk $i $i eval rename exit dontexit interp alias $i exit {} interp delete $i if {$demoFlag != 0} { $i eval set demoFlag $demoFlag } $i eval wm title . $script $i eval source $script }
47
2. TAMPILAN PIANO #/usr/local/bin/wish # 'info sharedlibext' returns .dll on Windows and .so on most Unix systems load echo50ms//square set f [snack::filter generator 440.0 30000 0.0 sine 5000] snack::sound s snack::sound u wm resizable . 0 0 proc Beep {freq} { $::f configure $freq s stop s play -filter $::f } pack [frame .b] u length 500000 pack [button .bgabungan2 -text Gabung -command {u gabung;u baca;u write hasilecho2.wav;u play}] -side bottom pack [button .bexit -text Exit -command exit] -side bottom -before .bgabungan2
48 s length 5000 pack [button .b1 -text C -height 10 -width 3 -background white -command {s C;s play}] -side left -pady 10 pack [button .b2 -text D -height 10 -width 3 -background white -command {s D;s play}] -side left -pady 10 pack [button .b3 -text E -height 10 -width 3 -background white -command {s E;s play}] -side left -pady 10 pack [button .b4 -text F -height 10 -width 3 -background white -command {s F;s play}] -side left -pady 10 pack [button .b5 -text G -height 10 -width 3 -background white -command {s G;s play}] -side left -pady 10 pack [button .b6 -text A -height 10 -width 3 -background white -command {s A;s play}] -side left -pady 10 pack [button .b7 -text B -height 10 -width 3 -background white -command {s B;s play}] -side left -pady 10 pack [button .b8 -text C' -height 10 -width 3 -background white -command {s C1;s play}] -side left -pady 10 pack [button .b9 -text D' -height 10 -width 3 -background white -command {s D1;s play}] -side left -pady 10 pack [button .b10 -text E' -height 10 -width 3 -background white -command {s E1;s play}] -side left -pady 10 pack [button .b11 -text F' -height 10 -width 3 -background white -command {s F1;s play}] -side left -pady 10 pack [button .b12 -text G' -height 10 -width 3 -background white -command {s G1;s play}] -side left -pady 10 pack [button .b13 -text A' -height 10 -width 3 -background white -command {s A1;s play}] -side left -pady 10 pack [button .b14 -text B' -height 10 -width 3 -background white -command {s B1;s play}] -side left -pady 10 pack [button .b15 -text C'' -height 10 -width 3 -background white -command {s C2;s play}] -side left -pady 10 pack [button .b16 -text D'' -height 10 -width 3 -background white -command {s D2;s play}] -side left -pady 10 pack [button .b17 -text E'' -height 10 -width 3 -background white -command {s E2;s play}] -side left -pady 10 pack [button .b18 -text F'' -height 10 -width 3 -background white -command {s F2;s play}] -side left -pady 10 pack [button .b19 -text G'' -height 10 -width 3 -background white -command {s G2;s play}] -side left -pady 10
49pack [button .b20 -text A'' -height 10 -width 3 -background white -command {s A2;s play}] -side left -pady 10 pack [button .b21 -text B'' -height 10 -width 3 -background white -command {s B2;s play}] -side left -pady 10 pack [button .b22 -text C''' -height 10 -width 3 -background white -command {s C3;s play}] -side left -pady 10 pack [button .b23 -text D''' -height 10 -width 3 -background white -command {s D3;s play}] -side left -pady 10 pack [button .b24 -text E''' -height 10 -width 3 -background white -command {s E3;s play}] -side left -pady 10 pack [button .b25 -text F''' -height 10 -width 3 -background white -command {s F3;s play}] -side left -pady 10 pack [button .b26 -text G''' -height 10 -width 3 -background white -command {s G3;s play}] -side left -pady 10 pack [button .b27 -text A''' -height 10 -width 3 -background white -command {s A3;s play}] -side left -pady 10 pack [button .b28 -text B''' -height 10 -width 3 -background white -command {s B3;s play}] -side left -pady 10 pack [button .b29 -text C'''' -height 10 -width 3 -background white -command {s C4;s play}] -side left -pady 10 pack [button .b52 -text nol -height 10 -width 3 -background grey -command {s Nol;s play}] -side left -pady 10 pack [button .b30 -text Cis -height 4 -width 1 -background black -command {s Cis;s play}] -side left -pady 10 pack [button .b31 -text Dis -height 4 -width 1 -background black -command {s Dis;s play}] -side left -pady 10 pack [button .b32 -text Fis -height 4 -width 1 -background black -command {s Fis;s play}] -side left -pady 10 pack [button .b33 -text Gis -height 4 -width 1 -background black -command {s Gis;s play}] -side left -pady 10 pack [button .b34 -text Ais -height 4 -width 1 -background black -command {s Ais;s play}] -side left -pady 10 pack [button .b35 -text Cis' -height 4 -width 1 -background black -command {s Cis1;s play}] -side left -pady 10 pack [button .b36 -text Dis' -height 4 -width 1 -background black -command {s Dis1;s play}] -side left -pady 10 pack [button .b37 -text Fis' -height 4 -width 1 -background black -command {s Fis1;s play}] -side left -pady 10 pack [button .b38 -text Gis' -height 4 -width 1 -background black -command {s Gis1;s play}] -side left -pady 10
50 pack [button .b39 -text Ais' -height 4 -width 1 -background black -command {s Ais1;s play}] -side left -pady 10 pack [button .b40 -text Cis'' -height 4 -width 1 -background black -command {s Cis2;s play}] -side left -pady 10 pack [button .b41 -text Dis'' -height 4 -width 1 -background black -command {s Dis2;s play}] -side left -pady 10 pack [button .b42 -text Fis'' -height 4 -width 1 -background black -command {s Fis2;s play}] -side left -pady 10 pack [button .b43 -text Gis'' -height 4 -width 1 -background black -command {s Gis2;s play}] -side left -pady 10 pack [button .b44 -text Ais'' -height 4 -width 1 -background black -command {s Ais2;s play}] -side left -pady 10 pack [button .b45 -text Cis''' -height 4 -width 1 -background black -command {s Cis3;s play}] -side left -pady 10 pack [button .b46 -text Dis''' -height 4 -width 1 -background black -command {s Dis3;s play}] -side left -pady 10 pack [button .b47 -text Fis''' -height 4 -width 1 -background black -command {s Fis3;s play}] -side left -pady 10 pack [button .b48 -text Gis''' -height 4 -width 1 -background black -command {s Gis3;s play}] -side left -pady 10 pack [button .b49 -text Ais''' -height 4 -width 1 -background black -command {s Ais3;s play}] -side left -pady 10 pack [button .b50 -text Cis'''' -height 4 -width 1 -background black -command {s Cis4;s play}] -side left -pady 10 #pack [button .b51 -text Play -command [list Beep 130.8 list Beep 138.6 list Beep 146.8 list Beep 155.6 list Beep 164.8]] -side left -pady 10 place .b30 -relx 0.023 -rely 0.04 place .b31 -relx 0.056 -rely 0.04 place .b32 -relx 0.123 -rely 0.04 place .b33 -relx 0.156 -rely 0.04 place .b34 -relx 0.190 -rely 0.04 place .b35 -relx 0.255 -rely 0.04 place .b36 -relx 0.290 -rely 0.04 place .b37 -relx 0.355 -rely 0.04 place .b38 -relx 0.390 -rely 0.04 place .b39 -relx 0.423 -rely 0.04 place .b40 -relx 0.488 -rely 0.04 place .b41 -relx 0.523 -rely 0.04
51place .b42 -relx 0.588 -rely 0.04 place .b43 -relx 0.623 -rely 0.04 place .b44 -relx 0.656 -rely 0.04 place .b45 -relx 0.723 -rely 0.04 place .b46 -relx 0.756 -rely 0.04 place .b47 -relx 0.822 -rely 0.04 place .b48 -relx 0.855 -rely 0.04 place .b49 -relx 0.888 -rely 0.04 place .b50 -relx 0.955 -rely 0.04
Listing Program Pada Visual C++ 1. EFEK ECHO #include "snack.h" #include "math.h" struct data { double x[60000]; }; struct data dat; void echo(double *x, double *y,int w); #define var_echo 1 int C1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=261.7;
52 if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int D1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=293.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; }
53int E1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=329.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int F1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=349.2; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i);
54 echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int G1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=392.0; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int A1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=440.0; if(fopen("gabungan.txt","r")==NULL)
55 gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int B1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000] frek=493.9; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; }
56 int C2(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000]; frek=523.3; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); echo(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int Gabung(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; int jumlahNada = 100; int jumlahSample = 5000; dat.x = (double*)calloc(jumlahSample*jumlahNada,sizeof(double)); gabung=fopen("gabungan2.txt","r"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) fscanf(gabung,"%lf",&dat.x[i]); fclose(gabung); return TCL_OK; }
57int Baca(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; Sound *sound; sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) Snack_SetSample(sound,0, i, 1000*dat.x[i]); return TCL_OK; } /* Initialize the square package and create a new sound command 'square'. The syntax is: sndName square*/ EXPORT(int, Square_Init)(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif /*#ifdef USE_TK_STUBS if (Tk_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif*/ #ifdef USE_SNACK_STUBS if (Snack_InitStubs(interp, "2", 0) == NULL) { return TCL_ERROR; } #endif if (Tcl_PkgProvide(interp, "square", "1.0") != TCL_OK) { return TCL_ERROR; } Snack_AddSubCmd(SNACK_SOUND_CMD, "C1", (Snack_CmdProc *) C1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "D1", (Snack_CmdProc *) D1, NULL);
58 Snack_AddSubCmd(SNACK_SOUND_CMD, "E1", (Snack_CmdProc *) E1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "F1", (Snack_CmdProc *) F1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "G1", (Snack_CmdProc *) G1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "A1", (Snack_CmdProc *) A1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "B1", (Snack_CmdProc *) B1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "C2", (Snack_CmdProc *) C2, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "gabung", (Snack_CmdProc *) Gabung, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "baca", (Snack_CmdProc *) Baca, NULL); return TCL_OK; } // EFEK ECHO void echo(x,y,w) double *x,*y; int w; { int delay=20; // delay dalam milidetik dengan fs=12000 Hz int i; for(i=0;i<w+var_echo*12*delay;++i) { if(i<var_echo*12*delay) y[i]=x[i]; if(i>=var_echo*12*delay) y[i]=x[i]+0.75*x[i-var_echo*12*delay]; if(i>w) y[i]=0.75*x[i-var_echo*12*delay]; } } 2. EFEK REVERB #include "snack.h" #include "math.h" struct data { double *x;
59}; struct data dat; void echo(double *x, double *y,int w); int C1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[50000],y[50000]; frek=261.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int D1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[50000],y[50000]; frek=293.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */
60 sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int E1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[50000],y[50000]; frek=329.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int F1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i;
61 double frek; double x[50000],y[50000]; frek=349.2; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int G1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[50000],y[50000]; frek=392.0; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound));
62 for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int A1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[50000],y[50000]; frek=440.0; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int B1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[50000],y[50000]; frek=493.9; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else
63 gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int C2(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[50000],y[50000]; frek=523.3; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); reverb(x,y,Snack_GetLength(sound)); for (i = 0; i < Snack_GetLength(sound); i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; }
64 int Gabung(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; int jumlahNada = 100; int jumlahSample = 5000; dat.x = (double*)calloc(jumlahSample*jumlahNada,sizeof(double)); gabung=fopen("gabungan2.txt","r"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) fscanf(gabung,"%lf",&dat.x[i]); fclose(gabung); return TCL_OK; } int Baca(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; Sound *sound; sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) Snack_SetSample(sound,0, i, 1000*dat.x[i]); return TCL_OK; } /* Initialize the square package and create a new sound command 'square'. The syntax is: sndName square*/ EXPORT(int, Square_Init)(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif /*#ifdef USE_TK_STUBS if (Tk_InitStubs(interp, "8", 0) == NULL) {
65 return TCL_ERROR; } #endif*/ #ifdef USE_SNACK_STUBS if (Snack_InitStubs(interp, "2", 0) == NULL) { return TCL_ERROR; } #endif if (Tcl_PkgProvide(interp, "square", "1.0") != TCL_OK) { return TCL_ERROR; } Snack_AddSubCmd(SNACK_SOUND_CMD, "C1", (Snack_CmdProc *) C1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "D1", (Snack_CmdProc *) D1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "E1", (Snack_CmdProc *) E1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "F1", (Snack_CmdProc *) F1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "G1", (Snack_CmdProc *) G1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "A1", (Snack_CmdProc *) A1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "B1", (Snack_CmdProc *) B1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "C2", (Snack_CmdProc *) C2, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "gabung", (Snack_CmdProc *) Gabung, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "baca", (Snack_CmdProc *) Baca, NULL); return TCL_OK; } // EFEK REVERB void echo(x,y,w) double *x,*y; int w; { int i; int d=20; // d=delay dalam milidetik, fs=12000 Hz int minDelay = 12*d; //minimum delay, untuk echo1 int delay;
66 double *echo1,*echo2,*echo3,*echo4; echo1 = (double*)calloc(sizeof(double),w+960); echo2 = (double*)calloc(sizeof(double),w+960); echo3 = (double*)calloc(sizeof(double),w+960); echo4 = (double*)calloc(sizeof(double),w+960); // bikin echo1 delay = minDelay; for(i = 0; i < w+960;i++){ if( i < delay){ echo1[i] = 0; } else if ( i < w+delay){ echo1[i] = 0.8*x[i-delay]; } else{ echo1[i] = 0; } } // bikin echo2 delay = minDelay*2; for(i = 0; i < w+960;i++){ if( i < delay){ echo2[i] = 0; } else if ( i < w+delay){ echo2[i] = 0.6*x[i-delay]; } else{ echo2[i] = 0; } } // bikin echo3 delay = minDelay*3; for(i = 0; i < w+960;i++){ if( i < delay){ echo3[i] = 0; } else if ( i < w+delay){ echo3[i] =0.4*x[i-delay]; } else{
67 echo3[i] = 0; } } // bikin echo4 delay = minDelay*4; for(i = 0; i < w+960;i++){ if( i < delay){ echo4[i] = 0; } else if ( i < w+delay){ echo4[i] = 0.2*x[i-delay]; } else{ echo4[i] = 0; } } // tambahkan semua echo dengan data asli for(i = 0; i < w+960; i++){ y[i] = 0; if( i < w){ y[i] = x[i]; } y[i] = y[i] + echo1[i] + echo2[i] + echo3[i] + echo4[i]; } } 3. EFEK CHORUS #include "snack.h" #include "math.h" struct data { double *x; }; struct data dat; void chorus(double *x, double *y,int w); double var_chorus; int C1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i;
68 double frek; double x[60000],y[60000],b; frek=261.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) { b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int D1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000],b; frek=293.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a");
69 /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) { b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int E1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000],b; frek=329.7; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) {
70 b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int F1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000],b; frek=349.2; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) { b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); }
71 fclose(gabung); return TCL_OK; } int G1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000],b; frek=392.0; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) { b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int A1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i;
72 double frek; double x[60000],y[60000],b; frek=440.0; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) { b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int B1(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000],b; frek=493.9; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a");
73 /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) { b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int C2(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; double frek; double x[60000],y[60000],b; frek=523.3; if(fopen("gabungan.txt","r")==NULL) gabung=fopen("gabungan.txt","w"); else gabung=fopen("gabungan.txt","a"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) x[i]=20*sin(2*3.14*frek/32000*i)*cos(2*3.14*frek/32000*i); chorus(x,y,Snack_GetLength(sound)); // Proses Hamming // for (i = 0; i < Snack_GetLength(sound); i++) {
74 b=(double)(0.54-0.46*cos(2.0*3.141592654*(i)/(double)n)); y[i]=b*x[i]; Snack_SetSample(sound,0, i, 1000*y[i]); } for (i = 0; i < Snack_GetLength(sound)+var_chorus; i++) { Snack_SetSample(sound,0, i, 1000*y[i]); fprintf(gabung,"%lf\n",y[i]); } fclose(gabung); return TCL_OK; } int Gabung(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { FILE *gabung; Sound *sound; int i; int jumlahNada = 100; int jumlahSample = 5000; dat.x = (double*)calloc(jumlahSample*jumlahNada,sizeof(double)); gabung=fopen("gabungan4.txt","r"); /* Get the sound structure for this sound. */ sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) fscanf(gabung,"%lf",&dat.x[i]); fclose(gabung); return TCL_OK; } int Baca(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; Sound *sound; sound = Snack_GetSound(interp, Tcl_GetStringFromObj(objv[0], NULL)); for (i = 0; i < Snack_GetLength(sound); i++) Snack_SetSample(sound,0, i, 1000*dat.x[i]); return TCL_OK; }
75/* Initialize the square package and create a new sound command 'square'. The syntax is: sndName square*/ EXPORT(int, Square_Init)(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif /*#ifdef USE_TK_STUBS if (Tk_InitStubs(interp, "8", 0) == NULL) { return TCL_ERROR; } #endif*/ #ifdef USE_SNACK_STUBS if (Snack_InitStubs(interp, "2", 0) == NULL) { return TCL_ERROR; } #endif if (Tcl_PkgProvide(interp, "square", "1.0") != TCL_OK) { return TCL_ERROR; } Snack_AddSubCmd(SNACK_SOUND_CMD, "C1", (Snack_CmdProc *) C1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "D1", (Snack_CmdProc *) D1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "E1", (Snack_CmdProc *) E1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "F1", (Snack_CmdProc *) F1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "G1", (Snack_CmdProc *) G1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "A1", (Snack_CmdProc *) A1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "B1", (Snack_CmdProc *) B1, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "C2", (Snack_CmdProc *) C2, NULL); Snack_AddSubCmd(SNACK_SOUND_CMD, "gabung", (Snack_CmdProc *) Gabung, NULL);
76 Snack_AddSubCmd(SNACK_SOUND_CMD, "baca", (Snack_CmdProc *) Baca, NULL); return TCL_OK; // EFEK CHORUS void chorus(x,y,w) double *x,*y; int w; { int i; int d=250; // d=delay dalam milidetik FILE *test; test=fopen("test.txt","w"); var_chorus = (((float)rand()/RAND_MAX)*5)+5; fprintf(test,"%d",(int)var_chorus); fclose(test); for(i=0;i<w+(int)var_chorus*12*d;++i) { if(i<(int)var_chorus*12*d) y[i]=x[i]; if(i>=(int)var_chorus*12*d) y[i]=x[i]+x[i-(int)var_chorus*12*d]; if(i>w) y[i]=x[i-(int)var_chorus*12*d]; } }
RIWAYAT HIDUP
Penyusun lahir di Surabaya, pada tanggal 28 Maret 1984 sebagai anak kelima dari 5 bersaudara dari seorang ibu bernama Sawini dan ayah bernama Trisno Wibowo. Saat ini bertempat tinggal di Jl. Tambaksari Selatan 7/12 Surabaya 60136.
Riwayat pendidikan formal yang pernah ditempuh:
SD Negeri Tambaksari I Surabaya SMP Negeri 9 Surabaya SMA Negeri 7 Surabaya Polteknik Elektronika Negeri Surabaya - Jurusan
Telekomunikasi, Politeknik Elektronika Negeri Surabaya, Institut Teknologi Sepuluh Nopember Surabaya (ITS).
Pada tanggal 2 Agustus 2005 mengikuti Seminar Proyek Akhir sebagai salah satu persyaratan untuk mendapatkan gelar Ahli Madya (A.Md.) di Politeknik Elektronika Negeri Surabaya, Institut Teknologi Sepuluh Nopember Surabaya (ITS).