Comments (6)
j'ai un peu exploré la bête, et j'en viens à la conclusion que le systeme de production du son dans les grains est beaucoup trop gourmand, et génère même des soucis de "rémanance" du son :
- tout est calculé à chaque tour de boucle de generation du son pour chaque grain, y compris l'exploration de tous les samples pour voir s'il est dedans... je pense que c'est de là que vient le probleme de performance.
- il serait préférable, selon moi, de calculer tout cela au moment de la création du grain et de le recalculer au besoin si celui ci change de place, ou si on deplace un sample, ou toute autre chose qui agit sur les grains. et de n'avoir qu'à lire les "waves" des grains dans la boucle de generation de son.
from frontieres.
Apparemment le passage de 2 à 16 canaux a un impact tout à fait considérable, il faut examiner ce qui se passe à ce niveau-là.
D'après le profiling, la très vaste majorité du temps de calcul est consommée par Grain::nextBuffer
(ce qui paraît tout à fait logique)
C'est cette procédure qui est le point sensible et qui doit être optimisée au mieux possible.
Elle se structure d'une manière imbriquée comme ceci :
*
pouri
= 0 → nombre de trames à calculer**
pourj
= 0 → nombre d'échantillons actifs***
si l'échantillon n'est pas terminé****
si l'échantillon est stéréo/mono***
pourk
= 0 → nombre de canaux
Idées
- Ceci est inefficace en terme de cache de données, car chaque itération va passer successivement d'un échantillon à un autre. Ce serait bien mieux si une solution permettait d'intervertir les boucles
i
etj
. - Pour cela il faut voir ce que l'on doit faire avec la boucle
k
. Sans savoir trop ce que ça fait a priori, j'observe que ça parle de mono et stéréo. Est-ce que c'est nécessaire de répéter cette partie autant de fois qu'il y a de canaux ?
Est-ce que leclip
est véritablement nécessaire ici ? j'en doute. On peut faire cela tout à la fin du traitement. Voire pas du tout. C'est en nombre flottant, le système audio sous-jacent peut s'en occuper. - On peut faire sauter le switch
****
. Cela fait un branchement en moins, que l'on peut réaliser en faisant duplication du corps de fonction, une fois que la bouclej
est réordonnée pour être mise en premier. On pourrait faire ça proprement avec untemplate <unsigned int C>
, où la constante C désigne le nombre de canaux de l'échantillon (1 mono/2 stéréo).
from frontieres.
en fait , le processus ne s'arrete pas dans le nextbuffer du cloud, mais invoque le nextbuffer de chaque grain, qui lui meme explore tous les samples à chaque fois.
j'etais pour ma part en train d'explorer l'idee suivante :
- produire en amont, hors boucle nextbuffer, un echantillon de son correspondant à ce que le nextbuffer des grains produit, suffisamment long pour correspondre à un bouclage du son (cela pose un probleme de taille si on a des vibratos longs, c'est là que le butte pour le moment)
- alleger considerablement du coup le nextbuffer de cloud qui se contenterait de lire cet echantillon en entretenant un curseur de bouclage sur celui ci.
- chaque modification des parametres du cloud entrainerait un recalcul de cet echantillon, hors boucle de lecture (avec un echange en fin de recalcul , sous protection du verrou memoire de scene)
- pour le moment tout cela n'est que theorique dans ma tete, et j'ai une crainte sur la faisabilité de la chose, non seulement à cause de cette longeur d'echantillon, mais aussi sur la perte du temps reel dans les changements sur les parametres d'un buffer, et j'envisageais de laisser la methode actuelle et d'introduire un parametre supplementaire qui permettrait de basculer d'une methode a l'autre pour un cloud.
pour ce qui est de la perte de performance en 16 canaux, elle n'est effective que si on laisse le son en 16 canaux.
des qu'on le met en stereo sur les canaux 4 et 5 par exemple, cela revient au meme qu'avant.
pour ce qui est des imbrications de boucles, j'avoue que j'ai planché dessus sans vraiment saisir le sens de tout ça, et ai laissé tomber cette piste, donc toute amélioration à ce niveau est bienvenue (et peut etre serait ce suffisant)
from frontieres.
ou en es tu des suggestions que tu avais faites ici ?
je pense que tout le corps de la production sonore est à revoir à la fois pour les performances et pour l'histoire de retard du son (remanance).
serait ce une bonne idée que les grains contiennent les sons, mis à jour dans leur positionnement visuel ?
from frontieres.
Ça n'a pas dépassé le stade de suggestion pour l'instant.
Je ne pense pas que mettre en cache un segment d'audio pour le rejouer en boucle soit vraiment une solution réalisable.
A supposer que ça soit possible de mettre en cache des segments d'audio, qui sont invalidés par le paramétrage dynamique de scène, cela veut quand même dire que tu vas avoir : des cycles rapides (le cache est prêt), ou des cycles lents (pas encore prêt)
Ça implique que tu as toujours à faire de temps en temps au pire cas en complexité de calcul, qui reste la même. En contrainte temps réel, c'est une mauvaise chose.
from frontieres.
ok, je ne vais donc pas continuer de reflechir à cette piste, ça m'arrange même en fait parceque je me heurtais à pas mal de problèmes logiques
from frontieres.
Related Issues (20)
- site web et forum frontieres HOT 2
- probleme de deploiement de la release continue HOT 3
- fichier (semblant) inutile HOT 1
- Support du protocol NSM HOT 1
- la release automatique ne fonctionne plus HOT 3
- Traduire la vitesse en BPM HOT 1
- [Feature Request] rendre l'interface Qt traduisible HOT 3
- [feature request] onglet de menu "à propos" HOT 2
- [feature request] auto-connexion des ports jack HOT 3
- [bogue] problème de crênelage HOT 3
- [feature request] option de menu affichant tous les raccourcis clavier HOT 5
- [feature request] fournir une documentation embarquée HOT 16
- ne peux plus compiler dans qt HOT 21
- ajout de trajectoires des clouds HOT 54
- décodage de format audio MP3 HOT 5
- BUG en chargeant des fichiers HOT 2
- Mettre en place un suivi de numéros de version et viser la distribution HOT 17
- la destruction d'un cloud devrait explorer les combinaisons midi pour en enlever ce cloud s'il est utilisé HOT 1
- les parametres de trajectoires doivent etre copiés dans les trajectoires midi à leur modification depuis la fenetre parametres HOT 1
- pouvoir gerer un buffer audio entrant HOT 10
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from frontieres.