Command line multitrack audio looper untuk Linux?

2

Diberi sejumlah file audio, (katakanlah, * .wav), saya ingin cara baris perintah untuk mencampurkan file-file ini sebagai trek dengan volume individu, dan menentukan titik loop global, sehingga campuran audio loop mulus.

Adakah yang bisa menyarankan alternatif?

Terima kasih banyak sebelumnya,
Cheers!


Bahkan, "command line looper" hampir dapat dicapai dengan meltdan file di bawah ini - masalahnya adalah: perulangan tidak benar-benar mulus (ada klik yang dapat didengar); Saya tidak bisa melihat cara untuk mencampur lebih dari dua saluran; dan meskipun menambahkan -audio-track | -hide-videosakelar pada baris perintah, layar kosong masih ditampilkan. ( lebih banyak tentang perulangan di meltsini: Re: [Mlt-devel] loop untuk produser )

Perintah ini harus digunakan untuk memanggil meltdalam mode "looping":

melt eof=loop loop.mlt

... sementara loop.mltfile (memanggil file audio test.wavdan test2.wav) adalah ini (totalnya akan menjadi 70 frame selama pemutaran loop):

<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>
sdaau
sumber

Jawaban:

1

Mungkin agak terlambat, tapi saya mencari looper chuck, jadi saya menulis satu. Setiap bantuan dipersilahkan. https://github.com/rodolfoap/chucklooper Idenya adalah untuk meniru LoopStation Boss RC-50. Tidak sulit dengan chuck, kurasa.

RodolfoAP
sumber
0

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!

sdaau
sumber