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

Начало Форум Разработка Программирование Про разработку гитарных педалей, ампа, кабсима. И прочие разгильдяйства

В этой теме 13 ответов, 2 участника, последнее обновление  kostolen 4 мес. назад.

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Автор
    Сообщения
  • #13630

    kostolen
    Участник

    Продолжение обсуждения темы начатой на лоре. Тема про разработку гитарных прибамбасов под линукс.

    Итак, опытно подтвердили, что Guitarix — попса. Играть на нём живо и вдохновенно невозможно. Сжатый сигнал не оставляет места никаким нюансам игры на гитаре, эмуляции не корректны и т.д.

    Основываясь на разработках Guitarixа выяснили, что использовать наработки можно, но муторно, поэтому начали писать своё на том же faust

    curufinwe (пока оставляю ник с лора) — автор и главный идейный двигатель, надеюсь, скоро подтянется и в обозримом будущем выложит свою разработку эмулятора лампового преампа и педалей. Также я, вполне возможно, скоро выложу и свою версию педалей овердрайва и дисторшна.

    Особенностью разработки curufinwe является попытка создать эмулятор для работы и в реальном времени и с DAW для вывода звука через компьютерные динамики, или мониторы общего назначения.

    А моё направление в основном на живое исполнение с использованием гитарного куба в качестве конечного звуковоспроизводящего агрегата. И хотелось бы в последствии собрать педалборду на sbc, для более удобной работы.

    Паралельно выяснили, что Мальмстин ужасен, Цой жив, И вообще в гитарной индустрии происходит не пойми что.

    Приглашаю всех неравнодушных.

    #13631

    kostolen
    Участник

    Пока никого нет, поговорю сам с собой.

    Во первых я с ходу поместил не в тот раздел. Ну и ладно. Если многоуважаемый АП не против.

    Во вторых мне удалось посидеть с плагином овердрайва. В последней стадии разработки наметилось несколько вопросов:

    • Главная проблема заключается в том, что на комбике он звучит, басы вкусно подтравливаются, есть некоторая, приятная такая, в средних часотах… Не знаю как передать, хорошо звучит. А в эмулируемый комбик и колонки компьютера совсем не красиво. песок и пр.
    • Вторая проблема — конечный каскад фильтра. В крайнем правом положении «Voice» нормально,а в левом просто срезаны верха.
    • Переписать вообще «обратную связь» в цепи перегруза. Во первых рекурсия должна быть, и дифференциальные уравнения, а не халтура, которую я написал.

    Напоминаю, за основу я взял материалы отсюда.
    Начал я с фильтров цепи перегруза. Изменить порядок фильтров хотелось попробовать, и частотой порога поиграться. Увеличил до 3 порядка, начало срезать слишком круто, басов и нижних средних частот покромсало конкретно и звук приобрёл кастрюльность. Сигнал сильно ослаб, в итоге съело ещё и много перегруза, и перегруз этот… мама дорогая… Поставил второй порядок и добавил подстройку частоты колена фильтров. Стало лучше. Однако так и не дотянуло до звука, что был при первом порядке. Но зато через эмулятор и колонки звук почти встал на место. В ампсим стало ГОРАЗДО лучше звучать. Но утратило нечто в комбике, то что мне нравилось, болотность такую, басы сразу угасают, не танутся. Подстройка частоты колена немного улучшает ситуацию, когда увожу в минуса, в комбике звук приобретает похожий окрас, которого ищу, но в ампсиме сразу проявляться нежелательные такие эффекты, опять песок. Значит на ампсиме некорректно работает фильтрация. (жду когда curufinwe выложит новую версию, надо будет вернутся к этому вопросу)

    Не думаю, что рекурсия обратной связи кардинально изменит ситуацию, а нагрузку на проц сильно увеличит, пока оставляю всю эту калькуляцию.

    Вторая моя мысль про фильтры — в Фаусте используются фильтры Баттерворта. А что насчёт применения фильтров Бесселя? Заметка на будущее.

    Попробовал изменить работу «активного» фильтра. Всё ещё испортил. Нет, его надо переписать с нуля. Сделать как полагается. Пока работает так — без него квадратный сигнал и звук такой, неприбранный, с ним лучше на дефолтных настройках, но работа регулятора нарушена.

    Поскольку я тут ещё не выкладывал код, то вот он:

    import("stdfaust.lib");
    import("filters.lib");
    process = stomp with {
      volume = hslider("volume",1,0,1,0.01);
      drive = hslider("drive",5,1,10,0.1);
      hipass = 720;
      lopass = 62;
      breakline =hslider("breakline",0,-10,10,0.1);
      amplitude = hslider("preamp",1,0,4,0.01);
      
      slimiter(x,y) =x*coeff,y*coeff
    	with {
    		epsilon =1/(48000*1.0);
    		peak = max(abs(x),abs(y)):max~-(epsilon);
    		coeff = 1.0/max(1.0,peak);
      };
      
      overdrive(input) = sin(atan((filtered*drive)+boosted)) with {
    	boosted = input*10;
    	filtered = boosted <:fi.highpass(2,hipass+(breakline*drive)),fi.lowpass(2,((lopass+breakline)/drive)):  + ;
      };
      
      
      prelopassfreq = 723.4;
      PreActiveLowpass = fi.lowpass(2,prelopassfreq);
      
      N = 3;
      voice = hslider("voice",5,1,10,0.01);
      f0 = 500;
      bw = 150;
      alpha = -1;
      ActiveToneCirquit = _<: PreActiveLowpass,fi.spectral_tilt(N,f0*voice,bw*voice,alpha):+;
      //_<: fi.spectral_tilt(N,f0,bw,alpha),fi.lowpass(1,prelopassfreq):+;
      
      stomp =  _*amplitude <: slimiter : ba.bypass1(button("overdrive"),overdrive),_: ba.bypass1(button("ATC"),ActiveToneCirquit),_: _*(0.5*volume),_ ;
        
    };

    Лицензия GPL V3, ежели что.

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

    #13632

    В какой подраздел перенести?

    #13633

    kostolen
    Участник

    Я не заметил сразу раздел «Разработка». Туда, может? Я всегда всё путаю.

    #13635

    kostolen
    Участник

    Так. Переделал перегруз. Теперь не нужен наклон волны(spectral_tilt), он получается на более правдоподобном перегрузе с фильтром в обратной цепи. Переделал и конечные фильтры. Пока примерно придерживаясь описания тюбскримера. В результате имеем немного не такой наклон волны и ручку «voice» с принципом работы как у тюбскримера. Добился паритета в звучании между выходом в комбик и через эмуляцию ампа в колонки компьютера. Записал примерчик, открывать в Audacity, один канал — чистый плагин педали, другой пропущен через последний ампсим и кабсим Дядюшки Фло. Странное дело, но отрендеренный результат немного отличается от звучания вживую. Что это такое? Уже не первый раз. Или это так влияет даунсэмплинг с 96000 до 44100?

    Педаль заводится с полпинка, переход к перегрузу незаметный, играть того же Таунсенда — одно удовольствие и при этом чуть ручку на гитаре скинул и играешь романтику, никакой перенастройки не надо. Оно звучит во всех стилях. Это то, чего я хотел добиться. На сегодня я доволен. Надо будет в субботу обкатать на нормальной громкости и в сравнении с другими педалями.
    Код плагина на текущий момент:

    import("stdfaust.lib");
    import("filters.lib");
    process = stomp with {
      volume = hslider("volume",1,0,1,0.01);
      drive = hslider("drive",5,1,10,0.1);
      hipass = 720;
      lopass = 62;
      sintan = hslider("sintan",1,0,1,0.01);
      breakline =hslider("breakline",0,-10,10,0.1);
      amplitude = hslider("preamp",1,0,4,0.01);
      lomakeup = hslider("lomakeup",1,1,10,0.01);
      slimiter(x,y) =x*coeff,y*coeff
    	with {
    		epsilon =1/(96000*1.0);
    		peak = max(abs(x),abs(y)):max~-(epsilon);
    		coeff = 1.0/max(1.0,peak);
      };
      
      overdrive(inputL) = overdriven(inputL):ba.bypass1(checkbox("ATC"),ActiveToneCirquit) with {
    	boost = _*drive;
    	loopbackfilter = driven<:fi.highpass(2,hipass+(breakline*drive)),fi.lowpass(2,((lopass+breakline)/drive)):  + ;
    	driven =  boost*drive;
    	overdriven = _<:boost,loopbackfilter:-:atan(_);
      };
      
      
      prelopassfreq = 723.4;
      PreActiveLowpass = fi.lowpass(1,prelopassfreq);
      
      N = 3;
      voice = hslider("voice",0.5,0,1,0.001);
      f0 = 730;
      bw = 150;
      alpha = hslider("alpha",-1,-1,1,0.01);
      ActiveToneCirquit = _<: (PreActiveLowpass:fi.lowpass(1,prelopassfreq))*voice,(PreActiveLowpass + fi.highpass(1,prelopassfreq))*(1-voice):+;
      
      stomp =  _*amplitude: ba.bypass1(checkbox("overdrive"),overdrive): _*(volume) ;
        
    };
    #13636

    kostolen
    Участник

    Гонимый ночными кошмарами написал маленький прототипчик дилея с гейтом. Чем громче играешь, тем слабее звук дилея, замолк и вылезает хвост дилея на полную громкость.

    import("stdfaust.lib");
    delayed(inL,inR) = inL, de.delay(65536,44100)*(1-an.amp_follower_ud(0.2,0.2));
    process = _<: delayed : an.mth_octave_spectral_level6e(8,1000,3,0.5,0),an.mth_octave_spectral_level6e(8,1000,3,0.5,0):+;

    Предназначено для запуска в https://faust.grame.fr/editor/ Там спектральный анализатор каждого канала по трём полосам

    Задел на будущее.

    #13637

    kostolen
    Участник

    И ещё, про прямоугольные синусоиды и алиасинг. В этой лекции много пищи для мозга. проблема вылезающая в овердрайвах и дисторшнах — песок не дававший мне покоя. Причина именно дигитальная.

    #13638

    А перегруз в lv2 же конвертится?

    #13639

    kostolen
    Участник

    Да, описать я забыл как это всё пробовать. Можно компильнуть хоть в lv2, хоть в ladspa, всё равно нет морды и крутилки пока черновые.

    Установить faust с помощью пакетного менеджера. Создать файл, например, superpuperoverdrive.dsp скопировать код отсюда, вставить, сохранить и скомпильнуть командой faust2lv2 superpuperoverdrive.dsp Появится папка superpuperoverdrive.lv2 — её надо копировать (или слинковать) туда где её должны найти хосты и давы. Например в ~/.lv2 Или настроить путь поиска lv2 в соответствующей программе.

    А ты на живом Ролланде пробовать будешь? Или в колонку? Если в Ролланд — он у тебя честный, или «модулирующий»? От этого много может зависеть.

    Поскольку я играю на хамбакерах, то и звук у меня помощнее. Если на синглах не хватит мощи, подрегулировать «Preamp», он усилит сигнали перед перегрузом. «Drive» — степень перегруза,»Voice» — регулятор тона (пока), «Breakline» — подстройка фильтра в обратной связи, на синглах, опять же, может пригодиться.

    Я играл так — гитара — звуковуха — jackd — Carla — овердрайв(драйв на 7, volume на 3-5, остальное по дефолту) — звуковуха — комбик.
    Другой вариант — гитара — звуковуха — jackd — Carla — овердрайв(драйв на 7, volume на 3-5, остальное по дефолту) — newtubeamp(последний из curufinwe’вских)(настройки — bias 5-6, drive 1, volume 1) — GodsCabSim от Flo — колонки.
    Частота сэмплирования у меня 96000кГц×24бита.

    Будет интересно услышать несжатый, некомпрессированный, нереверберированный, недилеенный пример звучания. Аккорды разной амплитуды, ппаверкорды, гаммы, бенды. Синглы — хамбакеры, всё подпиши. А то я тут кашу неконкретную развёл, надо конкретики. Если плохо — тоже опиши и выложи запись.

    #13640

    kostolen
    Участник

    Попробовал использовать рекурсию. что-то я не пойму как оно работает. Нужен тот кто мне это всё объяснил бы. а он молчит. Главное, примерчики из ютуба работают, а моя программа… запущено всё в qtractor, проигрывается отрезок. при каждом круге воспроизведения на выходе уровень сигнала растёт на 1. тоесть, даже при полной тишине на входе 0, на выходе 0, сделали круг, на входе 0, на выходе 1, круг, на выходе 2 и т.д. Это как такое в принципе возможно?

    #13641

    kostolen
    Участник

    Так. Народ всё же тусуется на лоре, а я тут спокойно поразмышляю. Идея с рекурсией застряла, треснула и утонула. Всё же в Фаусте нереально писать настоящую рекурсию. Проблема в том, что потоки будут не паралельные, а с шагом в один тик назад. В результате на простой синусоиде с периодом в 10 тиков, то после двух шагов рассчётов волна расползлась уже на пол периода, то есть, пошла практически инверсия, после третьей она разделилась и пошла дробиться и переворачиваться. Никакого подобия работы аналогового устройства. В плагине это выражается в песке на высоких частотах. При чём генерируют песок довольно низкие частоты.

    Можно большими усилиями решить это, но нафиг. Получилась педалька без рекурсии и получилась. Посижу пополирую ещё, поэкспериментирую, опять сломаю, а тогда надо будет заняться OSC и MIDI контролем параметров.

    #13642

    kostolen
    Участник

    Очередной промежуточный вариант:

    import("stdfaust.lib");
    process = stomp with {
      volume = hslider("Volume",1,0,1,0.01):si.smooth(0.97);
      drive = hslider("Drive",5,1,10,0.01):si.smooth(0.97);
      promiles = hslider("Promiles",0,0,1,0.01);
      amplitude = hslider("Boost",1,0,10,0.01):si.smooth(0.97);
      tone = hslider("Sugar",0.5,0,1,0.001):si.smooth(0.97);
      bass = hslider("Bass",0,0,2,0.01);
      prelopassfreq = 723.4;
      hipass = 720;
      lopass = 62;
      
      overdrive(input) = overdriven(input): ActiveToneCirquit: _*(volume/(drive*3)) with {
    	boost = _*amplitude;
    	lb_filter1 = _<:fi.highpass(1,hipass-700*promiles)+fi.lowpass(1,lopass/drive) ;
    	// drunk hi1 =-700, lo1 = 0, hi2 = 722, lo2 = 96
    	lb_filter2 = _<:fi.highpass(1,hipass+722*promiles)+fi.lowpass(1,(lopass+96*promiles)/drive) ;
        driven = *(drive);
    	loopback1(wave) = lb_filter1(driven(wave));
    	loopback2(wave) = lb_filter2(driven(wave));
    	diodes = sin(atan(_));
        overdriven = boost: _<: _-loopback1,_: loopback2(_+_): diodes; 
    	
    	PreActiveLowpass = fi.lowpass(1,prelopassfreq);
    	ActiveToneCirquit = _<: PreActiveLowpass*(1-tone)+(PreActiveLowpass + fi.highpass(1,prelopassfreq))*tone:_<: +(fi.lowpass(3,196)*((-1+bass+(0.2*drive))-promiles));
    	};
    	
      stomp =  _: ba.bypass1(1-checkbox("overdrive"),overdrive) ;
        
    };

    На сегодня. Промили и Сахар это для брожения, но слишком много сахара плохо. Если играть в curufinweвский Tubeamp, то нужно добавить на педали баса. Всё-таки выскочил и я из зоны комфорта этого ампа, раньше работало практически одинаково и в куб и в амп, а теперь вот, компенсировать надо. Но, это пока. Главное — пробовать брожение на вкус. Промили вплетены в контер усиления, а сахар — это тон, открытость сигнала регулирует. А бас на самом конце сидит. Я его в несколько параметров регулирую. Когда промили добавляешь, он уменьшается, когда драйв уменьшаешь, он уменьшается. Ну и буст. Более чистое усиление, регулируя буст и овердрайв можно влиять на характер перегруза.

    Пока так.

    #13643

    kostolen
    Участник

    Собрал плейлист по лекциям фауста 2015ого года https://yadi.sk/d/iGUxRld23aFJTj

    #13644

    kostolen
    Участник

    Так. После долгих попыток родить рекурсию понял, что модель, которую я взял вначале — лучшее на что я способен. Можно просчитывать многие и разные параметры — но если их не разрулить правильно, получается пшик. Не буду мучить себя страданиями. То, сто получилось, меня устраивает в плане звука: Окрас — тот, что надо. Динамика — выше крыши., звук не тянет, но динамика и невозможна со сжатым звуком. Для протяжности компрессоры есть. Переход от бриджа на нек — то, что дохтур прописал. К сожалению так и не могу опробовать гитару с синглами.

    Отстраиваю звук я по своему комбику, выход с звуковухи в гитарный вход куба. Пробую и тюбампом втыкаться в лайнин куба, он всё же не так играет, басов нет и в верхах съедены кристалики, которые получаются при игре в куб напрямую. Но на большой громкости этого практически не заметно, я басы можно добавить на тюбампе (или на педали я прикрутил бас)

    Итак, последняя версия педали. Назову её Бродяжьей педалью, «Beggars Overdrive», потому что блюзить под неё и истошно страдать всяческими невзгодами очень подходит.

    import("stdfaust.lib");
    process = pedal with {
      amplitude = hslider("Boost",1,0.2,10,0.01):si.smooth(0.97);
      volume = hslider("Volume",1,0,1,0.01):si.smooth(0.97);
      drive = hslider("Drive",5,1,10,0.01):si.smooth(0.97);
      voice = hslider("Voice",0,0,1,0.01):si.smooth(0.97);
      tone = hslider("Sugar",0.5,0,1,0.001):si.smooth(0.97);
      meat = hslider("Meat",0,0,1,0.001):si.smooth(0.97);
      bass = hslider("Bass",0,0,1,0.01):si.smooth(0.97);
      prelopassfreq = 723.4;
      hipass1 = 720;
      lopass1 = 62;
      lopass2 = 2000;
      
      overdrive(input) = overdriven(input): ActiveToneCirquit: _*(volume/drive) with {
    	boost = _*amplitude;
        driven = *(drive);
        diodes = atan(_);
        
    	lb_filter1 = _<:fi.highpass(1,hipass1)+fi.lowpass(1,lopass1/drive) ;
    	lb_filter2 = fi.lowpass(1,lopass2/drive)*0.2*drive ;
    	loopback = driven: lb_filter1<: _*(1-meat)+lb_filter2*meat:  diodes ;
    	
        overdriven(wave) = boost(wave): loopback ;
    	
    	PreActiveLowpass = fi.lowpass(1,prelopassfreq);
    	ActiveToneCirquit = _<: PreActiveLowpass*(1-tone)+(PreActiveLowpass + fi.highpass(1,prelopassfreq))*tone:_<: +(fi.lowpass(3,196)*bass*drive);
    	};
    	
      pedal = ba.bypass1(1-checkbox("overdrive"),overdrive) ;
        
    };
Просмотр 14 сообщений - с 1 по 14 (из 14 всего)

Для ответа в этой теме необходимо авторизоваться.