STK Synthesis ToolKit in C++

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Instal.lació i tutorial

descarrego stk-4.4.3.tar.gz

$ ./configure --with-alsa --with-jack
$ make

les demostracions estan a projects/demo/

el primer exemple (mode no-real-time, produeix un fitxer wav):

$ ./demo Clarinet -ow clarinet.wav -if scores/bookert.ski

i funciona. Hi ha tota una llista de STK Instruments A number of SKINI scorefiles are provided in the scores directory of the demo projec

Per fer realtime (el so es produeix a l'instant i no cal generar un wav):

$ ./demo FMVoices -or -if scores/bookert.ski

Funciona tan si tinc arrencat el JACK com si no. Si tinc arrencat el JACK apareix en la pestanya Audio el client RtApiJack, connectat a system:playback.

i per fer-ho funcionar amb el vkeybd:

$ ./demo Clarinet -or -im 2

apareix en la pestanya ALSA del QJackCtl. He ficat el núm 2 (perquè és el 2n client que hi ha a la pestanya ALSA. El primer és el Midi Through. Quan executo el STK apareix amb un port d'entrada: 131: RTMidi Input Client. Apareix en la part de la dreta de la pestanya ALSA (writable clients), i s'estableix la connexió automàticament amb l'opció -im2.

De quins instruments disposem? stk::Instrmnt és una classe abstracta, que implementa tots els instruments que es poden veure a:

que són:

polifonia:

$ ./demo BeeThree -n 8 -or -im 2

A part de demo, també funcionen les altres aplicacions de la carpeta projects/demo (que són gràfiques). Per exemple, amb Physical es poden comparar els sons dels diferents instruments que estan implementats.

També funcionen els exemples de la carpeta projects/examples/

També és interessant el Ragamatic STK Controller (sona sol, no cal fer res):

~/stk-4.4.3/projects/ragamatic$ ./Raga

Compilació del primer exemple: Noise.cpp

Library Use:

The STK distribution provides a Makefile that can be used on Unix systems to build a static library. After unpacking the distribution (tar -xzf stk-4.x.x.tar.gz), run the configure script by typing ./configure from the top level distribution directory (see the INSTALL file in the same directory for more information). Then from within the src directory, type make. After a successful build, you may wish to move the library (libstk.a) and the contents of the include directory to standard library and include search paths on your system. For example, the linux RPM distribution of STK puts the library in /usr/lib/ and the STK header files in /usr/include/stk/.

Assuming the library is located in a standard search path and the header files are located in /usr/include/stk/, the sineosc.cpp example from the previous tutorial chapter can be compiled on a little-endian system using the GNU g++ compiler as follows:

g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o sineosc sineosc.cpp -lstk

With the header files in a standard search path, it is possible to modify the #include statements in the sineosc.cpp program as follows:

#include "stk/FileLoop.h"
#include "stk/FileWvOut.h"

and then compile without an explicit include path argument to the compiler:

g++ -Wall -D__LITTLE_ENDIAN__ -o sineosc sineosc.cpp -lstk

Així doncs:

$ sudo cp ~/stk-4.4.3/src/libstk.a /usr/lib/
$ sudo mkdir /usr/include/stk
$ sudo cp ~/stk-4.4.3/include/* /usr/include/stk/

I ara ja podem compilar l'exemple Noise.cpp: (https://ccrma.stanford.edu/software/stk/fundamentals.html)

#include "Noise.h"
using namespace stk;

int main()
{
  StkFrames output(20, 1);   // initialize StkFrames to 20 frames and 1 channel (default: interleaved)
  Noise noise;

  noise.tick( output );
  for ( unsigned int i=0; i<output.size(); i++ ) {
    std::cout << "i = " << i << " : output = " << output[i] << std::endl;
  }

  return 0;
}
$ ~/stk-4.4.3/exemples_meus
$ g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o Noise Noise.cpp -lstk
$ ./Noise 
i = 0 : output = 0.668779
i = 1 : output = -0.252208
i = 2 : output = 0.583762
i = 3 : output = -0.0715927
...

sineosc.cpp:

// sineosc.cpp

#include "FileLoop.h"
#include "FileWvOut.h"
using namespace stk;

int main()
{
  // Set the global sample rate before creating class instances.
  Stk::setSampleRate( 44100.0 );

  FileLoop input;
  FileWvOut output;

  // Load the sine wave file.
  input.openFile( "rawwaves/sinewave.raw", true );

  // Open a 16-bit, one-channel WAV formatted output file
  output.openFile( "hellosine.wav", 1, FileWrite::FILE_WAV, Stk::STK_SINT16 );

  input.setFrequency( 440.0 );

  // Run the oscillator for 40000 samples, writing to the output file
  for ( int i=0; i<40000; i++ )
    output.tick( input.tick() );

  return 0;
}
$ g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o sineosc sineosc.cpp -lstk
$ ./sineosc

Es genera hellosine.wav

Exemple rtsine.cpp i crtsine.cpp: (els exemples estan a projects/examples/, i els copio a exemples_meus/)

$ g++ -Wall -D__LINUX_ALSA__ -D__LITTLE_ENDIAN__ -o rtsine ../src/Stk.cpp ../src/Generator.cpp ../src/SineWave.cpp ../src/WvOut.cpp \
    ../src/RtWvOut.cpp RtAudio.cpp rtsine.cpp -lpthread -lasound

no compila perquè no troba Generator.cpp i ../src/WvOut.cpp.

Els exemples rtsine.cpp i crtsine.cpp em compilen, però no ho faig com diu el manual:

$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o rtsine rtsine.cpp -lstk -lasound -ljack
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o crtsine crtsine.cpp -lstk -lasound -ljack

Es dóna una explicació clara de què és una funció callback:

An alternative scheme for audio input/output is to define a specific function in which audio computations are performed and to let the audio system call this function when more input/output data can be accepted by the hardware (referred to as a callback scheme). In this section, we show how the previous rtsine.cpp program can be modified to work in a callback scenario. There is no "single-sample" interface for this functionality. The callback function will be invoked automatically by the audio system controller (RtAudio) when new data is needed and it is necessary to compute a full audio buffer of samples at that time (see Blocking vs. Callbacks for further information).
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o crtsine crtsine.cpp -lstk -lasound -ljack

Per compilar l'exemple bethree.cpp:

$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o bethree bethree.cpp -lstk -lasound -ljack
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o controlbee controlbee.cpp -lstk -lasound -ljack
$ ./controlbee scores/bookert.ski
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o threebees threebees.cpp -lstk -lasound -ljack
$ ./threebees < scores/bachfugue.ski 

així de fàcil puc fer sonar una cançó, amb el protocol SKINI que és human readable.

$ ./midiprobe

There are 2 MIDI input sources available.
  Input Port #1: Midi Through:0
  Input Port #2: Virtual Keyboard:0

There are 5 MIDI output ports available.
  Output Port #1: Midi Through:0
  Output Port #2: TiMidity:0
  Output Port #3: TiMidity:1
  Output Port #4: TiMidity:2
  Output Port #5: TiMidity:3

playsmf: necessito un sinte extern com pot ser fluidsynth

$ /usr/local/bin/fluidsynth -s -a jack -m alsa_seq -l -g 5 -j -f /home/joan/programa_saxo.cfg /home/joan/soundfonts/general/8-4mg-chaos-bank-sf2/8.4mg_chaos_bank.sf2
$ ./playsmf midifiles/bwv772.mid 1

Estableixo les connexions manualment (RtMidi Output Client amb fluidsynth), i apreto Enter per escoltar el midi file amb el soundfont seleccionat. Però no cal fer les connexions manualment si sé quin és el port del fluidsynth (3r argument de playsmf)

Síntesi granular: exemple grains.cpp

Vull saber com s'utilitza aquesta utilitat.

$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o grains grains.cpp -lstk -lasound -ljack

$ ./grains
useage: grains file N dur ramp offset delay stretch ramdomness
    where file = a soundfile to granulate,
    N = the number of grain voices to use,
    dur = the grain duration (ms),
    ramp = the envelope percent (0-100),
    offset = hop time between grains (ms),
    delay = pause time between grains (ms),
    stretch = stetch factor (1-1000),
    and randomness = factor between 0 - 1.0 to control grain parameter randomness.

Necessito un soundfont per granular. Per exemple, funciona:

$ ./grains ../../exemples_meus/hellosine.wav 1 10 50 1 1 500 .5

Ara em falta saber què representa cadascun dels paràmetres i la teoria de síntesi granular, així com estudiar el codi. L'objectiu és aconseguir un so sintètic que m'agradi i aconseguir fer coses com el que es veu en el vídeo de realtime gesture recognition with contact microphones:

Com a fitxer origen he utilitzat sinewave.wav, però es poden fer proves amb molts altres samples. Per exemple:

Teoria Síntesi granular

Aplicacions

Un cop es domina programàticament les tècniques de síntesi es podria programar alguna aplicació com la que es pot veure en el vídeo: (realtime gesture recognition with contact microphones)

Idees com aquesta es poden incorporar en una performance. nota del forum: el piezo (micròfon de contacte) es un Schaller (que por cierto, es de lo mejorcito que he probado en microfonía de contacto). Es pot trobar a Thomann:


creat per Joan Quintana Compte, gener 2012

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines