Cage-synth

OK - ik ga zelf zo'n programmaatje proberen te schrijven. Lukt dat niet dan kan ik altijd nog op mijn eerdere plan terugvallen. Zal ik dat progje dan gelijk maar in Csound of ChucK schrijven zodat ik het ook in de Cage-synth kan gebruiken, of liever met een wetenschappelijk programma als Python, Scilab, o.i.d.?
 
Als je de benodigde commando's en functies voor dit soort rekenwerk tot je beschikking hebt in Csound of Chuck, dan kun je inderdaad dat later weer hergebruiken. Weet niet hoe snel dat is, net als dingen als Pyhthon en Scilab e.d. Zou ik aan zoiets werken, kan me voorstellen dat ik het zou willen automatiseren om snel veel rekenwerk te kunnen verrichten en een vlotte general purpose taal zal dan waarschijnlijk de voorkeur hebben in de fase waar je nu bent. Later de bruikbare algoritmen die je hebt geschreven omzetten zal vast niet zo moeilijk zijn. Maar meerdere wegen leiden naar Rome, hangt misschien ook af van waar al ervaring mee hebt.
 
Eerst maar even de wiskundige basis. Het gaat ons om de n-tallige representaties van 0,219780219780219780... . Laten we dat getal X noemen. Omdat X < 1 hebben alle n-tallige representaties enkel cijfers achter de komma, voor de komma staat alleen een nul. De n-tallige representatie [imath] (0,c_1c_2c_3 ...)_n [/imath] van X vinden we dan aldus:

[imath] X = c_1 \cdot n^{-1} + c_2 \cdot n^{-2} + c_3 \cdot n^{-3} + c_4 \cdot n^{-4} + ... [/imath]
[imath] n \cdot X = c_1 + c_2 \cdot n^{-1} + c_3 \cdot n^{-2} + c_4 \cdot n^{-3} + ... [/imath]
[imath] \mathrm{int}(n \cdot X) = c_1 [/imath]

[imath] X - c_1 \cdot n^{-1} = c_2 \cdot n^{-2} + c_3 \cdot n^{-3} + c_4 \cdot n^{-4} + ... [/imath]
[imath] n^2 \cdot (X - c_1 \cdot n^{-1}) = c_2 + c_3 \cdot n^{-1} + c_4 \cdot n^{-2} + ... [/imath]
[imath] \mathrm{int}(n^2 \cdot (X - c_1 \cdot n^{-1})) = c_2 [/imath]

[imath] X - c_1 \cdot n^{-1} - c_2 \cdot n^{-2} = c_3 \cdot n^{-3} + c_4 \cdot n^{-4} + ... [/imath]
[imath] n^3 \cdot (X - c_1 \cdot n^{-1} - c_2 \cdot n^{-2}) = c_3 + c_4 \cdot n^{-1} + ... [/imath]
[imath] \mathrm{int}( n^3 \cdot (X - c_1 \cdot n^{-1} - c_2 \cdot n^{-2})) = c_3 [/imath]

Enzovoort
 
Voor het programmeren hebben we alleen onderstaande algoritme nodig:

[imath] \mathrm{int}(n^1 \cdot X) = c_1 [/imath]
[imath] \mathrm{int}(n^2 \cdot (X - c_1 \cdot n^{-1})) = c_2 [/imath]
[imath] \mathrm{int}( n^3 \cdot (X - c_1 \cdot n^{-1} - c_2 \cdot n^{-2})) = c_3 [/imath]
Enzovoort
 
Ik denk niet dat bovenstaande in de muzikale praktijk gaat werken. Deze algoritme weet niets van repeterende perioden in de n-tallige representatie (dat wil zeggen in het signaal) en zal voor een toon van een paar seconden al snel met getallen van duizenden cijfers moeten rekenen om de opeenvolgende cijfers te blijven vinden.
 
Helaas - ik begrijp het progje op Wikipedia niet. Dan maar weer hiermee verder:
Voor het programmeren hebben we alleen onderstaande algoritme nodig:

[imath] \mathrm{int}(n^1 \cdot X) = c_1 [/imath]
[imath] \mathrm{int}(n^2 \cdot (X - c_1 \cdot n^{-1})) = c_2 [/imath]
[imath] \mathrm{int}( n^3 \cdot (X - c_1 \cdot n^{-1} - c_2 \cdot n^{-2})) = c_3 [/imath]
Enzovoort
We zien vanzelf waar het schip strandt.
 
Het is mij ook niet onmiddellijk duidelijk, aan de hand van een voorbeeld met getallen en de uitleg onder de listing moet het misschien toch lukken.
 
Er staat op Wikipedia zelfs niet bij welke programmeertaal het moet voorstellen. Ik heb vroeger op school wat met Assembleertaal en Basic geprogrammeerd, en later nog wat dingetjes met Python. Dat is het wel zo ongeveer. Dus verwacht van mij niet al te veel. :o:

Laat:
[imath] R_1 = X [/imath]
[imath] R_{k+1} = R_k - c_k \cdot n^{-k} [/imath]

Zodat:
[imath] \mathrm{int}(n^1 \cdot R_1) = c_1 [/imath]
[imath] \mathrm{int}(n^2 \cdot R_2) = c_2 [/imath]
[imath] \mathrm{int}( n^3 \cdot R_3)= c_3 [/imath]
Enzovoort

Dat wil zeggen:
[imath] \mathrm{int}(n^k \cdot R_k) = c_k [/imath]


En dat begint al aardig op een progje te lijken...
 
Zoiets?

flow-diagram.png
 
Dit loopje werkt in ChucK:

Code:
for (1 => int k; k < 10000; k++)
    {
<<< k >>>; // print value of k
samp => now; // advance time
}

Het print razendsnel 1 t/m 9999 .
 
Code:
// array declaration
int a[10000];
44 => a[1000];
<<< a[1000] >>>;

Dit werkt ook, zo definieer je een array van 10000 integers, vul je plaatsen in die array en print je ze weer uit.
 
Welke variabele-typen kun je gebruiken? Voor kleine perioden zal het waarschijnlijk wel lukken, en zodra je een herhaling ziet hoef je niet verder te rekenen. Maar met langere perioden kom je op een punt dat de precisie onvoldoende is.
 
Daar zit ik nu inderdaad mee! X (en vervolgens [imath] R_k [/imath]) zou duizenden cijfers achter komma moeten hebben, maar ChucK kapt dat voor een "float" al heel snel af.
 
Laatst gewijzigd:
Echt heel moeilijk lijkt me het niet om het om te zetten voor meer precisie, een array met de grootte die de gewenste precisie geeft en waar je de calculatie op loslaat.
 
Je bedoelt om de cijfers van X en [imath] R_k [/imath] in een array te zetten en dan de benodigde rekenkundige bewerkingen zoals [imath] R_{k+1} = R_k - c_k \cdot n^{-k} [/imath] en [imath] \mathrm{int}(n^k \cdot R_k) = c_k [/imath] te programmeren via bewerkingen op de cijfers in die arrays?
 
Ja, want het lijkt me dat je geen andere mogelijkheid hebt als de vereiste precisie hoger is dan je eenvoudig met de standaard variabelen-typen kunt berekenen. Dus kijken hoe je de calculatie kunt uitvoeren met een array, denk ik. Meer werk, maar het zijn basisbewerkingen die je moet uitvoeren, niet heel moeilijk.
 
Dat gaat me toch echt te veel werk worden. Ik zal daar dan naar schatting een paar maanden mee zoet zijn, want hoe eenvoudig het op het eerste gezicht ook lijkt er duiken altijd onverwachte problemen op. En in het gunstigste geval zou ik dan een high precision calculator gebouwd hebben, wat niets nieuws is. Dus nee - dat gaat 'm niet worden. Maar ik wil het onderzoek van representaties met grote n nog een laatste kans geven. Met het volgende Python-pakket zou 'floating-point arithmetic with arbitrary precision' mogelijk moeten zijn: mpmath - Python library for arbitrary-precision floating-point arithmetic
Als ik dat op mijn computer de praat krijg lukt het misschien toch...
 
Dat is misschien ook een mogelijkheid. Maar ik denk dat het echt wel meevalt om in dit geval zelf iets te schrijven. De bewerkingen zijn an sich niet moeilijk. Hieronder een voorbeeld hoe je de faculteit van een getal kunt berekenen, dan krijg je ook als snel getallen die niet "passen" in de beschikbare variabelen-typen. Als je de pseudocode leest, het is niet eens veel anders dan hoe je het met pen en papier zou uitrekenen. In jouw geval eigenlijk net zo.

 
Code:
from mpmath import mp
mp.dps = 50000
print(1/mpf("4.55"))

Dat geeft:
0.219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780219780

(En zo verder voor ruim 12 blz. lang. Ik kan de hele uitkomst niet posten want dat weigert de software van SynthForum te plaatsen.)
 
Back
Top