Ну, я думаю, что нашел решение для многоканального звукового петлителя командной строки 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
, хотя - готово, проверьте другой ответ) :)
; надеюсь, это поможет и другим
Ура!