#N canvas 115 22 1234 690 10;
#X obj 90 395 hsl 200 15 0 7 0 0 empty slider empty -2 -8 0 10 -233008
-1 -1 0 0;
#X obj 111 468 expr interpolation[i] \; interpolation[i + 1] \; $f1
- i \; int($f1);
#X obj 84 424 t b f;
#X msg 69 370 0.5;
#X text 171 444 índices;
#X obj 197 584 v frac;
#X obj 240 555 v i;
#X floatatom 84 633 0 0 0 0 - - value;
#X obj 84 610 expr a * (1 - frac) + (b * frac);
#X obj 111 565 v a;
#X obj 154 565 v b;
#X text 116 585 i;
#X text 154 585 i+1;
#X floatatom 111 541 0 0 0 0 - - -;
#X floatatom 154 541 0 0 0 0 - - -;
#X floatatom 197 529 6 0 0 0 - - -;
#X floatatom 240 529 0 0 0 0 - - -;
#X text 267 554 parte inteira do índice;
#X text 241 583 parte decimal (ou fracionada);
#X obj 496 41 cnv 15 198 198 empty \$0-lin . -13 -10 0 44 -257983 -258113
0;
#N canvas 0 22 450 300 (subpatch) 0;
#X array interpolation 8 float 0;
#X coords 0 1 7 -1 200 200 1;
#X restore 495 40 graph;
#N canvas 33 202 517 391 plot 0;
#X msg 123 308 label_pos \$2 \$1;
#X obj 123 282 pack;
#X obj 89 194 r value;
#X obj 89 220 * -100;
#X obj 154 202 / 7;
#X obj 154 178 r index;
#X obj 89 247 + 90;
#X obj 153 256 - 13;
#X obj 153 229 * 200;
#X obj 123 336 s \$0-lin;
#X obj 55 51 loadbang;
#X msg 55 72 \; interpolation 0 1 0 0.7 -0.3 0 -1 1 0 \, xticks 0 1
1 \, xlabel -1.1 0 1 2 3 4 5 6 7 \; lagrange 0 0.9 0 -0.5 0.3 0.6 0.9
0 -0.5;
#X msg 287 302 label_pos \$2 \$1;
#X obj 278 276 pack;
#X obj 318 196 / 7;
#X obj 287 330 s \$0-dot;
#X obj 244 214 * -100;
#X obj 318 171 r index;
#X obj 244 178 r value4;
#X obj 244 241 + 87;
#X obj 317 250 - 37;
#X obj 317 222 * 176;
#X connect 0 0 9 0;
#X connect 1 0 0 0;
#X connect 2 0 3 0;
#X connect 3 0 6 0;
#X connect 4 0 8 0;
#X connect 5 0 4 0;
#X connect 6 0 1 0;
#X connect 7 0 1 1;
#X connect 8 0 7 0;
#X connect 10 0 11 0;
#X connect 12 0 15 0;
#X connect 13 0 12 0;
#X connect 14 0 21 0;
#X connect 16 0 19 0;
#X connect 17 0 14 0;
#X connect 18 0 16 0;
#X connect 19 0 13 0;
#X connect 20 0 13 1;
#X connect 21 0 20 0;
#X restore 721 207 pd plot;
#X obj 111 446 nbx 5 14 -1e+37 1e+37 0 0 index empty empty 0 -8 0 10
-220532 -1 -1 0 256;
#X text 146 634 Interpolação entre "a" e "b";
#X text 49 50 Interpolamos para aproximar valores de tabelas a partir
de índices decimais \, tal como 1.5 (entre 1 e 2) \, por exemplo.;
#X text 52 195 Em um índice fracionado que se encontra entre dois pontos
\, pelo menos esses dois pontos devem ser usados para fazer a aproximação.
Uma interpolação linear considera apenas 2 pontos \, e os conecta com
uma reta linear (logo \, a metade do caminho entre um ponto que vale
1 e outro que vale 0 \, é um valor de 0.5).;
#X text 52 283 Essa interpolação linear é feita visualmente para plotar
uma tabela na configuação "polygon". Veja o exemplo a seguir de uma
tablea com 8 pontos visualizada dessa maneira. O ponto vermelho indica
a interpolação de fato. Abaixo \, a implementação em patch.;
#X floatatom 464 648 0 0 0 0 - - -;
#X floatatom 548 591 0 0 0 0 - - -;
#X obj 551 563 hsl 200 15 0 7 0 0 empty slider empty -2 -8 0 10 -233008
-1 -1 0 0;
#X obj 464 624 tabread4 lagrange;
#N canvas 102 25 438 331 tabread_larange 0;
#X obj 44 107 t b f;
#X obj 224 190 v frac;
#X obj 122 190 v a;
#X obj 148 190 v b;
#X obj 173 190 v c;
#X obj 198 190 v d;
#X obj 269 190 v i;
#X obj 44 216 expr b + frac * (c - b - 0.5 / 3 * (1 - frac) * ((d -
a - 3 * (c - b)) * frac + (d + 2 * a - 3 * b)));
#X obj 122 97 expr lagrange[i - 1] \; lagrange[i] \; lagrange[i + 1]
\; lagrange[i + 2] \; $f1 - i \; int($f1);
#X obj 65 162 s index;
#X obj 122 75 clip 1 6;
#X obj 44 43 inlet;
#X obj 44 262 outlet;
#X connect 0 0 7 0;
#X connect 0 1 10 0;
#X connect 7 0 12 0;
#X connect 8 0 2 0;
#X connect 8 1 3 0;
#X connect 8 2 4 0;
#X connect 8 3 5 0;
#X connect 8 4 1 0;
#X connect 8 5 6 0;
#X connect 10 0 8 0;
#X connect 10 0 9 0;
#X connect 11 0 0 0;
#X restore 578 623 pd tabread_larange;
#X floatatom 578 648 0 0 0 0 - - value4;
#X obj 920 382 cnv 15 198 198 empty empty empty 20 12 0 14 -216373
-66577 0;
#X obj 944 382 cnv 15 124 198 empty \$0-dot . -11 87 0 40 -249661 -258113
0;
#X text 925 579 |;
#X text 1052 579 |;
#X text 929 579 _____________________;
#X text 949 589 |;
#X text 1076 589 |;
#X text 953 589 _____________________;
#X text 949 585 |;
#X text 949 579 |;
#X text 1076 585 |;
#X text 1076 580 |;
#X text 1103 589 |;
#X text 1103 585 |;
#X text 1103 580 |;
#X text 976 589 |;
#X text 980 589 _____________________;
#X text 976 585 |;
#X text 976 579 |;
#X text 883 598 0 = n-3;
#X text 1121 597 n-2 = 1;
#X text 1122 610 n-1 = 2;
#N canvas 0 22 450 300 (subpatch) 0;
#X array lagrange 8 float 2;
#X coords 0 1 8 -1 200 200 1;
#X restore 919 381 graph;
#X text 447 268 Já o [tabread4]/[tabread4~] e [tabosc4~] interpolam
no método de Lagrange (uma interpolação polinomial cúbica de 4 pontos).
Ao calcular o valor de um índice quebrado \, ela considera dois pontos
anteriores e outros dois posteriores \, mas não altera os valores de
índices inteiros.;
#X text 720 239 (n = 8);
#X text 446 339 Por necessitar de pelo menos dois pontos anteriores
\, o [tabread4] não lê valores entre o primeiro e segundo índice da
tabela (0 e 1). O mesmo ocorre no final da tabela (lê até o penúltimo).
Ou seja \, só lê de 1 a n-2. Mas o primeiro e último valor fazem diferença
\, pois são consultados para fazer a interpolação.;
#X text 885 583 cópia:;
#X text 1117 582 cópias:;
#X obj 310 449 loadbang;
#X msg 310 472 \; slider 0;
#X text 839 138 Já o ideal para tocar um arquivo em Loop é que se pense
em 3 pontos extras \, um no início da tabela e dois ao final - como
já mencionado no exemplo de osclidador de tabela. Inclusive \, a diferença
também não é muito significativa \, e essa é uma preocupação que é
mais pertinente apenas para fins de osciladores mesmo.;
#X text 840 224 Para tal \, como na tabela abaixo \, o ponto extra
inicial (índice 0) deve ser uma cópia do último (índice n-3) \, e os
dois pontos extras finais (n-2 e n-1) cópias respectivas dos primeiros
(1 e 2).;
#X text 50 82 Um arquivo de som é um conjunto de amostras \, onde cada
uma corresponde a um índice. Objetos como [readsf~] não fazem interpolação
alguma \, portanto tocam o arquivo dentro da taxa de amostragem que
o Pd estiver rodando. Isso significa que só há uma velocidde possível
de reprodução. Já uma interpolação uma leitura em qualquer velocidade
\, mesmo que \, a cada ponto de leitura \, você caia entre uma amostra
e outra.;
#X text 446 421 Neste próximo exemplo temos 8 pontos (n = 8). Portanto
leremos apenas dos índices 1 ao n-2 (6). Abra o subpatch abaixo para
consultar a implementação em patch da fórmula de interpolação. À direita
\, temos a tabela que está sendo lida de forma interpolada com opção
de visualização em pontos que acabam sendo visualisados como traços
dado o tamanho pequeno da tabela \, mas considere o início do traço
como o ponto de fato). O ponto vermelho representa a interpolação.
;
#X text 838 68 Deixamos de ler a primeira e a última amostra de um
arquivo de som com [tabread4~]. Mas trata-se de um intervalo de tempo
tão irrisório que \, na prática \, não faz diferença. Em todo caso
\, basta inserir uma amostra zerada no começo e no final do arquivo
para evitar isso.;
#X text 843 287 Dessa maneira podemos ter um loop que vai do índice
1 a n-2 (que é o conjunto de índices que o [tabread4] consegue ler
mesmo) - e já que n-2 é uma cópia do índice 1 \, chegar nele é como
voltar ao início da tabela.;
#X connect 0 0 2 0;
#X connect 1 0 13 0;
#X connect 1 1 14 0;
#X connect 1 2 15 0;
#X connect 1 3 16 0;
#X connect 2 0 8 0;
#X connect 2 1 22 0;
#X connect 3 0 2 0;
#X connect 8 0 7 0;
#X connect 13 0 9 0;
#X connect 14 0 10 0;
#X connect 15 0 5 0;
#X connect 16 0 6 0;
#X connect 22 0 1 0;
#X connect 28 0 30 0;
#X connect 28 0 31 0;
#X connect 29 0 28 0;
#X connect 30 0 27 0;
#X connect 31 0 32 0;
#X connect 61 0 62 0;
