Сравнение уровней сигнала с отправкой тригеров

Dr_mushroom

Member
22 Ноя 2010
330
5
18
Пироговский, МО
Привет, звуканы! Давно на форуме не бывал, рад новому дизайну :))

Есть идея, хочу попросить помощи в осуществлении.

Есть ли возможность сравнивать уровни двух сигналов, и в зависимости от того, какой из них выше, отправлять управляющий сигнал?
 
можно глянуть в код js audio to midi drum trigger,
и переделать его на сравнение левого и правого канала, например...
 
  • Like
Реакции: Dr_mushroom
может есть решение, без изменения кода? Или кто-то, кто смог бы это сделать? Готов даже оплатить такую работу, в разумных пределах :)
 
Если не писать JS и не строить из блоков в каких-нибуль модульниках, то возможный вариант видится мне в виде использования ReaGate (он может отправлять МИДИ-сообщения при открытии/закрытии) в такой конфигурации: синал 1 подается на вход ReaGate, а сигнал 2 управляет его уровнем TRESHOLD (левый вертикальный слайдер). Как в Рипере привязать параметр плагина к уровню аудиосигнала, надеюсь, знаете.
 
  • Like
Реакции: Dr_mushroom
Если не писать JS и не строить из блоков в каких-нибуль модульниках, то возможный вариант видится мне в виде использования ReaGate (он может отправлять МИДИ-сообщения при открытии/закрытии) в такой конфигурации: синал 1 подается на вход ReaGate, а сигнал 2 управляет его уровнем TRESHOLD (левый вертикальный слайдер). Как в Рипере привязать параметр плагина к уровню аудиосигнала, надеюсь, знаете.
Спасибо! Интересная идея. Правильно ли я понял ее? ))

Когда уровень второго сигнала превысит первый первый, гейт подаст миди сигнал, о закрытии гейта. Как привязать параметр плагина знаю, но возникла трудность с точны повторением уровня порога, со входящим сигналом. Не подскажешь, как это сделать?
 

Вложения

  • Screen Shot 2019-08-15 at 22.03.18.png
    Screen Shot 2019-08-15 at 22.03.18.png
    131,4 KB · Просмотры: 307
Dr_mushroom. Ну или наоборот. Когда первый превысит второй - об открытии)

Уровень подгоняй экспериментально. Пропиши на трек или загенери синус, подай его на оба входа и выстрой параметры детектора в Parameter Modulator так, чтобы порог оказался точно на столбике индикатора.

Дополнение: по сути у тебя в процессе участвуют два детектора: самого плагина и параметер-модулятора. Они, по идее, однотипные, но тот, который непосредстсвенно в плагине, имеет больше настроек. Если тебе надо, чтобы они работали 1:1 одинаково, придется поэкспериментировать с ними на динамических сигналах.
 
Последнее редактирование:
  • Like
Реакции: Dr_mushroom
Dr_mushroom. Ну или наоборот. Когда первый превысит второй - об открытии)

Уровень подгоняй экспериментально. Пропиши на трек или загенери синус, подай его на оба входа и выстрой параметры детектора в Parameter Modulator так, чтобы порог оказался точно на столбике индикатора.

Дополнение: по сути у тебя в процессе участвуют два детектора: самого плагина и параметер-модулятора. Они, по идее, однотипные, но тот, который непосредстсвенно в плагине, имеет больше настроек. Если тебе надо, чтобы они работали 1:1 одинаково, придется поэкспериментировать с ними на динамических сигналах.
Ага, спасибо, попробую. Но боюсь с динамичным сигналом не так просто будет прийти к полной линейной зависимости.
 
не так просто будет
а кто сказал, что будет легко?!

А если серьезно, тут еще есть момент "квантованности" изменения параметров плагинов по времени. По-моему вся автоматизация (и от аудио в том числе) работает на довольно инзкой частоте (порядка 100 Гц, мне казалось - могу ошибаться в конкретном значении, но точно не килогерцы). Так что, если нужна прецизионность, то схема, вероятно, не подойдет ((
 
Последнее редактирование:
а кто сказал, что будет легко?!

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

Может еще у кого-то будут идеи?
 
Может еще у кого-то будут идеи?
Плагин принимает входной аудио-сигнал по двум стерео-входам(каналы 0+1 и 2+3).
Строит огибающие по каждой паре(параметры атаки и релиза настраиваются по отдельности, можно объединить).
Сравнивает уровни огибающих и устанавливает Триггер(слайдер 5) в одно из положений:
0 - если уровни равны;
-1 если уровень первой огибающей(0+1) выше;
+1 если уровень второй огибающей(2+3) выше;
PHP:
desc:Volume 0+1 vs 2+3(Trigger) 
/*
Плагин принимает входной аудио-сигнал по двум стерео-входам(каналы 0+1 и 2+3).
Строит огибающие по каждой паре(параметры атаки и релиза настраиваются по отдельности, можно объединить).
Сравнивает уровни огибающих и устанавливает Триггер(слайдер 5) в одно из положений:
0  - если уровни равны;
-1 - если уровень первой огибающей(0+1) выше;
+1 - если уровень второй огибающей(2+3) выше;
*/

slider1:10<0,1000,1>Attack1(ms)
slider2:10<0,1000,1>Release1(ms)
slider3:10<0,1000,1>Attack2(ms)
slider4:10<0,1000,1>Release2(ms)

slider5:0<-1,1,1>Trigger(0+1 vs 2+3)


//-- Inputs --------
in_pin:in 1 L
in_pin:in 1 R
in_pin:in 2 L
in_pin:in 2 R

//-- Outputs -------
out_pin:out1 L
out_pin:out1 R
out_pin:out2 L
out_pin:out2 R

@init   
//************************************************
// -- Env follower -------------------------------
//************************************************
function EnvFollower.SetValues(attack_ms, release_ms, samplerate)
(
  // samplerate can be different from the global srate if need
  // -- ga, gr coeff --
  this.ga = exp(-1/(samplerate*attack_ms/1000));
  this.gr = exp(-1/(samplerate*release_ms/1000)); 
);
//------------------------------
// Env in = input sample
// Env out = output envelope
function EnvFollower.Apply(in)
  instance(ga, gr, out)
(
  in = abs(in); // need abs value
  out < in ? out = in + ga*(out-in) : out = in + gr*(out-in); 
);


@slider
Env_01.EnvFollower.SetValues(slider1, slider2, srate);
Env_23.EnvFollower.SetValues(slider3, slider4, srate);

Trig = slider5;


@block


@sample

//-- Create Envelopes --------
in_01 = (spl0 + spl1)/2;
Env_01.EnvFollower.Apply(in_01);

in_23 = (spl2 + spl3)/2;
Env_23.EnvFollower.Apply(in_23);


//-- Compare Envelopes ------- 
Env_01.EnvFollower.out > Env_23.EnvFollower.out ? (
  slider5 = Trig = -1;
) :
Env_01.EnvFollower.out < Env_23.EnvFollower.out ? (
  slider5 = Trig =  1;
) : (
//Env_01.EnvFollower.out == Env_23.EnvFollower.out ? (
  slider5 = Trig =  0;
);

slider_automate(slider5); // automate Trigger slider

//spl0 = spl1 = slider5; // For test only
 
Последнее редактирование:
Управляюший сигнал должен быть непрерывным? Т.е. при a>b принимать значение 1, а при a<b - 0 ?
Это может быть аудиосигнал?
Да, все именно так! Может быть аудио
[automerge]1566554189[/automerge]
Плагин принимает входной аудио-сигнал по двум стерео-входам(каналы 0+1 и 2+3).
Строит огибающие по каждой паре(параметры атаки и релиза настраиваются по отдельности, можно объединить).
Сравнивает уровни огибающих и устанавливает Триггер(слайдер 5) в одно из положений:
0 - если уровни равны;
-1 если уровень первой огибающей(0+1) выше;
+1 если уровень второй огибающей(2+3) выше;
PHP:
desc:Volume 0+1 vs 2+3(Trigger)
/*
Плагин принимает входной аудио-сигнал по двум стерео-входам(каналы 0+1 и 2+3).
Строит огибающие по каждой паре(параметры атаки и релиза настраиваются по отдельности, можно объединить).
Сравнивает уровни огибающих и устанавливает Триггер(слайдер 5) в одно из положений:
0  - если уровни равны;
-1 - если уровень первой огибающей(0+1) выше;
+1 - если уровень второй огибающей(2+3) выше;
*/

slider1:10<0,1000,1>Attack1(ms)
slider2:10<0,1000,1>Release1(ms)
slider3:10<0,1000,1>Attack2(ms)
slider4:10<0,1000,1>Release2(ms)

slider5:0<-1,1,1>Trigger(0+1 vs 2+3)


//-- Inputs --------
in_pin:in 1 L
in_pin:in 1 R
in_pin:in 2 L
in_pin:in 2 R

//-- Outputs -------
out_pin:out1 L
out_pin:out1 R
out_pin:out2 L
out_pin:out2 R

@init  
//************************************************
// -- Env follower -------------------------------
//************************************************
function EnvFollower.SetValues(attack_ms, release_ms, samplerate)
(
  // samplerate can be different from the global srate if need
  // -- ga, gr coeff --
  this.ga = exp(-1/(samplerate*attack_ms/1000));
  this.gr = exp(-1/(samplerate*release_ms/1000));
);
//------------------------------
// Env in = input sample
// Env out = output envelope
function EnvFollower.Apply(in)
  instance(ga, gr, out)
(
  in = abs(in); // need abs value
  out < in ? out = in + ga*(out-in) : out = in + gr*(out-in);
);


@slider
Env_01.EnvFollower.SetValues(slider1, slider2, srate);
Env_23.EnvFollower.SetValues(slider3, slider4, srate);

Trig = slider5;


@block


@sample

//-- Create Envelopes --------
in_01 = (spl0 + spl1)/2;
Env_01.EnvFollower.Apply(in_01);

in_23 = (spl2 + spl3)/2;
Env_23.EnvFollower.Apply(in_23);


//-- Compare Envelopes -------
Env_01.EnvFollower.out > Env_23.EnvFollower.out ? (
  slider5 = Trig = -1;
) :
Env_01.EnvFollower.out < Env_23.EnvFollower.out ? (
  slider5 = Trig =  1;
) : (
//Env_01.EnvFollower.out == Env_23.EnvFollower.out ? (
  slider5 = Trig =  0;
);

slider_automate(slider5); // automate Trigger slider

//spl0 = spl1 = slider5; // For test only
О! Круто, спасибо! Попробую!!!
 
Да, все именно так! Может быть аудио
тогда это можно попробовать релизовать цепочкой из 3-х или 4-х фриварных VST на 4-х или 2-хканальном треке.
Если интересно, напишу, как именно, и брошу сами плаги.
 
тогда это можно попробовать релизовать цепочкой из 3-х или 4-х фриварных VST на 4-х или 2-хканальном треке.
Если интересно, напишу, как именно, и брошу сами плаги.
Очень интресено. Напиши, пожалуйста.
 
Dr_mushroom
Собственно, что тебе нужно:
- два детектора, чтобы выделить огибающие
- инвертор, чтобы вычесть одну из другой
- жесткий клипер. чтобы загнать эту разность в диапазон [ -1...1]

это все можно устроить в одном канале Рипера. используя 32-битные фришные VST dll-ки от MDA
тебе понадобятся "Envelope" для выделения огибающей, "Image", чтобы реализовать вычитание (он может производить суммарно-разностное преобразовние) и какой-нибудь шейпер.
 
Последнее редактирование:

Сейчас просматривают