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

Генератор звукового сигнала - Android

Восстановить пароль Регистрация
Другие темы раздела
Android Задать таймаут перед разрывом блютуз соединения http://www.cyberforum.ru/android-dev/thread1792492.html
Привет! Товарищи, подскажите как реализовать возможность разрывать bluetooth соединение между двумя девайсами после определенного времени. К примеру два девайся оказались на недопустимом расстоянии для сохранения подключения. Или по каким-то причинам сигнал оборвался а потом может восстановиться но соединение уже разорвано. Как установить таймаут перед разрывом? Спасибо. Добавлено через 3...
Android Клавиатура. Как можно упростить использование? Появилось несколько вопросов по клавиатуре. 1) Можно ли сделать программное нажатие кнопки на клавиатуре? А именно микрофон (распознавание речи) То есть чтобы например по клику в edittext сразу открывалась клавиатура и начиналось распознавание речи. 2) если то что описано в вопросе №1 не реально, то можно ли сделать в программе как бы "клавиатуру" что при нажатии на edittext открывается... http://www.cyberforum.ru/android-dev/thread1792471.html
Android SQlite + курсор + ориентация
Всем добрый вечер. Хотя не совсем добрый (для меня). Уже два часа безрезультатно пытаюсь решить проблему. Если в двух словах: вылетает прога, когда я меняю ориентацию экрана. Весь код скидывать думаю не надо, потому что ошибка где-то тут: @Override
Тестирование отображения UI Android
Здравствуйте, интересует есть ли какой ресурс для быстрого тестирования UI Android-приложений, ибо у меня на разных экранах Views по разному отображаются.
Android Проигрывание двух звуков по порядку http://www.cyberforum.ru/android-dev/thread1792293.html
В приложении в MediaPlayer загружаю два звука, но они проигрываются одновременно. Как сделать так, чтобы второй звук проигрывался только после первого?
Android Анимация следующая за свайпом Имеется 3 элемента RecyclerView: 1 слева(якобы за экраном), 1 в центре(видимый) и 1 справа(тоже за экраном). Требуется сделать так, чтобы при свайпе был эффект скольжения. Например, если свайп справа налево, то видимым становится правый RecyclerView, а центральный уходит влево. Желательно, чтобы элементы следовали за пальцем, как это делает NavigationDrawer. Заранее большое спасибо. подробнее

Показать сообщение отдельно
vxg
Модератор
 Аватар для vxg
2662 / 1673 / 157
Регистрация: 13.01.2012
Сообщений: 6,229
25.11.2016, 13:27     Генератор звукового сигнала
КАВ, пример в архиве.
-при нажатии на start создается поток в котором начинает воспроизводится звук (синус)
-продолжительность звука 201 мс
-частота 250 Гц
-после окончания звука сразу же начинается следующий звук
-за генерацию блока данных отвечает функция generate, за коррекцию фазы - функция getNextP
-следующий звук имеет частоту больше частоты предыдущего звука на 2 Гц (если вы закомментируете строку f += 2 звук будет иметь постоянную частоту 250 Гц)
-продолжительность звука специально выбрана равной 201 мс для того что бы на этом интервале размещалось нецелое количество периодов звуковой волны начальной частоты (250 Гц, период волны 1 / 250 = 4 мс) и стыковка соседних звуков проходила не при начальных условиях (если вы закомментируете строку p = getNextP(f, p) для того что бы коррекция фазы нового звука не производилась вы услышите щелчки - это артефакты стыковки звуков со скачком амплитуды)
-если поменять продолжительность звука на 200 мс, то звук постоянной частоты 250 Гц не будет содержать щелчков даже без коррекции фазы так как на интервале 200 мс размещается целое количество периодов звуковой волны и стыковка звуков проходит при начальных условиях
-если вы увеличите ступень на которую меняется частота (вместо 2 Гц поставите большее значение, например, 5 или 10 Гц) вы услышите звук напоминающий уу-уу-уу - я думаю это не артефакт стыковки - это так наше ухо воспринимает существенные изменения частоты
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.example.soundtest;
 
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class MainActivity extends Activity {
    private static Thread thread;
    
    private static AudioTrack at;
    
    private static int nSamplesPerSec = 44100;
    private static float dt = 1f / nSamplesPerSec;
    
    private static int nChannels = 1;
    private static int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
    
    private static int bitsPerSample = 16;
    private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
    
    private static int duration = 201;
    private static int nSamplesPerChannel = nSamplesPerSec * duration / 1000;
    private static int nSamples = nSamplesPerChannel * nChannels;
 
    private static float d = nSamplesPerChannel * dt;
    
    private static short[] buffer = new short[nSamples];
 
    private static void generate(float f, float p) {
        for (int i = 0; i < nSamplesPerChannel; i++) {
            buffer[i] = (short)(0x7FFF * Math.sin(2 * Math.PI * (f * dt * i + p)));
        }
    }
    
    private static float getNextP(float f1, float p1) {
        float T = 1 / f1;
        float p2 = p1 + d / T;
        p2 -= (int)p2;
        return p2;
    }
 
    private static void interrupt(Thread thread) {
        if (thread != null) {
            thread.interrupt();
        }
    }
    
    private static void wait(Thread thread) {
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException e) {
            }
        }
    }
 
    private static void start() {
        stop();
        thread = new Thread(new Runnable() {
            public void run() {
                float f = 250;
                float p = 0;
                while (!Thread.currentThread().isInterrupted()) {
                    generate(f, p);
                    if (at != null) {
                        at.write(buffer, 0, nSamples);
                    } else {
                        try {
                            at = new AudioTrack(AudioManager.STREAM_MUSIC, nSamplesPerSec, channelConfig, audioFormat, nSamples * bitsPerSample / 8, AudioTrack.MODE_STREAM);
                        } catch (IllegalArgumentException e) {
                            return;
                        }
                        at.write(buffer, 0, nSamples);
                        try {
                            at.play();
                        } catch (IllegalStateException e) {
                            return;
                        }
                    }
                    p = getNextP(f, p);
                    f += 2;
                }
            }
        });
        thread.start();
    }
    
    private static void stop() {
        interrupt(thread);
        
        if (at != null) {
            try {
                at.pause();
            } catch (IllegalStateException e) {
            }
        }
        
        wait(thread);
        
        if (at != null) {
            at.flush();
            at.release();
            at = null;
        }
    }
    
    private Button startButton;
    private Button stopButton;
    
    private OnClickListener startButtonClick = new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            start();
        }
    };
 
    private OnClickListener stopButtonClick = new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            stop();
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        startButton = (Button)findViewById(R.id.start);
        startButton.setOnClickListener(startButtonClick);
 
        stopButton = (Button)findViewById(R.id.stop);
        stopButton.setOnClickListener(stopButtonClick);
    }
}
Вложения
Тип файла: rar soundtest.rar (1.14 Мб, 3 просмотров)
 
Текущее время: 14:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru