Захват и визуализация звука со входа микрофона - PROCESSING
- Войдите на сайт для отправки комментариев
Пт, 03/12/2021 - 18:03
Помогайте развивать ! Предлагайте свои идеи !
код программы
import processing.sound.*; // Это библиотеа проигрыватель звуковых файлов
AudioIn input; //вкл аудивход
Amplitude loudness; //Амплитуда громкости
//-----------------------------------------------------------------------------------
int val; // Данные
int[] values; // хроним значение
float zoom; // зум
//НАСТРОЙКА ЦЕНТРАЛЬНОЙ ЛИНИИ--------------------------------------------------------
int centrLine =2; //смещение центра по вертикали
//НАСТРОЙКА КРИВОЙ ЛИНИИ-------------------------------------------------------------
int curveLine =-1667; //ВЫВЕСТИ КРИВУЮ В ЦЕНТР
float curveSqueeze =6.0; //сжать-растянуть график кривой
//-----------------------------------------------------------------------------------
void setup()
{
size(1280, 480); // размер основного окна
background(255); // Создайте аудиовход и возьмите 1-й канал
input = new AudioIn(this, 0); // Начните захват аудиовхода
input.start(); // старт (аудио)
loudness = new Amplitude(this); // Подключите вход к анализатору объема
loudness.input(input); // аудиовход
values = new int[width]; //
zoom = curveSqueeze; //скорость графика(сжать-растянуть)
smooth();
}
int getY(int val) {
return (int)(height - val / 1023.0f * (height - curveLine));//ВЫВЕСТИ КРИВУЮ В ЦЕНТР
}
//МИКРОФОН--------------------------------------------------------------------------
void pushValue(int value) {
for (int i=0; i<width-1; i++)
values[i] = values[i+1];
values[width-1] = value;
}
//РИСОВАТЬ КРИВУЮ ЛИНИЮ----------------------------------------------------------------
void drawLines() {
stroke(255);
int displayWidth = (int) (width / zoom);
int k = values.length - displayWidth;
int x0 = 0;
int y0 = getY(values[k]);
for (int i=1; i<displayWidth; i++) {
k++;
int x1 = (int) (i * (width-1) / (displayWidth-1));
int y1 = getY(values[k]);
line(x0, y0, x1, y1);
x0 = x1;
y0 = y1;
}
}
//ЛИНИЯ ПО ЦЕНТРУ--------------------------------------------------------------------
void drawGrid() {
stroke(155, 200, 0); //цвет строки линия по центру
line(0, height/centrLine, width, height/centrLine); //смещение линии
}
//ОСНОВНОЙ КОД-----------------------------------------------------------------------
void draw()
{
float inputLevel = map(mouseY, 0, height, 0.0, 0.0);
input.amp(inputLevel);// Отрегулируйте громкость аудиовхода в зависимости от положения мыши
float volume = loudness.analyze();//volume.analyze () возвращает значение от 0 до 1. Для настройки(сигнал со входа микрофона)
int size = int(map(volume, 0, 0.4, volume, 350)); //масштабирование и отображение эллипса мы масштабируем от 0 до 0,5
background(0); // цвет фона
drawGrid();
val = size; //значение графика(size-вход с микрофона)
if (val != -5) {
pushValue(val);
}
drawLines();
}
Предлагаю сделать нормально, потому что картинка даже близко не напоминает звук.
Предлагаю сделать нормально, потому что картинка даже близко не напоминает звук.
я правильно понимаю Вы имеете ввиду Спектроанализатор или? поясните
Нет, не имею. Имею в виду простую визуализацию звука. На картинке у тебя фарш, а не звук.
добавил регулировку по осям ,и центральной линии в планах добавить яркость центральной линии режим пульс. луча и самое муторное сетку с цифрами если получиться конечно
//PROCESSING------------------------------------------------------------------------- import processing.sound.*; // Это библиотеа проигрыватель звуковых файлов import controlP5.*; // библиотека ControlP5 AudioIn input; // вкл аудивход ControlP5 cp5; // ControlP5 ColorPicker cp; Amplitude loudness; // Амплитуда громкости //----------------------------------------------------------------------------------- int[] values; // хроним значение float zoom; // зум //НАСТРОЙКА ЦЕНТРАЛЬНОЙ ЛИНИИ-------------------------------------------------------- float centrLine =2.0; //смещение центра по вертикали(0-255)(2-centr) int centrR= 0; int centrG= 200; int centrB= 0; //НАСТРОЙКА КРИВОЙ ЛИНИИ------------------------------------------------------------- int curveLine =-1000; //ВЫВЕСТИ КРИВУЮ В ЦЕНТР float curveZoom =1.0; //сжать-растянуть график кривой //НАСТРОЙКИ ЦВЕТА ФОНА (ДЕНЬ-НОЧЬ)==================---------------------------------- int DarkSideA; int DarkSideB; int DarkSideC; void setup() { size(1280, 480); // размер основного окна background(255); // Создайте аудиовход и возьмите 1-й канал cp5 = new ControlP5(this); // включаем слайдеры кнопки... input = new AudioIn(this, 0); // Начните захват аудиовхода input.start(); // старт (аудио) loudness = new Amplitude(this); // Подключите вход к анализатору объема loudness.input(input); // аудиовход values = new int[width]; // //ПЕРЕКЛЮЧАТЕЛЬ-НОЧЬ ДЕНЬ------------------------------------------------------------- cp5.addToggle("DarkSide") .setPosition(10,10) .setSize(50,20) .setValue(true) .setMode(ControlP5.SWITCH) ; //RGB ЛИНИЯ--------------------------------------------------------------------------- smooth(); noStroke(); cp5 = new ControlP5(this); cp = cp5.addColorPicker("picker") .setPosition(1010, 10)//позиция горизонт,вертикаль .setColorValue(color(255, 128, 0, 128)) ; //ЦЕНТРАЛЬНАЯ ЛИНИЯ-------------------------------------------------------------------- cp5.addSlider("Centr") .setRange(1,5) .setValue(128) .setPosition(10,60)//позиция горизонт,вертикаль .setSize(10,400)//щирина,длинна ; //ОСЬ Х-------------------------------------------------------------------------------- cp5.addSlider("axisY") .setRange(-10,-700) .setValue(128) .setPosition(50,60)//позиция горизонт,вертикаль .setSize(10,400)//щирина,длинна ; //ОСЬ Y--------------------------------------------------------------------------------- cp5.addSlider("axisX") .setRange(1,255) .setValue(128) .setPosition(100,10)//позиция горизонт,вертикаль .setSize(800,10)//щирина,длинна ; } int getY(int val) { return (int)(height - val / 1023.0f * (height - curveLine));//ВЫВЕСТИ КРИВУЮ В ЦЕНТР } //МИКРОФОН----------------------------------------------------------------------------- void pushValue(int value) { for (int i=0; i<width-1; i++) values[i] = values[i+1]; values[width-1] = value; } //РИСОВАТЬ КРИВУЮ ЛИНИЮ---------------------------------------------------------------- void drawLines() { stroke(255); int displayWidth = (int) (width / curveZoom); int k = values.length - displayWidth; int x0 = 0; int y0 = getY(values[k]); for (int i=1; i<displayWidth; i++) { k++; int x1 = (int) (i * (width-1) / (displayWidth-1)); int y1 = getY(values[k]); line(x0, y0, x1, y1); x0 = x1; y0 = y1; } } //ЛИНИЯ ПО ЦЕНТРУ-------------------------------------------------------------------- void drawGrid() { stroke(cp.getColorValue()); //цвет строки линия по центру line(0, height/centrLine, width, height/centrLine); //смещение линии } //ОСНОВНОЙ КОД----------------------------------------------------------------------- void draw() { float inputLevel = map(mouseY, 0, height, 0.0, 0.0); input.amp(inputLevel);// Отрегулируйте громкость аудиовхода в зависимости от положения мыши float volume = loudness.analyze();//volume.analyze () возвращает значение от 0 до 1. Для настройки(сигнал со входа микрофона) int size = int(map(volume, 0, 0.4, volume, 350)); //масштабирование и отображение эллипса мы масштабируем от 0 до 0,5 //background(0); // цвет фона background(DarkSideC, DarkSideA, DarkSideB); // цвет фона rgb drawGrid(); if (size != -5) { //значение графика(size-вход с микрофона) pushValue(size); } drawLines(); } void DarkSide (boolean TheDarkSide){ if(TheDarkSide==true){DarkSideA=10;DarkSideB=20;DarkSideC=0;} if(TheDarkSide!=true){DarkSideA=220;DarkSideB=240;DarkSideC=200;} } void Centr (float TheCentr){centrLine= TheCentr; print(TheCentr); } void axisY (int TheAxisY){curveLine= TheAxisY; print(TheAxisY); } void axisX (float TheAxisX){curveZoom= TheAxisX; print(TheAxisX); } //-------------------------------------------------------------------------------------------------------- public void controlEvent(ControlEvent c) { // когда получено изменение значения от ColorPicker, извлечь значения ARGB // из значения массива контроллера if(c.isFrom(cp)) { int r = int(c.getArrayValue(0)); int g = int(c.getArrayValue(1)); int b = int(c.getArrayValue(2)); int a = int(c.getArrayValue(3)); color col = color(r,g,b,a); println("event \talpha:"+a+"\tred:"+r+"\tgreen:"+g+"\tblue:"+b+"\tcol"+col); } } //ПРИНИМАЕМ ЦВЕТ ОТ picker-------------------------------------------------------------------------------- void picker(int col) { println("picker\talpha:"+int(alpha(col))+"\tred:"+int(red(col))+"\tgreen:"+int(green(col))+"\tblue:"+int(blue(col))+"\tcol"+col); } //-------------------------------------------------------------------------------------------------------- void keyPressed() { switch(key) { case('1'): // метод А для изменения цвета cp.setArrayValue(new float[] {120, 0, 120, 255}); break; case('2'): // метод B для изменения цвета cp.setColorValue(color(255, 0, 0, 255)); break; } }//PROCESSING----------------------------------------------------------------------------------------------Добавил регулировку и уровень яркости центральной линии "0"
добавил режим DarkSide
+Неплохая библиотека работы со звуком minim попробую что то сделать на основе
http://code.compartmental.net/minim/