質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

1101閲覧

シークバーで設定した周波数の音を鳴らしたい

ryu-sei

総合スコア12

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/12/23 06:08

編集2020/12/23 06:10

前提・実現したいこと

android studioを使って、シークバーの値によって周波数、継続時間を調節した後、startボタンを押した瞬間に音が鳴るようにしたいです。

発生している問題・エラーメッセージ

エラーははいてないのですがstartボタンを押したときにタップ音のような音が数回鳴るだけでうまく音が鳴ってくれません。
また警告として39行目に'constructor AudioTrack(Int, Int, Int, Int, Int, Int)' is deprecated. Deprecated in Java とでます。

該当のソースコード

kotlin

1package com.example.speaker 2 3 4import android.app.Activity 5import android.media.AudioFormat 6import android.media.AudioManager 7import android.media.AudioTrack 8import android.os.Bundle 9import android.view.Menu 10import android.view.View 11import android.widget.SeekBar 12import kotlinx.android.synthetic.main.activity_main.* 13import kotlin.String 14import java.util.* 15import kotlin.math.ceil 16import kotlin.math.sin 17 18 19class DigitalSoundGenerator( 20 21 private val sampleRate: Int, bufferSize: Int) { 22 val audioTrack: AudioTrack 23 private val bufferSize: Int 24 25 fun getSound(frequency: Double, soundLength: Double): ByteArray { 26 val buffer = ByteArray(ceil(bufferSize * soundLength).toInt()) 27 for (i in buffer.indices) { 28 var wave = i / (sampleRate / frequency) * (Math.PI * 2) 29 wave = sin(wave) 30 buffer[i] = (if (wave > 0.0) Byte.MAX_VALUE else Byte.MIN_VALUE) 31 } 32 return buffer 33 } 34 35 init { 36 val sampleRate = 44100 37 this.bufferSize = bufferSize 38 39 audioTrack = AudioTrack( 40 AudioManager.STREAM_MUSIC, 41 sampleRate, // サンプルレート 42 AudioFormat.CHANNEL_OUT_MONO, 43 AudioFormat.ENCODING_DEFAULT, 44 bufferSize, 45 AudioTrack.MODE_STREAM) 46 } 47} 48 49class SoundDto( 50 var sound: ByteArray, 51 var length: Double) { 52 init { 53 length = length 54 } 55} 56 57 58class MainActivity : Activity(), Runnable { 59 60 private var soundGenerator: DigitalSoundGenerator? = null 61 private var audioTrack: AudioTrack? = null 62 private val soundList: MutableList<SoundDto> = ArrayList() 63 private fun initScoreData() { 64 soundList.add(SoundDto(generateSound(soundGenerator, FREQ, HALF_NOTE), HALF_NOTE)) 65 66 } 67 68 override fun onCreate(savedInstanceState: Bundle?) { 69 super.onCreate(savedInstanceState) 70 setContentView(R.layout.activity_main) 71 setupSeekBart() 72 setupSeekBarh() 73 soundGenerator = DigitalSoundGenerator(44100, 44100) 74 audioTrack = soundGenerator!!.audioTrack 75 findViewById<View>(R.id.start).setOnClickListener(object : View.OnClickListener { 76 override fun onClick(v: View?) { 77 val th = Thread(this@MainActivity) 78 th.start() 79 } 80 }) 81 82 initScoreData() 83 } 84 85 private fun setupSeekBart() 86 { 87 seekbartime.progress = 0 88 seekbartime.max = 1000 89 seekbartime.setOnSeekBarChangeListener( 90 object : SeekBar.OnSeekBarChangeListener { 91 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 92 val strt = String.format(Locale.US, "%d", progress) 93 timedown.setText(strt) 94 gTime = strt.toDouble() 95 } 96 override fun onStartTrackingTouch(seekBar: SeekBar) { 97 } 98 override fun onStopTrackingTouch(seekBar: SeekBar) { 99 } 100 }) 101 } 102 103 private fun setupSeekBarh() 104 { 105 seekbarhz.progress = 0 106 seekbarhz.max = 10000 107 seekbarhz.setOnSeekBarChangeListener( 108 object : SeekBar.OnSeekBarChangeListener { 109 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 110 val strh = String.format(Locale.US, "%d", progress) 111 hzdown.setText(strh) 112 gHz = strh.toDouble() 113 } 114 override fun onStartTrackingTouch(seekBar: SeekBar) { 115 } 116 override fun onStopTrackingTouch(seekBar: SeekBar) { 117 } 118 }) 119 } 120 121 override fun onDestroy() { 122 super.onDestroy() 123 if (audioTrack!!.playState == AudioTrack.PLAYSTATE_PLAYING) { 124 audioTrack!!.stop() 125 audioTrack!!.release() 126 } 127 } 128 129 override fun onCreateOptionsMenu(menu: Menu?): Boolean { 130 menuInflater.inflate(R.menu.option, menu) 131 return true 132 } 133 fun generateSound(gen: DigitalSoundGenerator?, freq: Double, length: Double): ByteArray { 134 return gen!!.getSound(freq, length) 135 } 136 137 override fun run() { 138 if (audioTrack!!.playState == AudioTrack.PLAYSTATE_PLAYING) { 139 audioTrack!!.stop() 140 audioTrack!!.reloadStaticData() 141 } 142 audioTrack!!.play() 143 for (dto in soundList) { 144 audioTrack!!.write(dto.sound, 0, dto.sound.size) 145 } 146 audioTrack!!.stop() 147 } 148 149 companion object { 150 private var gTime: Double = 1.0 151 var HALF_NOTE = gTime 152 private var gHz: Double = 1.0 153 var FREQ = gHz 154 } 155}

試したこと

音の鳴らし方はhttps://dev.classmethod.jp/articles/andoid_sound_generator_xmas/を参考にさせていただきました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問