Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
#1

Генератор звука нужной частоты - Программирование Android

07.09.2016, 01:42. Просмотров 1322. Ответов 27
Метки нет (Все метки)

Всем привет.
Что то не могу найти на просторах Интернета, как можно воспроизвести звук нужной частоты? Вариант с файлом не подходит, ибо пользователь должен подбирать частоту по его личной благозвучности. Для азбуки Морзе.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2016, 01:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Генератор звука нужной частоты (Программирование Android):

Прочитать данные из нужной БД - Программирование Android
Здравствуйте, у меня возник вопрос по поводу чтения данных из нужной БД. В моем приложении пользователь нажимает в ResyclerView на элемент...

Получение частоты ЦП - Программирование Android
Привет, соседи по планете. Так уж вышло, что необходимо программно получить текущую частоту ЦП. Я уверен, на форуме найдутся...

Подскажите библиотеку для генерации аудиосигнала нужной частоты - Python
Надо задавать частоту, дискретизацию, и тп вид сигнала

Генератор управляемой частоты и скважности - Arduino
Подскажите пожалуйста есть ли у кого пример генератора на ардуино? Нужно чтобы через сириал можно было изменять частоту от 1 до 300 Гц и...

Генерация звука по нужной частоте - Windows Phone
Здравствуйте, как возможно реализовать генерацию звука по нужной частоте для приложений Windows Phone? Условно говоря, есть две кнопки,...

SMH 2G. Генератор синуса низкой частоты - Контроллеры PLC
Стоит задача: сделать генератор синуса низкой частоты (скажем, 0,2Гц) и вывести его график на экран. Что такое генератор я в принципе...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
07.09.2016, 02:03 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Генератор звукового сигнала
2
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 13:35  [ТС] #3
Tester64, Спасибо. Странно, что нет готового метода, типа Beep ( int Hz, int Ms).

Добавлено через 3 часа 36 минут
Странно. Срабатывает 25 раз. На 26 останавливается приложение:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
 
        int count = (int)( sampleRate * 2.0 * (durationMs / 1000.0)) & ~1;
        short[] samples = new short[count];
 
        for(int i = 0; i < count; i += 2){
            short sample = (short)(Math.sin(2 * Math.PI * i / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
 
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
 
        track.write(samples, 0, count);
 
        return track;
    }
Вызываю по кнопке или из потока. Разницы нет, на 26 раз зависает.
Java
1
2
AudioTrack at = generateTone(1000, 100); // freqHz, durationMs
            at.play();
Добавлено через 46 минут
В эмуляторе виснет на 31-36 вызове, а в телефоне стабильно на 26. Причём даже если выйти из активности, не не выходить из приложения и потом вернуться в активность, то счётчик до вылета не сбрасывается.
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,525
07.09.2016, 13:44 #4
gvsp, ну так наверное надо освободить ресурсы
0
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 14:05  [ТС] #5
vxg, А как? track.stop(); не помог. Больше идей нет.
0
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
07.09.2016, 14:10 #6
gvsp, как вариант можно записать в файл и считать из него

Добавлено через 15 секунд
В той же теме есть как это делается
0
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 14:30  [ТС] #7
Цитата Сообщение от REALIST07 Посмотреть сообщение
как вариант можно записать в файл и считать из него
Не хотелось бы. Это будет время и ресурсы занимать. А нужен мгновенный отклик на клавишу.
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,525
07.09.2016, 15:26 #8
Цитата Сообщение от gvsp Посмотреть сообщение
А как?
Java
1
2
3
4
5
6
7
            try {
                track.pause();
            } catch (IllegalStateException e) {
            }
            track.flush();
            track.release();
            track = null;
1
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 15:44  [ТС] #9
vxg, К сожалению так не работает:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
 
        int count = (int)( sampleRate * 2.0 * (durationMs / 1000.0)) & ~1;
        short[] samples = new short[count];
 
        for(int i = 0; i < count; i += 2){
            short sample = (short)(Math.sin(2 * Math.PI * i / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
 
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
 
        track.write(samples, 0, count);
 
        try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
        return track;
}
При наличии строчек track.release(); или track = null; вылетает сразу при попытке воспроизвести звук.
0
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
07.09.2016, 16:09 #10
gvsp, не в обиду братан,но ты программировать вообще умеешь?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
AudioTrack at = generateTone(1000, 100); // freqHz, durationMs
            at.play();
clearMemory(at);
 
void clearMemory(Audiotrack track) {
try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
}
0
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 17:52  [ТС] #11
REALIST07, Да фактически нет, но написал достаточно не маленькое и не простое приложение. А тут вот опять ничего подходящего не нашёл. Думаю опыта немного есть. Из старого проекта тоже всё возьму. А тут такая засада на ровном месте, простой бип на Яве не сделать. Чёй то всё равно не выходит:
Java
1
2
3
4
5
6
// кнопка RF А
    public void onClickRF(View view) {
            AudioTrack at = generateTone(1000, 100); // freqHz, durationMs freq, durationDot
            at.play();
            clearMemory(at);
    }
Так понятно вылетает ибо онклик выполняет всё одновременно. А если без clearMemory(at);
то at красная, а определять его не хочет - подчёркивает красным. Ну и в track = null track серый;
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
        int count = (int)( sampleRate * 2.0 * (durationMs / 1000.0)) & ~1;
        short[] samples = new short[count];
        for(int i = 0; i < count; i += 2){
            short sample = (short)(Math.sin(2 * Math.PI * i / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
        track.write(samples, 0, count);
        return track;
        AudioTrack at = generateTone(1000, 100);
        clearMemory(at);
    }
 
    void clearMemory(AudioTrack track) {
        try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
    }
0
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
07.09.2016, 19:45 #12
gvsp,

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// кнопка RF А
    public void onClickRF(View view) {
            AudioTrack at = generateTone(1000, 100); // freqHz, durationMs freq, durationDot
            at.play();
            clearMemory(at);
    }
 
 
// Генератор звука
    private AudioTrack generateTone(double freqHz, int durationMs)
    {
        int sampleRate = 48000;  // 44100 Hz
        int count = (int)( sampleRate * 2.0 * (durationMs / 1000.0)) & ~1;
        short[] samples = new short[count];
        for(int i = 0; i < count; i += 2){
            short sample = (short)(Math.sin(2 * Math.PI * i / (sampleRate / freqHz)) * 0x7FFF);
            samples[i + 0] = sample;
        }
        AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
                AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
                count * (Short.SIZE / 8), AudioTrack.MODE_STATIC);
        track.write(samples, 0, count);
        return track;
    }
 
 
void clearMemory(AudioTrack track) {
        try {
            track.pause();
        } catch (IllegalStateException e) {
        }
        track.flush();
        track.release();
        track = null;
    }
0
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
07.09.2016, 21:16  [ТС] #13
REALIST07, У меня так и есть. Но в track = null; - track серый. Ну и звук не выводится потому, что все события онклик обрабатываются одновременно. Попробую вынести в поток.
0
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
07.09.2016, 22:14 #14
gvsp, дык

Java
1
2
3
4
5
6
7
public void onClickRF(View view) { 
 
     switch(view.getId()) {
    case R.id.button1 : break;
    case R.id.button2 : break;
}
}
0
gvsp
13 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 71
08.09.2016, 11:46  [ТС] #15
REALIST07, В общем оказалось не так просто. Вот такое, не работает, ибо вторая строчка сразу убивает первую.
Java
1
2
at.play();
clearMemory(at);
Пришлось вынести это дело в потоки и сделать так:
Java
1
2
3
4
5
 AudioTrack at = generateTone(freq, duration); // freqHz, duration
            at.play();
            Thread.sleep(duration); // ждём отработки звука
            clearMemory(at); 
            Thread.sleep(duration); // даём время очистить ресурсы перед выводом следующего звука
Добавлено через 29 минут
Генератор плохо заканчивает звук. Он обрывается со щелчком.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2016, 11:46
Привет! Вот еще темы с ответами:

Определение частоты звука - Matlab
Здравствуйте, очень хочется написать гитарный тюнер, поэтому пока пытаюсь понять математику этого процесса. И пока не очень хорошо...

Определение частоты звука микрофона - C++
Всем привет. Помнится встречал темы на форуме, сейчас чего то не могу найти. Появилась идея сделать программу для распознавания азбуки...

Генерация звука заданной частоты - Visual Basic .NET
Возможно ли на vb.net сгенерировать синусоиду, определенной частоты и выдать на колонки? Формула синусоиды, кажется такая: ...

реализовать смену частоты звука в заданных пределах - Pascal
Само задание: Требуется ввести курсор в область экрана (небольшой круг), расположение которого неизвестно играющему. Передвижение курсора...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.09.2016, 11:46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru