Bom dia!
1) Para colocar tabelas dentro de tabelas, você pode fazer coisas do tipo t[i] = ofTable() e depois acessar os elementos de t[i] com a sintaxe t[i][j]. Além disso, tabelas em Lua também podem ser usadas com a sintaxe de structs em C: ao invés de criar elementos indexados numericamente, você poderia guardar valores em variáveis com nomes t[i].F, t[i].L, etc. Como exemplo de sintaxe, o objeto [ofelia] abaixo cria uma tabela t cheia de dados heterogêneos, matrizes e estruturas, e depois varre todos os seus elementos:
ofelia f;
-- cria tabela t;
t=ofTable();
t[1]=1;
t[2]="dois";
-- cria tabela s e vincula a t[2] (empurrando o elemento t[2] para a frente);
s=ofTable();
table.insert(t, 2, s);
-- insere na tabela s que também é t[2];
s[1]=3.5;
-- cria tabela/struct;
t[4] = ofTable();
t[4].x = 5;
t[4].y = "seis";
-- varre tabela t;
for i=1, #t do;
-- se t[i] é uma tabela, varre os elementos de t[i];
if type(t[i])=="table" then;
print("t["..i.."] é uma tabela:");
-- se t[i] é uma tabela indexada, percorre os índices;
if #t[i]>0 then;
for j=1, #t[i] do;
print("t["..i.."]["..j.."]="..t[i][j]);
end;
else;
-- se t[i] é do tipo struct, percorre seus campos;
for k, v in pairs(t[i]) do;
print("t["..i.."]."..k.."="..v);
end;
end;
-- se t[i] não é uma tabela, simplesmente imprime seu valor;
else print("t["..i.."]="..t[i]);
end;
end;
a saída desse objeto (quando recebe um bang) é:
t[1]=1
t[2] é uma tabela:
t[2][1]=3.5
t[3]=dois
t[4] é uma tabela:
t[4].y=seis
t[4].x=5
2) a função perform é chamada a cada ciclo DSP e deve produzir uma tabela de tamanho 64 com a soma de todos os eventos que estão ativos naquele instante. Para isso, seu código deve ter a estrutura:
para cada amostra n=1...64 faça
saida[n] = 0
para cada evento e=1...K ativo no instante n faça
x = amostra n do evento e
saida[n] = saida[n]+x
O resto naturalmente é ajustar a sintaxe para percorrer as suas estruturas de dados do jeito que você as definiu. Pode ser conveniente escrever funções auxiliares para deixar o código mais fácil de depurar.