<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=STK_Synthesis_ToolKit_in_C%2B%2B</id>
	<title>STK Synthesis ToolKit in C++ - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=STK_Synthesis_ToolKit_in_C%2B%2B"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=STK_Synthesis_ToolKit_in_C%2B%2B&amp;action=history"/>
	<updated>2026-08-30T11:09:52Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=STK_Synthesis_ToolKit_in_C%2B%2B&amp;diff=248827&amp;oldid=prev</id>
		<title>Joan: /* Síntesi granular: exemple grains.cpp */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=STK_Synthesis_ToolKit_in_C%2B%2B&amp;diff=248827&amp;oldid=prev"/>
		<updated>2012-02-11T00:17:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Síntesi granular: exemple grains.cpp&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=Instal.lació i tutorial=&lt;br /&gt;
*https://ccrma.stanford.edu/software/stk/&lt;br /&gt;
descarrego stk-4.4.3.tar.gz&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./configure --with-alsa --with-jack&lt;br /&gt;
$ make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
les demostracions estan a projects/demo/&lt;br /&gt;
&lt;br /&gt;
el primer exemple (mode no-real-time, produeix un fitxer wav):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./demo Clarinet -ow clarinet.wav -if scores/bookert.ski&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i funciona. Hi ha tota una llista de STK Instruments&lt;br /&gt;
A number of SKINI scorefiles are provided in the scores directory of the demo projec&lt;br /&gt;
&lt;br /&gt;
Per fer realtime (el so es produeix a l'instant i no cal generar un wav):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./demo FMVoices -or -if scores/bookert.ski&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
i per fer-ho funcionar amb el vkeybd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./demo Clarinet -or -im 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
De quins instruments disposem? stk::Instrmnt és una classe abstracta, que implementa tots els instruments que es poden veure a:&lt;br /&gt;
*https://ccrma.stanford.edu/software/stk/usage.html#voices&lt;br /&gt;
*https://ccrma.stanford.edu/software/stk/classstk_1_1Instrmnt.html#a34c6733ca145763462d9e44ae3c772b6&lt;br /&gt;
que són:&lt;br /&gt;
*stk::BandedWG, stk::BeeThree, stk::BlowBotl, stk::BlowHole, stk::Bowed, stk::Brass, stk::Clarinet, stk::Drummer, stk::Flute, stk::FM, stk::FMVoices, stk::HevyMetl, stk::Mandolin, stk::Mesh2D, stk::Modal, stk::Moog, stk::PercFlut, stk::Plucked, stk::Resonate, stk::Rhodey, stk::Sampler, stk::Saxofony, stk::Shakers, stk::Simple, stk::Sitar, stk::StifKarp, stk::TubeBell, stk::VoicForm, stk::Whistle, and stk::Wurley.&lt;br /&gt;
&lt;br /&gt;
polifonia:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./demo BeeThree -n 8 -or -im 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
També funcionen els exemples de la carpeta projects/examples/&lt;br /&gt;
&lt;br /&gt;
També és interessant el ''Ragamatic STK Controller'' (sona sol, no cal fer res):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/stk-4.4.3/projects/ragamatic$ ./Raga&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Compilació del primer exemple: Noise.cpp&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Library Use:&lt;br /&gt;
&lt;br /&gt;
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/.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o sineosc sineosc.cpp -lstk&lt;br /&gt;
&lt;br /&gt;
With the header files in a standard search path, it is possible to modify the #include statements in the sineosc.cpp program as follows:&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;stk/FileLoop.h&amp;quot;&lt;br /&gt;
#include &amp;quot;stk/FileWvOut.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
and then compile without an explicit include path argument to the compiler:&lt;br /&gt;
&lt;br /&gt;
g++ -Wall -D__LITTLE_ENDIAN__ -o sineosc sineosc.cpp -lstk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Així doncs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo cp ~/stk-4.4.3/src/libstk.a /usr/lib/&lt;br /&gt;
$ sudo mkdir /usr/include/stk&lt;br /&gt;
$ sudo cp ~/stk-4.4.3/include/* /usr/include/stk/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I ara ja podem compilar l'exemple Noise.cpp: (https://ccrma.stanford.edu/software/stk/fundamentals.html)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;Noise.h&amp;quot;&lt;br /&gt;
using namespace stk;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  StkFrames output(20, 1);   // initialize StkFrames to 20 frames and 1 channel (default: interleaved)&lt;br /&gt;
  Noise noise;&lt;br /&gt;
&lt;br /&gt;
  noise.tick( output );&lt;br /&gt;
  for ( unsigned int i=0; i&amp;lt;output.size(); i++ ) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;i = &amp;quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; : output = &amp;quot; &amp;lt;&amp;lt; output[i] &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/stk-4.4.3/exemples_meus&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o Noise Noise.cpp -lstk&lt;br /&gt;
$ ./Noise &lt;br /&gt;
i = 0 : output = 0.668779&lt;br /&gt;
i = 1 : output = -0.252208&lt;br /&gt;
i = 2 : output = 0.583762&lt;br /&gt;
i = 3 : output = -0.0715927&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''sineosc.cpp''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// sineosc.cpp&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FileLoop.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FileWvOut.h&amp;quot;&lt;br /&gt;
using namespace stk;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  // Set the global sample rate before creating class instances.&lt;br /&gt;
  Stk::setSampleRate( 44100.0 );&lt;br /&gt;
&lt;br /&gt;
  FileLoop input;&lt;br /&gt;
  FileWvOut output;&lt;br /&gt;
&lt;br /&gt;
  // Load the sine wave file.&lt;br /&gt;
  input.openFile( &amp;quot;rawwaves/sinewave.raw&amp;quot;, true );&lt;br /&gt;
&lt;br /&gt;
  // Open a 16-bit, one-channel WAV formatted output file&lt;br /&gt;
  output.openFile( &amp;quot;hellosine.wav&amp;quot;, 1, FileWrite::FILE_WAV, Stk::STK_SINT16 );&lt;br /&gt;
&lt;br /&gt;
  input.setFrequency( 440.0 );&lt;br /&gt;
&lt;br /&gt;
  // Run the oscillator for 40000 samples, writing to the output file&lt;br /&gt;
  for ( int i=0; i&amp;lt;40000; i++ )&lt;br /&gt;
    output.tick( input.tick() );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -I/usr/include/stk -o sineosc sineosc.cpp -lstk&lt;br /&gt;
$ ./sineosc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es genera hellosine.wav&lt;br /&gt;
&lt;br /&gt;
Exemple rtsine.cpp i crtsine.cpp: (els exemples estan a projects/examples/, i els copio a exemples_meus/)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LINUX_ALSA__ -D__LITTLE_ENDIAN__ -o rtsine ../src/Stk.cpp ../src/Generator.cpp ../src/SineWave.cpp ../src/WvOut.cpp \&lt;br /&gt;
    ../src/RtWvOut.cpp RtAudio.cpp rtsine.cpp -lpthread -lasound&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
no compila perquè no troba Generator.cpp i ../src/WvOut.cpp.&lt;br /&gt;
&lt;br /&gt;
Els exemples rtsine.cpp i crtsine.cpp em compilen, però no ho faig com diu el manual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o rtsine rtsine.cpp -lstk -lasound -ljack&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o crtsine crtsine.cpp -lstk -lasound -ljack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es dóna una explicació clara de què és una funció '''callback''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
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 &amp;quot;single-sample&amp;quot; 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).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o crtsine crtsine.cpp -lstk -lasound -ljack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per compilar l'exemple '''bethree.cpp''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o bethree bethree.cpp -lstk -lasound -ljack&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o controlbee controlbee.cpp -lstk -lasound -ljack&lt;br /&gt;
$ ./controlbee scores/bookert.ski&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o threebees threebees.cpp -lstk -lasound -ljack&lt;br /&gt;
$ ./threebees &amp;lt; scores/bachfugue.ski &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
així de fàcil puc fer sonar una cançó, amb el protocol SKINI que és human readable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./midiprobe&lt;br /&gt;
&lt;br /&gt;
There are 2 MIDI input sources available.&lt;br /&gt;
  Input Port #1: Midi Through:0&lt;br /&gt;
  Input Port #2: Virtual Keyboard:0&lt;br /&gt;
&lt;br /&gt;
There are 5 MIDI output ports available.&lt;br /&gt;
  Output Port #1: Midi Through:0&lt;br /&gt;
  Output Port #2: TiMidity:0&lt;br /&gt;
  Output Port #3: TiMidity:1&lt;br /&gt;
  Output Port #4: TiMidity:2&lt;br /&gt;
  Output Port #5: TiMidity:3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''playsmf''': necessito un sinte extern com pot ser fluidsynth&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /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&lt;br /&gt;
$ ./playsmf midifiles/bwv772.mid 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
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)&lt;br /&gt;
==Síntesi granular: exemple grains.cpp==&lt;br /&gt;
Vull saber com s'utilitza aquesta utilitat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ g++ -Wall -D__LITTLE_ENDIAN__ -D__LINUX_ALSA__ -D__LINUX_JACK__ -I/usr/include/stk -o grains grains.cpp -lstk -lasound -ljack&lt;br /&gt;
&lt;br /&gt;
$ ./grains&lt;br /&gt;
useage: grains file N dur ramp offset delay stretch ramdomness&lt;br /&gt;
    where file = a soundfile to granulate,&lt;br /&gt;
    N = the number of grain voices to use,&lt;br /&gt;
    dur = the grain duration (ms),&lt;br /&gt;
    ramp = the envelope percent (0-100),&lt;br /&gt;
    offset = hop time between grains (ms),&lt;br /&gt;
    delay = pause time between grains (ms),&lt;br /&gt;
    stretch = stetch factor (1-1000),&lt;br /&gt;
    and randomness = factor between 0 - 1.0 to control grain parameter randomness.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Necessito un soundfont per granular. Per exemple, funciona:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./grains ../../exemples_meus/hellosine.wav 1 10 50 1 1 500 .5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
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'': &lt;br /&gt;
* http://www.hispasonic.com/noticias/mogees-reconocimiento-gestual-interactivo-para-mosaicos-audio-tiempo-real-toma-ya/31349&lt;br /&gt;
Com a fitxer origen he utilitzat sinewave.wav, però es poden fer proves amb molts altres samples. Per exemple:&lt;br /&gt;
*http://www.raw-audio-samples.com/nature-sounds&lt;br /&gt;
*http://www.freesound.org/browse/&lt;br /&gt;
&lt;br /&gt;
==Teoria Síntesi granular==&lt;br /&gt;
*http://en.wikipedia.org/wiki/Granular_synthesis&lt;br /&gt;
*http://granularsynthesis.com&lt;br /&gt;
*http://adagio.calarts.edu/~eric/gs.html&lt;br /&gt;
*http://granularsynthesis.com/books.php&lt;br /&gt;
&lt;br /&gt;
=Aplicacions=&lt;br /&gt;
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)&lt;br /&gt;
*http://www.hispasonic.com/noticias/mogees-reconocimiento-gestual-interactivo-para-mosaicos-audio-tiempo-real-toma-ya/31349&lt;br /&gt;
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:&lt;br /&gt;
*http://www.thomann.de/es/schaller_oyster_723.htm&lt;br /&gt;
*http://www.thomann.de/es/schaller_oyster_722.htm&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, gener 2012&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>