Android में प्रोग्रामेटिकली टोन जनरेट और प्ले करना
यह उदाहरण दर्शाता है कि AudioTrack का उपयोग करके साइन वेव टोन कैसे जनरेट करें और प्ले करें। यह सिंथेसाइजर, गेम साउंड या टेस्टिंग के लिए उपयोगी है।
चरण 1: नया प्रोजेक्ट बनाएं
Android Studio में File → New Project चुनें।
चरण 2: लेआउट फ़ाइल (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<ImageView
android:layout_width="200dp"
android:layout_height="300dp"
android:src="@drawable/ic_music_note_black_24dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Increase the emulator Volume, Listen to the arbitrary tone!"
android:textSize="16sp"
android:textStyle="bold|italic" />
</LinearLayout>
चरण 3: MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends AppCompatActivity {
private final int duration = 10; // सेकंड
private final int sampleRate = 8000;
private final int numSamples = duration * sampleRate;
private final double[] sample = new double[numSamples];
private final byte[] generatedSnd = new byte[2 * numSamples];
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
new Thread(() -> {
genTone();
handler.post(this::playSound);
}).start();
}
void genTone() {
for (int i = 0; i < numSamples; ++i) {
double freqOfTone = 440; // A4 नोट
sample[i] = Math.sin(2 * Math.PI * i / (sampleRate / freqOfTone));
}
int idx = 0;
for (double dVal : sample) {
short val = (short) (dVal * 32767);
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
}
void playSound() {
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
generatedSnd.length,
AudioTrack.MODE_STATIC
);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}
}
चरण 4: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
नोट
यह बेसिक उदाहरण है। प्रोडक्शन में ऑडियो फोकस मैनेजमेंट, एरर हैंडलिंग और रिसोर्स क्लीनअप (audioTrack.release()) जरूर जोड़ें।