#N canvas 91 108 1171 425 10;
#X obj 452 122 bang~;
#X obj 499 270 tabread4~ \$0-sample;
#X obj 499 219 vline~;
#X obj 452 161 float;
#X obj 553 300 hsl 128 15 0 1 0 0 empty ganho empty -2 -8 0 10 -204786
-1 -1 0 1;
#N canvas 92 25 441 334 sampler 0;
#X obj 195 83 loadbang;
#X obj 67 234 soundfiler;
#X obj 197 248 table \$0-sample;
#X obj 67 174 symbol \$0-sample;
#X obj 67 110 openpanel;
#X obj 67 49 inlet;
#X obj 67 262 v sample_size_\$0;
#X obj 306 115 samplerate~;
#X obj 306 150 / 1000;
#X obj 354 145 v sr;
#X obj 306 176 v sr_KHz;
#X msg 195 123 \; tempo 5 \; cents -400 \; bloc-set 4096 \; pd dsp
1;
#X msg 67 205 read -resize ../samples/bubul.wav \$1;
#X connect 0 0 11 0;
#X connect 0 0 3 0;
#X connect 0 0 7 0;
#X connect 1 0 6 0;
#X connect 3 0 12 0;
#X connect 4 0 3 0;
#X connect 5 0 4 0;
#X connect 7 0 8 0;
#X connect 7 0 9 0;
#X connect 8 0 10 0;
#X connect 12 0 1 0;
#X restore 530 74 pd sampler;
#X obj 499 245 expr~ fmod($v1 \, sample_size_\$0);
#X obj 929 356 hsl 128 15 0 1 0 0 empty ganho empty -2 -8 0 10 -204786
-1 -1 0 1;
#X text 1009 285 cents;
#X obj 998 303 nbx 5 16 -1e+37 1e+37 0 0 empty cents empty 0 -8 0 13
-236782 -1 -1 -400 256;
#X obj 875 302 nbx 4 16 -1e+37 1e+37 0 0 empty tempo empty 0 -8 0 13
-183865 -1 -1 5 256;
#X obj 936 302 nbx 4 16 64 8192 0 0 empty bloc-set empty 0 -8 0 13
-257904 -1 -1 4096 256;
#X text 956 283 grão;
#X text 882 283 tempo;
#N canvas 73 41 1183 668 Sampler_Granulador 0;
#X obj 68 210 bang~;
#X obj 68 476 tabread4~ \$0-sample;
#X obj 68 266 t f f;
#X msg 68 383 \$1 \, \$2 \$3;
#X obj 68 407 vline~;
#X obj 195 151 / 100;
#X obj 195 198 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 10
-204800 -1 -1 204.8 256;
#X obj 180 218 +;
#X obj 372 620 outlet~;
#X obj 195 23 inlet;
#X obj 68 240 f;
#X obj 180 242 expr if ($f1 < 0 \, $f1 + sample_size_\$0 \, fmod($f1
\, sample_size_\$0));
#X obj 300 92 t b f;
#X obj 300 23 inlet;
#X msg 361 89 set \$1;
#X text 488 248 loop;
#X text 208 217 contador;
#X text 32 188 bang a cada bloco;
#X obj 327 145 v block_\$0;
#X obj 195 174 expr $f1 * block_\$0;
#X obj 432 434 phasor~;
#X obj 432 458 /~ 2;
#X obj 491 433 bang~;
#X msg 491 454 0;
#X obj 432 484 sin~;
#X obj 432 407 expr~ sr / block_\$0;
#X obj 372 532 *~;
#X text 471 485 Envelope;
#X obj 542 175 expr pow(2 \, ($f1/1200));
#X floatatom 542 262 8 0 0 0 - - -;
#X obj 542 23 inlet;
#X obj 741 56 cnv 15 385 100 empty empty Velocidade: 11 12 0 14 -188027
-66577 0;
#X obj 741 157 cnv 15 385 140 empty empty TransposiÃ§Ã£o: 8 13 0 14
-236782 -66577 0;
#X obj 542 112 nbx 5 18 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 15
-236782 -1 -1 -400 256;
#X text 550 93 transposição;
#X text 625 112 (cents);
#X obj 195 125 nbx 5 18 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 15
-183865 -1 -1 5 256;
#X text 105 125 velocidade (%);
#X text 254 196 velocidade vezes tamanho do bloco/grão;
#X obj 741 308 cnv 15 385 110 empty empty Leitura: 5 12 0 14 -232608
-66577 0;
#X obj 300 56 nbx 5 18 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 15
-257904 -1 -1 4096 256;
#X text 230 57 bloco/grão;
#X obj 417 558 delay~ 4096;
#X obj 293 476 tabread4~ \$0-sample;
#X obj 417 532 *~;
#X obj 372 584 +~;
#X obj 741 431 cnv 15 385 160 empty empty Overlap: 5 12 0 14 -228911
-66577 0;
#X obj 68 356 pack f f f;
#X text 763 77 Os passos de leitura são dados pela seção do "Contador".
Velocidades negativas lêem o sample em passos no sentido contrário.
Trabalhamos com valores em porcentagem do tamanho do bloco (50 = metade
\, 200 = dobro \, etc). O [bang~] alimenta o contador de acordo com
o tamanho de bloco.;
#X text 753 240 Isso se dá porque lemos o grão em um mesmo período
de tempo. É a mesma ideia de aumentar ou diminuir a velocidade de rotação
de um vinil \, ou de leitura de fita.;
#X obj 96 299 expr $f1 + (block_\$0 * $f2) \; block_\$0 / sr_KHz \;
block_\$0 / 2;
#X text 596 263 razão;
#X text 756 336 O [vline~] lê o sample pelo [tabread4~] \, e recebe
3 dados: a) um ponto de início de leitura do sample \, gerado no contador
\, b) esse ponto de partida somado ao tamanho do bloco vezes a transposição
- indicando o ponto de chegada - e c) o tempo de duração do bloco/grão
em ms.;
#X obj 68 435 expr~ fmod($v1 \, sample_size_\$0) \; fmod($v1 + overlap_\$0
\, sample_size_\$0);
#X floatatom 261 348 8 0 0 0 - - -;
#X obj 271 370 s \$0-overlap;
#X obj 261 394 v overlap_\$0;
#X obj 480 515 r \$0-overlap;
#X floatatom 480 537 8 0 0 0 - - -;
#X text 756 459 Por fim \, aplicamos um envelope. A frequência do envelope
é dada pela taxa de amostragem dividida pelo tamanho do bloco. O [phasor~]
é forçado a se manter em fase com o bloco de áudio com um [bang~].
;
#X text 755 520 Temos ainda dois grãos defasados e sobrepostos. O tamanho
do overlap é a metade do bloco. Temos então a leitura de um grão com
essa defasagem \, que é atrasado e defasado de fato com um objeto [delay~].
;
#X obj 358 110 cnv 15 50 30 empty empty empty 20 12 0 14 -183930 -66577
0;
#X obj 361 117 block~;
#X text 752 180 Convertemos cents para razão e multiplicamos pelo tamanho
do bloco \, gerando um novo tamanho de grão - que \, se for o dobro
\, dá uma oitava acima \, se for a metade \, uma oitava abaixo \, e
assim por diante.;
#X connect 0 0 10 0;
#X connect 1 0 26 0;
#X connect 2 0 47 0;
#X connect 2 1 50 0;
#X connect 3 0 4 0;
#X connect 4 0 53 0;
#X connect 5 0 19 0;
#X connect 6 0 7 1;
#X connect 7 0 11 0;
#X connect 9 0 36 0;
#X connect 10 0 2 0;
#X connect 10 0 7 0;
#X connect 11 0 10 1;
#X connect 12 0 36 0;
#X connect 12 1 18 0;
#X connect 13 0 40 0;
#X connect 14 0 62 0;
#X connect 19 0 6 0;
#X connect 20 0 21 0;
#X connect 21 0 24 0;
#X connect 22 0 23 0;
#X connect 23 0 20 1;
#X connect 24 0 26 1;
#X connect 24 0 44 1;
#X connect 25 0 20 0;
#X connect 26 0 45 0;
#X connect 28 0 29 0;
#X connect 29 0 50 1;
#X connect 30 0 33 0;
#X connect 33 0 28 0;
#X connect 36 0 5 0;
#X connect 40 0 12 0;
#X connect 40 0 14 0;
#X connect 42 0 45 1;
#X connect 43 0 44 0;
#X connect 44 0 42 0;
#X connect 45 0 8 0;
#X connect 47 0 3 0;
#X connect 50 0 47 1;
#X connect 50 1 47 2;
#X connect 50 2 54 0;
#X connect 53 0 1 0;
#X connect 53 1 43 0;
#X connect 54 0 56 0;
#X connect 54 0 55 0;
#X connect 57 0 58 0;
#X connect 58 0 42 1;
#X restore 875 328 pd Sampler_Granulador;
#X obj 530 47 bng 20 250 50 0 empty empty empty 17 7 0 10 -241326 -1
-1;
#X text 558 47 Abrir outro arquivo;
#X text 41 31 Temos agora um princípio de granulação que nos permite
um controle independente de transposição e velocidade.;
#X text 44 66 A base é um [vline~] que recebe os grãos de leitura a
partir de um contador \, onde o tamanho do grão é sempre igual ao tamanho
do bloco. O contador é alimentado por um [bang~] \, que envia um bang
a cada bloco.;
#X obj 499 159 expr fmod($f1 \, sample_size_\$0) \; 64 / sr_KHz;
#X obj 499 137 + 64;
#X text 531 137 contador (tamanho do bloco);
#X text 694 159 loop;
#X text 694 172 bloco em ms;
#X text 691 246 loop;
#X text 46 279 Temos um mecanismo de loop tanto no contador quanto
na leitura da tabela que é baseado na função "fmod" \, que é a mesma
função [mod] que já usamos para fazer loop em sequencers \, mas que
trabalha com pontos decimais.;
#X text 47 343 O [vline~] recebe o ponto de chegada de cada grão e
o tempo em ms do bloco \, que é dado pelo bloco divido pela taxa de
amostragem em KHz.;
#X text 802 155 Esse mesmo patch será ainda a base para um Phase Vocoder
implementado em FFT \, com o mesmo objetivo de controle independente
de velocidade e transposição.;
#N canvas 0 22 450 300 output 0;
#X obj 206 206 *~;
#X obj 225 175 line~;
#X msg 225 149 \$1 10;
#X obj 225 113 pow 4;
#X obj 190 245 dac~;
#X obj 226 60 inlet;
#X obj 177 60 inlet~;
#X connect 0 0 4 0;
#X connect 0 0 4 1;
#X connect 1 0 0 1;
#X connect 2 0 1 0;
#X connect 3 0 2 0;
#X connect 5 0 3 0;
#X connect 6 0 0 0;
#X restore 499 322 pd output;
#N canvas 0 22 450 300 output 0;
#X obj 206 206 *~;
#X obj 225 175 line~;
#X msg 225 149 \$1 10;
#X obj 225 113 pow 4;
#X obj 190 245 dac~;
#X obj 226 60 inlet;
#X obj 177 60 inlet~;
#X connect 0 0 4 0;
#X connect 0 0 4 1;
#X connect 1 0 0 1;
#X connect 2 0 1 0;
#X connect 3 0 2 0;
#X connect 5 0 3 0;
#X connect 6 0 0 0;
#X restore 875 378 pd output;
#X text 46 220 Esse exemplo na janela principal apenas exemplifica
o mecanismo de leitura dos grãos (que correspondem a um tamanho de
bloco de 64 amostras). O patch é apenas capaz de ler um arquivo de
som na velocidade normal.;
#X text 801 24 No subpatch abaixo \, podemos definir um tamanho de
grão diferente de 64 \, desde que seja igual a uma potência de 2 \,
pois é uma restrição do Pd para processamento de áudio.;
#X msg 915 250 512;
#X msg 953 262 1024;
#X msg 944 219 2048;
#X text 976 239 Potências de 2;
#X msg 892 227 8192;
#X msg 948 241 4096;
#X text 47 134 O tamanho do bloco é \, por padrão \, de 64 amostras.
Podemos mudar com o objeto [block~] \, que define um novo tamanho de
bloco em um patch ou subpatch. O problema de mudar o tamanho do bloco
na janela principal é que o [dac~] e o [adc~] só funcionam mesmo com
um bloco de 64 amostras. Por isso costumamos mudar o tamanho do bloco
em um subpatch.;
#X text 802 78 Abra o subpatch para ver como é possível \, baseado
nesse princípio apresentado à esquerda \, um controle independente
de compressão e expansão de tempo (Time Strech/Time Compress) em porcentagem
e mudança de altura (Pitch Shifting) em cents.;
#X connect 0 0 3 0;
#X connect 1 0 28 0;
#X connect 2 0 6 0;
#X connect 3 0 20 0;
#X connect 4 0 28 1;
#X connect 6 0 1 0;
#X connect 7 0 29 1;
#X connect 9 0 14 2;
#X connect 10 0 14 0;
#X connect 11 0 14 1;
#X connect 14 0 29 0;
#X connect 15 0 5 0;
#X connect 19 0 2 0;
#X connect 19 0 3 1;
#X connect 19 1 2 1;
#X connect 20 0 19 0;
#X connect 32 0 11 0;
#X connect 33 0 11 0;
#X connect 34 0 11 0;
#X connect 36 0 11 0;
#X connect 37 0 11 0;
