2

Учитывая количество аудиофайлов (скажем, * .wav), я бы хотел, чтобы из командной строки был способ смешивать эти файлы в виде дорожек с отдельными громкостями и определять глобальные точки петли, чтобы микширование аудио шло было плавным.

Может ли кто-нибудь предложить какие-либо альтернативы?

Спасибо заранее,
Ура!


На самом деле, "зацикливание командной строки" может быть почти достигнуто с помощью melt и файла ниже - проблема в том, что: зацикливание не совсем гладкое (слышны щелчки); Я не вижу способа смешать более двух каналов; и несмотря на добавление -audio-track | -hide-video switch в командной строке, пустой экран по-прежнему отображается. (немного больше о цикле в melt здесь: Re: цикл [Mlt-devel] для продюсера)

Эта команда должна использоваться для вызова melt в режиме "зацикливания":

melt eof=loop loop.mlt

... в то время как файл loop.mlt (вызывающий аудиофайлы test.wav и test2.wav) таков (в общей сложности он будет содержать 70 кадров при воспроизведении цикла):

<mlt>
  <producer id="producer0">
    <property name="aspect_ratio">0.000000</property>
    <property name="resource">test.wav</property>
    <property name="audio_index">0</property>
    <property name="video_index">-1</property>
    <property name="global_feed">1</property>
  </producer>
  <producer id="producer1">
    <property name="aspect_ratio">0.000000</property>
    <property name="resource">test2.wav</property>
    <property name="audio_index">0</property>
    <property name="video_index">-1</property>
    <property name="global_feed">1</property>
  </producer>
  <playlist id="playlist0">
    <entry producer="producer0" in="0" out="30"/>
    <blank length="10"/>
    <entry producer="producer0" in="0" out="30"/>
  </playlist>
  <playlist id="playlist1">
    <blank length="30"/>
    <entry producer="producer1" in="0" out="10"/>
  </playlist>
  <tractor id="tractor0" title="loop.mlt" global_feed="1" in="0" out="71">
    <multitrack id="multitrack0">
      <track producer="playlist0" hide="video"/>
      <track producer="playlist1" hide="video"/>
    </multitrack>
    <transition id="transition1" in="0" out="71">
      <property name="a_track">0</property>
      <property name="b_track">1</property>
      <property name="mlt_service">mix</property>
      <property name="start">0.5</property>
      <property name="end">0.5</property>
      <property name="combine">1</property>
      <property name="always_active">1</property>
    </transition>
  </tractor>
</mlt>

3 ответа3

1

Может быть, немного поздно, но я искал лупер Чака, поэтому я пишу один. Любая помощь приветствуется. https://github.com/rodolfoap/chucklooper Идея состоит в том, чтобы подражать LoopStation Boss RC-50. Не трудно с Чаком, я полагаю.

0

Ну, я думаю, что нашел решение для многоканального звукового петлителя командной строки Linux - это использование скрипта ChucK => Strong-time-on-the-fly Audio Programming Language .

Прежде всего, ChucK может быть установлен через sudo apt-get install chuck в Debian/Ubuntu. Однако после установки попробуйте набрать chuck и затем TAB в терминале; вы должны получить что-то вроде:

$ chuck
chuck       chuck.alsa  chuck.oss

... то есть - обратите внимание, что есть три исполняемых файла ChucK ; каждый для отдельного аудио-бэкэнда Linux - и обратите внимание, что исполняемый файл по умолчанию, chuck , фактически ссылается на JACK (другие исполняемые файлы, очевидно, относятся к ALSA и OSS).

Поскольку большинство типичных пользователей в Linux (также и я) на самом деле не имеют установленного jack - запуск исполняемого файла chuck может вызвать разочарование, поскольку это не приведет к звуку (учитывая, что в системе нет jack ); смотри, например:

Возможно, вы захотите запустить chuck --probe и посмотреть, что сообщается для разных бэкэндов - ожидайте жалобу от chuck если JACK отсутствует и работает, но chuck.alsa должен пройти:

$ chuck --probe
[chuck]: (via rtaudio): no devices found for compiled audio APIs!
[chuck]:
# .....
$ chuck.alsa --probe
[chuck]: found 4 device(s) ...
[chuck]: ------( chuck -- dac1 )---------------
[chuck]: device name = "hw:SB,0"
[chuck]: probe [success] ...
[chuck]: # output channels = 6
[chuck]: # input channels  = 2
[chuck]: # duplex Channels = 2
# .....

Таким образом, для большинства пользователей запуск chuck.alsa должен сработать, но учтите, что это, скорее всего, приведет к непосредственному подключению аудиоустройства (не похоже, что chuck знает о pulseaudio) - и тогда вы не сможете запускайте параллельно другие программы, генерирующие звук (например, vlc), и микшируйте звук из обоих приложений (другое приложение будет молчать).

 

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

Одна из замечательных особенностей ChucK заключается в том, что по сути мы можем определить один сценарий, который обрабатывает воспроизведение и зацикливание только одного звука, а затем вызывать несколько экземпляров этого сценария параллельно, что эффективно создает многоканальный звуковой петлитель!

После некоторого возни с примерами ChucK - смотрите:

... Мне удалось приготовить свой собственный скрипт - в основном на основе примеров: sndbuf.ck и valueat.ck - который я назвал loopsndbuf.ck:

// sound file
// initialize empty string variable for filename
"" => string filename;

// set a default filename to be loaded
"/path/to/freesound.org/100391__dobroide__20100627-creek.wav" => filename;

// if arguments are passed to the script,
// use the first argument as filename instead
if( me.args() ) me.arg(0) => filename;

0.5 => float myvolume;
if( me.args() ) if (me.arg(1) != "") Std.atof(me.arg(1)) => myvolume;

<<< "myvolume: " + myvolume >>>;

SndBuf buf;

filename => buf.read;
myvolume => buf.gain;
1.0 => buf.rate;


// time loop
Impulse i => dac;
while( true )
{
    int pos;

    repeat( buf.samples() )
    {
        buf.valueAt( pos ) => i.next;
        pos++;
        1::samp => now;
    }
}

(см. онлайн-версию для получения дополнительных комментариев)

Сохранив этот скрипт, мы можем теперь вызвать его с помощью chuck качестве интерпретатора:

chuck.alsa loopsndbuf.ck

... который начнет загружать звук, как в настройках по умолчанию, и зацикливать его. Или мы можем назвать сценарий с аргументами - обратите внимание , что символ для разделения аргументов из chuck сценария двоеточие :

chuck.alsa loopsndbuf.ck:/path/to/freesound.org/23222__erdie__thunderstorm2.wav:0.4

... или, наконец, мы можем вызвать несколько экземпляров сценария loopsndbuf.ck , который chuck будет выполнять параллельно. Для этого я бы предпочел поместить все в скрипт bash, назовем его loopchuck.sh:

set -x
PTH="/path/to/freesound.org"

chuck.alsa \
loopsndbuf.ck:$PTH/15528__ch0cchi__domestic-cat-purr.wav:1.0 \
loopsndbuf.ck:$PTH/100391__dobroide__20100627-creek.wav:0.05 \
loopsndbuf.ck:$PTH/23222__erdie__thunderstorm2.wav:0.4 \
loopsndbuf.ck:$PTH/2519__rhumphries__rbh-rain-01.wav:0.4 \
loopsndbuf.ck:$PTH/18766__reinsamba__chimney-fire.wav:0.4 \
loopsndbuf.ck:$PTH/53380__eric5335__meadow-ambience.wav:0.4

Выполнение этого сценария должно в основном загружать отдельные экземпляры сценария, каждый со своим собственным файлом и объемом - тогда chuck сначала загрузит все аудио в память, выплевывая что-то вроде этого в стандартный вывод:

$ ./loopchuck.sh
++ PTH=/path/to/freesound.org
++ chuck.alsa loopsndbuf.ck:/path/to ....
"myvolume: 1.0000" : (string)
"myvolume: 0.0500" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)

... и затем он будет запускать все сценарии одновременно - и затем он будет зацикливать все звуки индивидуально с точностью выборки в соответствии с их длиной файла - оборачивая цикл для каждого файла, когда он завершится, отдельно. Другими словами, фазы циклов независимы (аналогично тому, как терминатор X по умолчанию обрабатывает циклы GUI-программы) - и это именно то , что я искал :) !! Обратите внимание, что вам, возможно, придется нажать CTRL+C дважды, чтобы полностью остановить скрипт loopchuck.sh . (и да, используемые аудио образцы взяты из Freesound.org)

Тем не менее, обратите внимание, что хотя chuck загружает все эти файлы в память, он использует довольно много ресурсов ЦП для воспроизведения и микширования этих циклов - и поэтому ожидается, что в аудио будет пропадание звука, если ОС придется обрабатывать некоторые тяжелые операции (такие как GUI, скажем в случае при прокрутке веб-страницы в вашем браузере). Чтобы избежать этого, я предполагаю, что нужно использовать настройку jack но затем нужно быть вовлеченным в приоритеты Linux в реальном времени и еще много чего (что не обязательно является простым процессом).

 

Ну, я думаю, что теперь я счастлив - так как это все, что я хотел (я просто хотел бы смешать этот аудиовыход с одним из скажем vlc или youtube в firefox , хотя - готово, проверьте другой ответ) :) ; надеюсь, это поможет и другим
Ура!

0

Что ж, мне наконец-то удалось заставить Linux chuck и PulseAudio работать вместе - теперь перешел на получение программы ALSA (ChucK) для работы с Pulseaudio? - иначе смотрите принятый ответ здесь ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .