Outils pour utilisateurs

Outils du site


ibniz

Ceci est une ancienne révision du document !


Table des matières

Ibniz

Il y avait un article sur Ibniz sur le précédent wiki.

Principes & Fonctionnement

Je propose de documenter un peu le fonctionnement d'Ibniz. Pour cela, je commence par copier coller une base d'explication qui sera amélioré au fur et à mesure.

Raw

Le principe de ibniz, c'est qu'il y a un compteur incrémenté de 0000.0000 jusqu'à FFFF.FFFF puis repasse à 0 en boucle. C'est de l'hexadécimal, en fait si on convertit en décimale, le compteur est incrémenté de 0 jusqu'à 65535. Pour la vidéo, le compteur est incrémenté par pas de OOOO.OOO1 soit 1/65536. Pour l'audio, le compteur est incrémenté par pas de 0000.0040 soit 1/1024. Pour la vidéo, le compteur va donc avoir les valeur suivantes : 0, 1/65536, 2/65536, …, 65535/65536, 1, 65537/65536, …, 65535, 0, … Pour l'audio, le compteur va donc avoir les valeur suivantes : 0, 1/1024, 2/1024, …, 1023/1024, 1, 1025/1024, …, 65535, 0, … Tu as peut être déjà entendu parlé de la “dent de scie” c'est de ce compteur que l'on parle. Cela est expliqué ici : http://countercomplex.blogspot.com/2011/12/ibniz-hardcore-audiovisual-virtual.html Ensuite le compteur est incrémenté à une certaine vitesse. Cela dépend de la vitesse de calcul de la machine que tu utilise, mais avec 60 FPS, le compteur compte de 0 à 60 en 1 sec, cela fait 60*1024 incrément audio. Cela veut dire que 60 fois par seconde, la partie décimale du compteur passe de 0 à 1 par incrément de 1/1024. Du côté de la production sonore de Ibniz, en fait, ibniz prend en entrée une valeur comprise entre 0 et 1 et produit un son. Donc par défaut, la dent de scie est envoyé et une dent de scie qui varie 60 fois par seconde entre 0 et 1 cela produit le son par défaut de Ibniz. D'un autre côté, la note LA, est produite par une sinusoide de fréquence 220 Hz. Je pense que tu vois ce que c'est une sinusoide ? Si tu veux produire un LA avec Ibniz, il produire non pas une dent de scie, mais une sinusoide qui varie entre 0 et 1 à 220 Hz. Il faut donc convertir la dent de scie entre 0 et 1 qui varie 60 fois par seconde en sinusoide qui varie entre 0 et 1 220 fois par seconde. Pour cela, il y a une fonction sin dans ibniz qui prend une valeur en entrée et retourne une valeur comprise entre -1 et 1. sin 0 = 0 sin Pi/2 = 1 (Pi/2 correspond à un angle de 90°) sin Pi = 0 sin 3*Pi/2 = -1 sin 2*Pi = 0 On dit que la fonction sin est periodique de periode 2*Pi. Si on arrive à faire varier l'entrée du sin de 0 à 2*Pi 220 fois par seconde, on peut créer une sinusoide à 220 Hz. Pour cela, il suffit de faire un croix. Au départ, la dent de scie compte de 0 à 60 en une seconde. On veut compter de 0 à 220 * 2 Pi en une seconde, sachant que la fonction sinus d'Ibniz mutltiplie déjà l'entrée de la fonction par 2*Pi (c'est écrit dans la doc ici : http://pelulamu.net/ibniz/ibniz.txt). Il suffit donc de compter de 0 à 220 chaque seconde et envoyer cela dans la fonction sinus de Ibniz pour produire une sinusoide. Pour cela, il faut multiplier la dent de scie par 220/60 (produit en croix). Ensuite, la fonction sinusoide d'Ibniz retourne une valeur entre -1 et 1 or, nous avons besoin de renvoyer une valeur comprise entre 0 et 1 pour produire du son. On peut donc modifier le résultat final comme suit : D'abort on ajoute 1 au résultat qui va donc varier entre 0 et 2, puis on divise par 2 le résultat. Si je met tout bout à bout, cela fait quelque chose comme ceci : (sin (compteur * 220/60) + 1) / 2 Si on traduit ça en Ibniz, il faut convertir les décimal en hexa. 220/60 ⇒ DC/3C ; 1 ⇒ 1 ; 2 ⇒ 2 Donc si tu tape cela dans Ibniz, théoriquement, cela devrait produire un LA si ton Ibniz tourne bien à 60 FPS : DC* 3C/ s 1+ 2/

La notation polonaise inversée, c'est un coup à prendre. Moi même je suis trop jeune pour avoir eu à l'utiliser. Son intérêt principal est que l'on a pas besoin de parenthèse pour définir les priorités des calculs. Je ne pense pas t'apprendre quelque chose en te disant que la multiplication est prioritaire sur l'addition, donc si tu écrit 3 + 10 * 2 le résultat est 23 et non pas 26. Tu dois écrire (10 + 3) * 2 pour obtenir 26. Or en notation polonaise inversé, on fait les calculs par ordre de lecture de gauche à droite, il n'y a plus besoin de parenthèses. 3 10+ 2* = 26 10 2* 3+ = 23 C'est simplement une normalisation pour que tout le monde écrivent des calculs avec le même sens.

Au sujet de la forme des nombres manipulés dans Ibniz, l'arithmetique utilisé dans ibniz est dite à “virgule fixe” (fixed point en anglais) cf wikipedia https://en.wikipedia.org/wiki/Fixed-point_arithmetic. Le format des nombres est 4 digits hexadecimaux à gauche de la virgule (partie entière) et 4 digits hexadecimaux à droite de la virgule (partie décimale). De plus, la virgule n'est pas symbolisé par une virgule, mais par un point dans le monde anglosaxon de l'informatique. Du coup c'est un peu particulier par rapport aux nombres que l'on côtoie habituellement, mais ce n'est pas très compliqué.

D'abord, l'hexadecimal, est un systéme de numération en base 16. Avec ce système on ne compte pas de 0 à 9 comme en base 10 (la base habituellement utilisé par le commun de mortels), mais on compte de 0 à F (de 0 à 15 mais après 9 on utilise les symboles A B C D E F). C'est une notation très pratique en informatique, car les octets qui sont formés de 8 bits peuvent être représentés par 2 caractères hexadécimaux. Pour éviter la confusion dans ce qui va suivre, je met la base du nombre à gauche du nombre. Exemples : (b10) 0 = (b2) 0 = (b16) 0 (b10) 9 = (b2) 1001 = (b16) 9 (b10) 14 = (b2) 1110 = (b16) E (b10) 200 = (b2) 11001000 = (b16) C8 Du coup, historiquement, les informatitiens aiment bien l'hexadecimal, car ça prend moins de place pour décrire des octets conceptuellement.

Pour la fonction sinus, il s'agit de la fonction sinus exprimée en radian. 2* Pi radian équivaut à un tour, soit une période de la fonction sinus.

Pour ce qui est de ta remarque à propos du 2 et du 3, tout à fait, 2 = 131072/65536. Mais pour écrire 2 dans la notation hexadecimal, il suffit d'écrire (b16) 2. On peut même ajouter des 0 non significatifs et écrire (b16) 0002.0000 Cela peut être pratique avec ibniz car on peu alors incrémenter chacun des 8 chiffres du nombre en base 16 indépendamment avec les flèches du clavier. Le format des nombre dans Ibniz est limiter à 8 digits hexadecimaux (équivalent à 32 bits), 4 avant et 4 après la virgule. Donc le plut petit nombre que l'on puisse utiliser dans Ibniz est 0000.0000, et le plus grand est FFFF.FFFF

Au sujet du +1 /2 : la sinusoide produit un résultat compris entre -1 et 1. Or, lbniz, pour produire du son, ne prend que la partie entre 0 et 1 du résultat. Exemples pour la simple formule s dans ibniz (cela va juste calculer le sinus de la valeur sur la pile) : Au début, la première valeur sur la pile (en entrée de la formule) (le départ de la dent de scie) est 0000.0000. voyons ce qui ce passe étape par étape : * Pile = 0000.0000 ⇒ sin(0000.0000 * 2Pi) = 0 ⇒ On envoie 0 sur la sortie son * Pile = 0000.0040 ⇒ sin(0000.0040* 2Pi) =~ 0000.0199 ⇒ On envoie 0000.0199 sur la sortie son * Pile = 0000.0080 ⇒ sin(0000.0080* 2Pi) =~ 0000.0664 ⇒ On envoie 0000.000E sur la sortie son […] * Pile = 0000.1000⇒ sin(0000.1000* 2Pi) =~ 0000.E187 ⇒ On envoie 0000.E187 sur la sortie son * Pile = 0000.A000⇒ sin(0000.4000* 2Pi) =~ -0000.B824 ⇒ On envoie 0000.B824 sur la sortie son

Tout cela n'est pas ultra clair dans mes exemples, donc pour essayé de l'expliquer plus clairement : quand le sinus retourne une valeur négative, on envoie à la carte son la partie décimale de la valeur négative, et du coup le son ne sera pas produit par une belle sinusoide mais par une sorte de demi sinusoide bizare avec une fréquence 2 fois plus élevée. Pour avoir une belle sinusoide sur la sortie son, il faut adapter la sortie initiale du sinus entre -1 et 1 à l'entrée de la carte sont entre 0 et 1. Pour cela, d'abord on ajoute 1 à tous les résultats du sinus. Le résultat est alors compris entre 0 et 2 (-1 +1 à 1 + 1). On divise alors le tout par 2 et on obtient une sinusoide comprise entre 0 et 1.

Au sujet de 1FD, 2FD, 3FD, etc … (b16)1FD = (b10)256 + (b16)FD ; (b16)2FD = (b10)256 x2 x (b16)FD … Comme (b16)FD est proche de (b10)256 ça doit sonner à peu près bon, et du multiplie par 2 environ la frequence à chaque fois. Si tu veux jouer avec les harmoniques d'une fréquence, je te suggère plutôt d'ajouter un multiplicateur supplémentaire. Tu peux transformer DC* 3C/ s 1+ 2/ en DC* 3C/ 0001.0000* s 1+ 2/ et jouer sur le 0001 pour multiplier la fréquence 220 Hz par la valeur que tu veux, c'est plus facile ainsi pour jouer avec les harmoniques.

ibniz.1541581030.txt.gz · Dernière modification : 2018/11/07 08:57 de bigMax