Захват и визуализация звука со входа микрофона - PROCESSING

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

Помогайте развивать ! Предлагайте свои идеи !

код программы

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();
 
}                                                  

 

rkit
Offline
Зарегистрирован: 23.11.2016

Предлагаю сделать нормально, потому что картинка даже близко не напоминает звук.

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

rkit пишет:

Предлагаю сделать нормально, потому что картинка даже близко не напоминает звук.

я правильно понимаю Вы имеете ввиду Спектроанализатор или? поясните

rkit
Offline
Зарегистрирован: 23.11.2016

Нет, не имею. Имею в виду простую визуализацию звука. На картинке у тебя фарш, а не звук.

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

добавил регулировку по осям ,и центральной линии в планах добавить яркость центральной линии режим пульс. луча и самое  муторное сетку с цифрами если получиться конечно 


//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----------------------------------------------------------------------------------------------
georgy36arduino
Offline
Зарегистрирован: 27.11.2021

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

Добавил регулировку и уровень яркости центральной линии "0"

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

добавил режим DarkSide 

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

+Неплохая библиотека работы со звуком minim попробую что то сделать на основе

 http://code.compartmental.net/minim/