|
Metode dan Algoritma | Membuat Piano Virtual di Android dengan Nada Frekuensi . Anda bisa melakukan konsultasi tentang Membuat Piano Virtual di Android dengan Nada Frekuensi melalui form di samping kanan !!!
Kode program ini penulis temukan di GitHub. Cukup menarik, karena mampu membuat Aplikasi Android yang Mampu Mengeluarkan Suara dengan Frekuensi alias tanpa file suara (tanpa mp3, ogg, midi, atau apalah itu).
Nah aplikasi ini supaya cukup bermanfaat kita buat dalam bentuk Aplikasi Piano. Frekuensi dalam piano ini sudah diset sesuai dengan frekuensi tuts-tuts atau kunci-kunci tangga nadanya.
Pertama buat peroject Android baru di Eclipse.
Pada MainActivity.java tambahkan kode program berikut :
package com.amijaya.androidpiano;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.widget.Button;
// http://cariprogram.blogspot.com
// nuramijaya@gmail.com
public class MainActivity extends Activity implements OnClickListener {
private static final int duration = 1;
private static final int sampleRate = 8000;
private static final int numSamples = duration * sampleRate;
// http://en.wikipedia.org/wiki/Piano_key_frequencies
private final double cNote = 261.626;
private final double dFlatNote = 277.183;
private final double dNote = 293.665;
private final double eFlatNote = 311.127;
private final double eNote = 329.628;
private final double fNote = 349.228;
private final double gFlatNote = 369.994;
private final double gNote = 391.995;
private final double aFlatNote = 415.305;
private final double aNote = 440.000;
private final double bFlatNote = 466.164;
private final double bNote = 493.883;
private final double c2Note = 523.251;
private Button buttonC;
private Button buttonDflat;
private Button buttonD;
private Button buttonEflat;
private Button buttonE;
private Button buttonF;
private Button buttonGflat;
private Button buttonG;
private Button buttonAflat;
private Button buttonA;
private Button buttonBflat;
private Button buttonB;
private Button buttonC2;
private byte[] generateSound(double frequency) {
double[] soundSample = new double[numSamples];
for (int i = 0; i < numSamples; i++) {
soundSample[i] = Math.sin(2 * Math.PI * i / (sampleRate/frequency));
}
byte[] sound = new byte[2 * numSamples];
int idx = 0;
for (double dVal: soundSample) {
short val = (short) (dVal * 32767);
sound[idx++] = (byte) (val & 0x00ff);
sound[idx++] = (byte) ((val & 0xff00) >>> 8);
}
return sound;
}
private void playSound(byte[] sound) {
final byte[] play = sound;
//Concurrency for music playing
(new Thread(new Runnable() {
public void run() {
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_DEFAULT, AudioFormat.ENCODING_PCM_16BIT, numSamples, AudioTrack.MODE_STATIC);
audioTrack.write(play, 0, numSamples);
audioTrack.play();
}
})).start();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
buttonC = (Button) findViewById(R.id.buttonC);
buttonDflat = (Button) findViewById(R.id.buttonDflat);
buttonD = (Button) findViewById(R.id.buttonD);
buttonEflat = (Button) findViewById(R.id.buttonEflat);
buttonE = (Button) findViewById(R.id.buttonE);
buttonF = (Button) findViewById(R.id.buttonF);
buttonGflat = (Button) findViewById(R.id.buttonGflat);
buttonG = (Button) findViewById(R.id.buttonG);
buttonAflat = (Button) findViewById(R.id.buttonAflat);
buttonA = (Button) findViewById(R.id.buttonA);
buttonBflat = (Button) findViewById(R.id.buttonBflat);
buttonB = (Button) findViewById(R.id.buttonB);
buttonC2 = (Button) findViewById(R.id.buttonC2);
buttonC.setOnClickListener(this);
buttonDflat.setOnClickListener(this);
buttonD.setOnClickListener(this);
buttonEflat.setOnClickListener(this);
buttonE.setOnClickListener(this);
buttonF.setOnClickListener(this);
buttonGflat.setOnClickListener(this);
buttonG.setOnClickListener(this);
buttonAflat.setOnClickListener(this);
buttonA.setOnClickListener(this);
buttonBflat.setOnClickListener(this);
buttonB.setOnClickListener(this);
buttonC2.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onClick(View v) {
//TODO need create a object method that changes the pitch
if (v == buttonC) {
playSound(generateSound(cNote));
}
if (v == buttonDflat) {
playSound(generateSound(dNote));
}
if (v == buttonD) {
playSound(generateSound(dFlatNote));
}
if (v == buttonEflat) {
playSound(generateSound(eFlatNote));
}
if (v == buttonE) {
playSound(generateSound(eNote));
}
if (v == buttonF) {
playSound(generateSound(fNote));
}
if (v == buttonGflat) {
playSound(generateSound(gFlatNote));
}
if (v == buttonG) {
playSound(generateSound(gNote));
}
if (v == buttonAflat) {
playSound(generateSound(aFlatNote));
}
if (v == buttonA) {
playSound(generateSound(aNote));
}
if (v == buttonBflat) {
playSound(generateSound(bFlatNote));
}
if (v == buttonB) {
playSound(generateSound(bNote));
}
if (v == buttonC2) {
playSound(generateSound(c2Note));
}
}
}
Pada layout tampilan main.xml buat beberapa buah tombol seperti ini :
<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:id="@+id/ScrollView01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button android:text="C" android:id="@+id/buttonC" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="D flat" android:id="@+id/buttonDflat" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="D" android:id="@+id/buttonD" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="E flat" android:id="@+id/buttonEflat" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="E" android:id="@+id/buttonE" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="F" android:id="@+id/buttonF" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="G flat" android:id="@+id/buttonGflat" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="G" android:id="@+id/buttonG" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="A flat" android:id="@+id/buttonAflat" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="A" android:id="@+id/buttonA" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="B flat" android:id="@+id/buttonBflat" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="B" android:id="@+id/buttonB" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="C 2" android:id="@+id/buttonC2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
</ScrollView>
Sedangkan untuk AndroidManifest.xml tidak ada perubahan, tidak ada permission yang harus ditambahkan :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amijaya.androidpiano"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
Hasilnya :
Project selengkapnya silakan download disini. Jika mengalami kesulitan dalam mendownload caranya seperti ini.
Semoga bermanfaat :)
ActionScript AS3 ASP.NET AJAX C / C++ C# Clipper COBOL ColdFusion DataFlex Delphi Emacs Lisp Fortran FoxPro Java J2ME JavaScript JScript Lingo MATLAB Perl PHP PostScript Python SQL VBScript Visual Basic 6.0 Visual Basic .NET Flash MySQL Oracle Android
Related Post :
Judul: Membuat Piano Virtual di Android dengan Nada Frekuensi
Rating: 100% based on 99998 ratings. 5 user reviews.
Ditulis Oleh hank2
Rating: 100% based on 99998 ratings. 5 user reviews.
Ditulis Oleh hank2
Anda sedang membaca artikel tentang
Membuat Piano Virtual di Android dengan Nada Frekuensi, Semoga artikel tentang Membuat Piano Virtual di Android dengan Nada Frekuensi ini sangat bermanfaat bagi teman-teman semua, jangan lupa untuk mengunjungi lagi melalui link
Membuat Piano Virtual di Android dengan Nada Frekuensi.
{ 0 komentar... Views All / Send Comment! }
Posting Komentar