Yah, saya pikir saya menemukan solusi untuk looper audio multitrack Linux command-line - dan itu adalah dengan menggunakan ChucK => Skrip Bahasa Pemrograman Audio yang tepat waktu dan on-the-fly .
Pertama-tama, ChucKdapat diinstal melalui sudo apt-get install chuckdi Debian / Ubuntu. Namun, setelah Anda menginstal, coba ketik chuckdan kemudian TABdi terminal; Anda harus mendapatkan sesuatu seperti:
$ chuck
chuck chuck.alsa chuck.oss
... maksudnya - perhatikan bahwa ada tiga ChucK executable; masing-masing untuk backend audio Linux yang terpisah - dan perhatikan bahwa executable default chuck, sebenarnya mengacu pada JACK (executable lainnya, jelas, merujuk ke ALSA dan OSS).
Karena sebagian besar pengguna di Linux (juga saya sendiri) sebenarnya tidak jackmenginstal - menjalankan chuckexecutable dapat menyebabkan kekecewaan, karena tidak akan menghasilkan suara (diberikan yang jacktidak ada pada sistem); lihat, misalnya:
Anda mungkin ingin menjalankan chuck --probedan melihat apa yang dilaporkan untuk backend yang berbeda - mengharapkan keluhan dari chuckjika JACK tidak ada dan berjalan, tetapi chuck.alsaharus lulus:
$ 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
# .....
Untuk sebagian besar pengguna, maka menjalankannya chuck.alsaseharusnya melakukan trik - namun, perhatikan bahwa ini kemungkinan akan mengambil perangkat audio secara langsung (sepertinya tidak chuckdisadari pulseaudio) - dan kemudian Anda tidak akan dapat menjalankan penghasil audio lainnya program (suka vlc) secara paralel, dan memiliki suara yang dicampur dari kedua aplikasi (aplikasi lain pada dasarnya akan tetap diam).
Tapi ini sedang dicatat - kita sekarang dapat melanjutkan dengan ChucKskrip untuk pengulangan.
Salah satu hal hebat tentang itu ChucKadalah bahwa pada dasarnya kita dapat mendefinisikan satu skrip yang menangani pemutaran dan perulangan hanya satu suara - dan kemudian memanggil beberapa contoh skrip itu secara paralel - yang secara efektif menciptakan looper audio multitrack!
Setelah beberapa bermain-main dengan ChucKcontoh - lihat:
... Saya berhasil memasak naskah saya sendiri - terutama berdasarkan pada contoh: sndbuf.ck dan valueat.ck - yang saya sebut 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;
}
}
( lihat versi online untuk komentar lebih lanjut )
Setelah menyimpan skrip ini, sekarang kita dapat menyebutnya dengan chuckjuru bahasa:
chuck.alsa loopsndbuf.ck
... yang akan mulai memuat suara seperti dalam pengaturan default, dan mengulanginya. Atau, kita dapat memanggil skrip dengan argumen - perhatikan bahwa karakter untuk memisahkan argumen dari chuckskrip adalah colon ( :):
chuck.alsa loopsndbuf.ck:/path/to/freesound.org/23222__erdie__thunderstorm2.wav:0.4
... atau, - akhirnya - kita dapat memanggil beberapa instance loopsndbuf.ckskrip, yang chuckakan berjalan secara paralel. Untuk ini, saya lebih suka meletakkan semuanya dalam skrip bash, sebut saja 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
Menjalankan skrip ini pada dasarnya harus memuat instance skrip yang terpisah, masing-masing dengan file dan volumenya sendiri - chuckkemudian akan memuat semua audio ke dalam memori, meludahkan sesuatu seperti ini ke stdout:
$ ./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)
... dan kemudian, semua skrip akan mulai pada saat yang sama - dan kemudian akan mengulang semua bunyi secara individual pada akurasi sampel, sesuai dengan panjang file mereka - membungkus loop untuk setiap file, ketika menyimpulkan, secara terpisah. Dengan kata lain, fase loop independen ( mirip dengan bagaimana program GUI terminatorX memperlakukan loop secara default ) - dan itulah yang saya cari :)!! Perhatikan bahwa Anda mungkin harus menekan CTRL+ Cdua kali untuk menghentikan loopchuck.shskrip sepenuhnya . ( dan ya, sampel audio yang digunakan berasal dari Freesound.org )
Namun, perlu diketahui bahwa ketika chuckmemuat semua file ini dalam memori, ia menggunakan cukup banyak CPU yang mereproduksi dan mencampur loop ini - dan karena itu diharapkan memiliki penurunan dalam audio, jika OS harus menangani beberapa operasi berat (seperti GUI, katakanlah dalam hal ini ketika menggulir halaman web di browser Anda). Untuk menghindari ini, saya kira jacksetup harus digunakan - tetapi kemudian kita harus terlibat dengan prioritas real-time Linux dan yang lainnya (yang tidak selalu merupakan proses yang mudah).
Yah, saya kira saya senang sekarang - karena hanya ini yang saya inginkan ( saya hanya berharap saya dapat mencampur output audio ini dengan satu dari say vlcatau youtube di firefox, meskipun - selesai, periksa jawaban lainnya ) :); Semoga ini membantu orang lain juga,
Ceria!