7203030031

86
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

Transcript of 7203030031

Page 1: 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

Page 2: 7203030031

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

Page 3: 7203030031

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

Page 4: 7203030031

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

Page 5: 7203030031

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

Page 6: 7203030031

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

Page 7: 7203030031

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

Page 8: 7203030031

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

Page 9: 7203030031

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

Page 10: 7203030031

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

Page 11: 7203030031

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

Page 12: 7203030031

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:

Page 13: 7203030031

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.

Page 14: 7203030031

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.

Page 15: 7203030031

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

Page 16: 7203030031

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].

Page 17: 7203030031

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 .

Page 18: 7203030031

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 :

Page 19: 7203030031

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.

Page 20: 7203030031

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 :

Page 21: 7203030031

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]:

Page 22: 7203030031

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.

Page 23: 7203030031

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

Page 24: 7203030031

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

Page 25: 7203030031

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

Page 26: 7203030031

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

Page 27: 7203030031

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.

Page 28: 7203030031

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).

Page 29: 7203030031

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 :

Page 30: 7203030031

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. */

Page 31: 7203030031

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]

Page 32: 7203030031

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)

Page 33: 7203030031

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{

Page 34: 7203030031

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]; } }

Page 35: 7203030031

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:

Page 36: 7203030031

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.

Page 37: 7203030031

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

Page 38: 7203030031

28

****Halaman ini Sengaja Dikosongkan****

Page 39: 7203030031

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

Page 40: 7203030031

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

Page 41: 7203030031

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

Page 42: 7203030031

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

Page 43: 7203030031

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 :

Page 44: 7203030031

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.

Page 45: 7203030031

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

Page 46: 7203030031

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

Page 47: 7203030031

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 :

Page 48: 7203030031

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

Page 49: 7203030031

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

Page 50: 7203030031

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).

Page 51: 7203030031

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

Page 52: 7203030031

42

****Halaman ini Sengaja Dikosongkan****

Page 53: 7203030031

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

Page 54: 7203030031

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

Page 55: 7203030031

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 }

Page 56: 7203030031

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

Page 57: 7203030031

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

Page 58: 7203030031

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

Page 59: 7203030031

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

Page 60: 7203030031

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;

Page 61: 7203030031

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; }

Page 62: 7203030031

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);

Page 63: 7203030031

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)

Page 64: 7203030031

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; }

Page 65: 7203030031

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; }

Page 66: 7203030031

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);

Page 67: 7203030031

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;

Page 68: 7203030031

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. */

Page 69: 7203030031

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;

Page 70: 7203030031

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));

Page 71: 7203030031

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

Page 72: 7203030031

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; }

Page 73: 7203030031

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) {

Page 74: 7203030031

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;

Page 75: 7203030031

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{

Page 76: 7203030031

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;

Page 77: 7203030031

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");

Page 78: 7203030031

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++) {

Page 79: 7203030031

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]); }

Page 80: 7203030031

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;

Page 81: 7203030031

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");

Page 82: 7203030031

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++) {

Page 83: 7203030031

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; }

Page 84: 7203030031

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);

Page 85: 7203030031

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]; } }

Page 86: 7203030031

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).