Outils pour utilisateurs

Outils du site


ibniz

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
ibniz [2018/12/03 12:34] – [Ibniz] Benjamin Labomediaibniz [2024/03/05 16:23] (Version actuelle) Benjamin Labomedia
Ligne 1: Ligne 1:
 ====== Ibniz ====== ====== Ibniz ======
 +
 +===== Ibniz =====
  
 IBNIZ est un logiciel qui permet générer de l'image et du son en utilisant un langage de programmation dont les commandes se limitent à un seul caractère. IBNIZ est un logiciel qui permet générer de l'image et du son en utilisant un langage de programmation dont les commandes se limitent à un seul caractère.
Ligne 5: Ligne 7:
 L'esthétique, autant sonore que visuel, est celle du 8bit. L'esthétique, autant sonore que visuel, est celle du 8bit.
  
-{{ youtube>aKMrBaXJvMs}} {{ibniz.jpg}}+{{ youtube>aKMrBaXJvMs?large}} {{media_07:ibniz.jpg}}
  
  
  
 +===== Installation =====
  
- +==== Sous Ubuntu / Debian / Raspbian ====
-====== Installation ====== +
- +
-===== Sous Ubuntu / Debian / Raspbian =====+
  
 ==== Par les dépôts ==== ==== Par les dépôts ====
Ligne 22: Ligne 22:
 Installer le paquet //libsdl2-dev// Installer le paquet //libsdl2-dev//
     sudo apt-get install libsdl2-dev     sudo apt-get install libsdl2-dev
 +Ou plutot en 2024 ?!
 +    sudo apt install libsdl1.2-dev
     git clone https://github.com/viznut/IBNIZ/tree/master/src     git clone https://github.com/viznut/IBNIZ/tree/master/src
     cd IBNIZ     cd IBNIZ
     make     make
 +    sudo make install
     ./ibniz pour lancer le logiciel     ./ibniz pour lancer le logiciel
  
 +Ou
 +    git clone https://github.com/viznut/IBNIZ.git
 +    cd IBNIZ/src
 +    sudo apt install libsdl1.2-dev
 +    make
 +    ./ibniz
 ==== Kano ==== ==== Kano ====
 raspbian customisé par os Kano http://www.kano.me/ raspbian customisé par os Kano http://www.kano.me/
Ligne 36: Ligne 45:
 {{:Testibnizkano.png|fig:Testibnizkano.png}} {{:Testibnizkano.png|fig:Testibnizkano.png}}
  
-===== Sous Mac OSX =====+==== Sous Mac OSX ====
  
 ==== Installation de Xcode ==== ==== Installation de Xcode ====
Ligne 56: Ligne 65:
 puis puis
     make     make
-vous obtiendrez+vous obtiendrez des messages comme "linker input file unused because linking not done" et une fin avec 
-<code bash> +   ld: warning: option -s is obsolete and being ignored 
-gcc -c -Os ui_sdl.c -o ui_sdl.o `sdl-config --libs --cflags` -DX11 -lX11 +C'est normal ... 
-i686-apple-darwin10-gcc-4.2.1: -lSDLmain: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1-framework: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: AppKit: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: -lSDL: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: -framework: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: Cocoa: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: -lX11: linker input file unused because linking not done +
-gcc -c -O3 vm_slow.c -o vm_slow.o +
-gcc -c -Os clipboard.c -o clipboard.o `sdl-config --libs --cflags` -DX11 -lX11 +
-i686-apple-darwin10-gcc-4.2.1: -lSDLmain: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: -framework: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: AppKit: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: -lSDL: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: -framework: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: Cocoa: linker input file unused because linking not done +
-i686-apple-darwin10-gcc-4.2.1: -lX11: linker input file unused because linking not done +
-gcc -Os -s ui_sdl.o vm_slow.o clipboard.o -o ibniz `sdl-config --libs --cflags` -DX11 -lX11 -lm +
-ld: warning: option -s is obsolete and being ignored'' +
-</code>+
 si vous obtenez l'erreur suivante : si vous obtenez l'erreur suivante :
-''%%gcc -c -Os ui_sdl.c -o ui_sdl.o `sdl-config --libs --cflags` -DX11 -lX11%%''\\ +  gcc -c -Os ui_sdl.c -o ui_sdl.o `sdl-config --libs --cflags` -DX11 -lX11 
-''%%/bin/sh: sdl-config: command not found%%''\\ +  /bin/sh: sdl-config: command not found%% 
-''%%ui_sdl.c:2:17: error: SDL.h: No such file or directory%%''\\ +  ui_sdl.c:2:17: error: SDL.h: No such file or directory 
-''%%make: *** [ui_sdl.o] Error 1%%''+  make: *** [ui_sdl.o] Error 1
 essayez d'installer sdl depuis macport : essayez d'installer sdl depuis macport :
-''%%port install libsdl%%''+  port install libsdl 
  
 ==== lancement du logiciel ==== ==== lancement du logiciel ====
Ligne 93: Ligne 84:
 Voila pour le mac Voila pour le mac
  
-===== IBNIZ pour Android ===== +==== IBNIZ pour Android ==== 
-Un portage de Ibniz par ce très cher Cedriko <3 en version beta à télécharger là : {{ ::ibniz_android.zip |ibniz_android.zip}} +Un portage de Ibniz par ce très cher Cedriko <3 en version beta à télécharger là : {{ media_07:ibniz_android.zip |ibniz_android.zip}} 
-===== IBNIZ pour iOS =====+==== IBNIZ pour iOS ====
 Par ici : http://bzztbomb.com/blog/2016/05/15/iosbniz/ Par ici : http://bzztbomb.com/blog/2016/05/15/iosbniz/
  
-====== Enregistrement / Lecture d'un set ======+===== 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ée au fur et à mesure.
  
-===== Enregistrement ===== 
  
-La commande suivante va lancer IBNIZ puis enregistrer tout ce qui sera taper au clavier en conservant très précisément le délais qui séparera chaque commande. Il est ainsi possible d’enregistrer un live de plusieurs heures.+==== Concepts à expliquer ==== 
 +  * Hexadecimal 
 +  * Notation polonaise inversée 
 +  * Arithmetique à virgule fixe 
 +  * Pile 
 +  * Le compteur "dent de scie" 
 +  * L'interpretation vidéo 
 +  * L'interpretation audio
  
-''%%./ibniz -MonSet%%''+==== Hexadecimal ==== 
 +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 : 
 +<code> 
 +(b10) 0 = (b2) 0 = (b16) 0 
 +(b10) 9 = (b2) 1001 = (b16) 9 
 +(b10) 14 = (b2) 1110 = (b16) E 
 +(b10) 200 = (b2) 11001000 = (b16) C8 
 +</code> 
 +Du coup, historiquement, les informatitiens aiment bien l'hexadecimal, car ça prend moins de place pour décrire des octets conceptuellement. 
 + 
 +==== Notation polonaise inversée ==== 
 +C'est une normalisation qui permet à chacun d'ecrire des calculs dans le même sens. Son intérêt principal est que l'on a pas besoin de parenthèse pour définir les priorités des calculs. Puisque la multiplication est prioritaire sur l'addition, si tu écris 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 
 + 
 +==== Arithmetique à virgule fixe ==== 
 +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é. 
 + 
 +==== Pile ==== 
 + 
 +==== Le compteur "dent de scie" ==== 
 +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. Cela ressemble graphiquement à une dent de scie. 
 + 
 +{{ media_07:ibniz_saw_teeth_65536.png |}} 
 + 
 +==== L'interpretation audio ==== 
 +Pour l'audio, le compteur est incrémenté par pas de 0000.0040 soit 1/1024. Le compteur va donc avoir les valeur suivantes : 0, 1/1024, 2/1024, ..., 1023/1024, 1, 1025/1024, ..., 65535, 0, ... Cela est expliqué ici : http://countercomplex.blogspot.com/2011/12/ibniz-hardcore-audiovisual-virtual.html  
 + 
 +<WRAP center round important 60%
 +La sortie audio de Ibniz ne produit des sons qu'avec la partie à droite de la virgule des nombresDu point de vue de la sortie audio, les nombres 0.0000, 1.0000, 2.0000, ... sont tous interprétés comme 0 (0/FFFF). Les nombres 2.F340, 3.F340, E.F340, ... sont tous interprétés comme F340/FFFF. La valeur de la sortie audio est donc toujours compris entre 0 et 1. 
 +</WRAP> 
 + 
 +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.  
 + 
 +{{ media_07:ibniz_saw_teeth_float_audio_with_frames.png |}} 
 + 
 +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.  
 + 
 +=== Exemple: production d'une note LA avec Ibniz === 
 +D'un autre côté, la note LA, est produite par une sinusoide de fréquence 220 Hz.  
 + 
 +{{ media_07:ibniz_sin_220hz.png |}} 
 + 
 +Pour produire un LA avec Ibniz, il faut donc produire non pas une dent de scie, mais une sinusoide qui varie entre 0 et 1 à 220 Hz. Le jeu consiste donc à ecrire la bonne fonction mathématique dans Ibniz qui sera capable de convertir la dent de scie entre 0 et 1 qui varie 60 fois par seconde en une 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).  
 +\\ \\  
 +Enfin, 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/ 
 + 
 +{{ media_07:ibniz_sin_220hz_adapted_output.png |}} 
 + 
 +Au sujet du +1 /2 (ou 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 
 + 
 +<WRAP center round important 60%> 
 +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. 
 +</WRAP> 
 + 
 + 
 +==== L'interpretation vidéo ==== 
 +Pour la vidéo, le compteur est incrémenté par pas de 0000.0001 soit 1/65536. 
 +Pour la vidéo, le compteur va donc avoir les valeur suivantes : 0, 1/65536, 2/65536, ..., 65535/65536, 1, 65537/65536, ..., 65535, 0, ... 
 + 
 + 
 +==== Les bases de fonctionnement issues de l'ancien wiki ==== 
 +Notes : Les informations ci-dessous sont issues de ce que j'ai compris d'IBNIZ, certaines informations sont peut-être plus ou moins exactes, voire complètement fausses :) Des notions d'assembleur sont recommandées pour comprendre la suite ... 
 + 
 +==== La machine et la pile ==== 
 + 
 +IBNIZ reproduit un ordinateur virtuel minimaliste qu'on programme en assembleur IBNIZ. 
 + 
 +IBNIZ fournit un jeu d'instructions assembleur (bas niveau) très complet qui en fait un vrai langage de programmation, il passe d'ailleurs avec succès le test de Turin. 
 + 
 +On retrouve les instructions habituelles pour programmer en assembleur tel que poser une valeur sur la pile, l'enlever, faire des opérations mathématiques, faire des boucles, des tests, définir des sous-programmes, etc. 
 + 
 +IBNIZ utilise une pile LIFO : Last In, First Out, et pose à chaque cycle des valeurs sur la pile, qui changent selon le mode (voir plus bas). 
 + 
 +Les commandes que l'on tape modifient ces valeurs, et IBNIZ utilise ces nouvelles valeurs pour produire de l'image et du son. 
 + 
 +**Exemple, la fameuse texture du XOR : ^xp** 
 + 
 +  - IBNIZ pose sur la pile 3 valeurs : X, Y, T (T est au bas de la pile et X en haut. X a été la dernière valeur posée sur la pile, cela sera donc la première valeur enlevée de la pile). IBNIZ balaye l'écran (je ne sais pas encore dans quel sens), X correspond à la valeur de la coordonnées de l'abscisse x, et Y à l'ordonnée y. T est le compteur de frames (de cycles) 
 +  - Le chapeau ^ effectue l'opération binaire XOR entre X (première valeur de la pile) et Y (deuxième valeur). La pile contient donc en haut de la pile le résultat de X^Y, et T en seconde position 
 +  - La lettre x inverse les deux valeurs de la pile : T passe en première position en haut de la pile, suivi de X^Y en seconde position 
 +  - La lettre p (pop) enlève une valeur de la pile, il reste donc sur la pile le résultat de X^Y, et IBNIZ se sert de cette valeur pour faire la video et le son. 
 + 
 +Un nouveau cycle recommence, IBINIZ repars à l'étape 1 et copie sur la pile les nouvelles valeurs de X, Y et T 
 + 
 +==== Les différents modes de fonctionnement ==== 
 + 
 +IBNIZ dispose de 3 modes de fonctionnement : 
 + 
 +Vidéo en mode TYX : IBNIZ pose sur la pile TTTT.0000, YYYY.YYYY et XXXX.XXXX 
 + 
 +''%%YYYY.YYYY et XXXX.XXXX sont des valeurs entre -1 et 1, TTTT est le compteur de frames (le temps en soixantième de secondes)%%'' 
 + 
 +Vidéo en mode T : IBNIZ pose sur la pile TTTT.YYXX 
 + 
 +''%%YY et XX varient entre 00 et FF (soit entre 0 et 255), TTTT est le compteur de frames%%'' 
 + 
 +Audio en mode T : IBNIZ pose sur la pile TTTT.TTTT 
 + 
 +''%%La partie entière est le compteur de frames comme dans le mode vidéo, et la partie décimale est une fraction de 65536.%%'' 
 + 
 +Attention, l'implémentation courante change le mode du contexte vidéo automatiquement selon la balance de stacks (à expliquer ...) et combien de fois on a appelé whereami (qui permet de reposer les valeurs sur la pile). 
 + 
 +===== Enregistrement / Lecture d'un set ===== 
 +==== Enregistrement ==== 
 +La commande suivante va lancer IBNIZ puis enregistrer tout ce qui sera taper au clavier en conservant très précisément le délais qui séparera chaque commande. Il est ainsi possible d’enregistrer un live de plusieurs heures.
  
-===== Lecture =====+''%%./ibniz -e > MonSet%%''
  
 +==== Lecture ====
 Pour le rejouer, il faut utiliser la commande suivante : Pour le rejouer, il faut utiliser la commande suivante :
  
-''%%./ibniz -< MonSet%%''+''%%./ibniz -< MonSet%%''
  
-====== Expérimentation ======+===== Exemples ===== 
 + 
 +<code> 
 +Shortest IBNIZ programs that show something "nice" 
 + 
 +All 0-2-char-long programs that stackbalance to +1 in T- or TXY-video 
 +have been tested. 
 + 
 +EMPTY PROGRAM: 
 +- gradient & sawtooth 
 + 
 +1-CHARRERS: 
 +- flasher slowing down: q 
 +- glitchy halfscreen: ( 
 +- colorfade: ! 
 + 
 +2-CHARRERS: 
 +- tv noise: *d 
 +- trippy & whining rotator: d* 
 +- *-textured headache: -d 
 +- zooming *-texture: ** 
 +- stopping near negative star: */ 
 +- mcp: %* %/ %* %% 
 +- gradual art: %a 
 +- spotlights among *-textures: a* a/ a% 
 +- flasher: 9/ 
 +- plasmas: Al 
 +- moving glitchsquares: )( 
 +- jupiter storm: +/ +%  -/ -% r/ r% l/ l% 
 +- blinking stripes: +r +l -r -l 
 +- stopping in hyperspace: /* // /% 
 +- stuff with sierpinski triangles: &* && |* |/ |% &- |a 
 +- munching epilepsy: ^* ^/ ^% 
 +- polyrhythmic flasher slowing down: qs 
 +- noisy bar scrolling down slowly: q)   
 +- random squeaks: q@ 
 +- noisy bar in a *-textured night: s) 
 +- squarewave sliding down: )~ 
 + 
 +</code> 
 + 
 +==== en vrac ==== 
 + 
 +0!1!2! 0@2@8rs* 1@2@8r.4+s*+    \ rotation 
 + 
 +Ici aussi : https://github.com/emoc/IBNIZ 
 + 
 +Et tous les programmes d'une personne qui s'est bien creusée la tête pour comprendre comment fonctionne ibniz : https://github.com/Eugene8388608/ibniz-programs 
 + 
 +==== couleurs ==== 
 + 
 +p 6F4D.B000 \ tous les pixels de la même couleur   
 +  * p : pop la valeur de T depuis la pile   
 +  * 6F4D : définition de la teinte de la couleur   
 +  * B000 : luminosité   
 + 
 +Fl : ne garde que la partie entière   
 +==== séquences ==== 
 + 
 +Une séquence basée sur des sous-routines avec une tentative d'explication 
 + 
 +<code> 
 +1{d6r+} 
 +2{d4r^} 
 +3{d3r*} 
 +4{dFr-} 
 +2)6r3&1+V 
 +</code>
  
-===== Modification de la font =====+Tourne entre 1,2,3,4, quand on change 6 ça tourne de plus en plus vite! c'est une bonne base pour travailler des séquences
  
 +  * **2)** récupère T au fond de la pile
 +  * **3&** ne conserve que les deux derniers bits (donc compris entre 0 et 3)
 +  * **1+** ajoute 1 le résultat est compris en 1 et 4
 +  * **V** récupère la sous-routine du chiffre qui précède 
 +===== Expérimentation =====
 +==== Modification de la font ====
 Pour changer l'aspect des caractères entrés au clavier, il suffit de modifier le fichier font.pl avant de compiler. Pour changer l'aspect des caractères entrés au clavier, il suffit de modifier le fichier font.pl avant de compiler.
  
Ligne 143: Ligne 336:
 Voici un essai avec des caractères qui bouclent entre eux. {{:font.pd|fig:font.pd}} (à renommer en font.pl) Voici un essai avec des caractères qui bouclent entre eux. {{:font.pd|fig:font.pd}} (à renommer en font.pl)
  
-===== Construction d'un set avec un script Python =====+==== Construction d'un set avec un script Python ====
  
 La structure d'un fichier d'enregistrement est déterminée par les lignes de codes suivantes : La structure d'un fichier d'enregistrement est déterminée par les lignes de codes suivantes :
Ligne 275: Ligne 468:
 {{:IBNIZnewFont.jpg|IBNIZnewFont.jpg IBNIZnewFont.jpg}} {{:IBNIZnewFont.jpg|IBNIZnewFont.jpg IBNIZnewFont.jpg}}
  
-===== Alimenter IBNIZ de l'extérieur =====+==== Alimenter IBNIZ de l'extérieur ====
  
 Piste : [[http://python-xlib.sourceforge.net/|python-xlib]] permet de simuler l'appuie de touche au clavier. Piste : [[http://python-xlib.sourceforge.net/|python-xlib]] permet de simuler l'appuie de touche au clavier.
  
-===== Autres versions =====+==== Autres versions ====
  
 Info : https://github.com/twinshadow/IBNIZ/tree/project-restructure Info : https://github.com/twinshadow/IBNIZ/tree/project-restructure
Ligne 293: Ligne 486:
 </code> </code>
 INFO : ./ibniz -e > events INFO : ./ibniz -e > events
-''%%  ./ibniz --events 2>vid.pcm ffmpeg --- -r 30 vid.avi%%'' +''%%  ./ibniz --events 2>vid.pcm ffmpeg --- -r 30 vid.avi%%'' 
-''%%  ffmpeg -i vid.avi -f s16le -ar 44100 -ac 1 \%%''\\ +''%%  ffmpeg -i vid.avi -f s16le -ar 44100 -ac 1 \%%''\\ 
-''%%  -i vid.pcm -vcodec copy vidav.avi%%''+''%%  -i vid.pcm -vcodec copy vidav.avi%%''
  
  
-===== Principes & Fonctionnement ===== +==== References ====
-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ée au fur et à mesure. +
- +
- +
-==== Concepts à expliquer ==== +
-  * Hexadecimal +
-  * Notation polonaise inversée +
-  * Arithmetique à virgule fixe +
-  * Pile +
-  * Le compteur "dent de scie" +
-  * L'interpretation vidéo +
-  * L'interpretation audio +
- +
-==== Hexadecimal ==== +
-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 : +
-<code> +
-(b10) 0 = (b2) 0 = (b16) 0 +
-(b10) 9 = (b2) 1001 = (b16) 9 +
-(b10) 14 = (b2) 1110 = (b16) E +
-(b10) 200 = (b2) 11001000 = (b16) C8 +
-</code> +
-Du coup, historiquement, les informatitiens aiment bien l'hexadecimal, car ça prend moins de place pour décrire des octets conceptuellement. +
- +
-==== Notation polonaise inversée ==== +
-C'est une normalisation qui permet à chacun d'ecrire des calculs dans le même sens. Son intérêt principal est que l'on a pas besoin de parenthèse pour définir les priorités des calculs. Puisque la multiplication est prioritaire sur l'addition, si tu écris 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 +
- +
-==== Arithmetique à virgule fixe ==== +
-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é. +
- +
-==== Pile ==== +
- +
-==== Le compteur "dent de scie" ==== +
-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. Cela ressemble graphiquement à une dent de scie. +
- +
-{{ :ibniz_saw_teeth_65536.png |}} +
- +
-==== L'interpretation audio ==== +
-Pour l'audio, le compteur est incrémenté par pas de 0000.0040 soit 1/1024. Le compteur va donc avoir les valeur suivantes : 0, 1/1024, 2/1024, ..., 1023/1024, 1, 1025/1024, ..., 65535, 0, ... Cela est expliqué ici : http://countercomplex.blogspot.com/2011/12/ibniz-hardcore-audiovisual-virtual.html  +
- +
-<WRAP center round important 60%> +
-La sortie audio de Ibniz ne produit des sons qu'avec la partie à droite de la virgule des nombres. Du point de vue de la sortie audio, les nombres 0.0000, 1.0000, 2.0000, ... sont tous interprétés comme 0 (0/FFFF). Les nombres 2.F340, 3.F340, E.F340, ... sont tous interprétés comme F340/FFFF. La valeur de la sortie audio est donc toujours compris entre 0 et 1. +
-</WRAP> +
- +
-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.  +
- +
-{{ :ibniz_saw_teeth_float_audio_with_frames.png |}} +
- +
-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.  +
- +
-=== Exemple: production d'une note LA avec Ibniz === +
-D'un autre côté, la note LA, est produite par une sinusoide de fréquence 220 Hz.  +
- +
-{{ :ibniz_sin_220hz.png |}} +
- +
-Pour produire un LA avec Ibniz, il faut donc produire non pas une dent de scie, mais une sinusoide qui varie entre 0 et 1 à 220 Hz. Le jeu consiste donc à ecrire la bonne fonction mathématique dans Ibniz qui sera capable de convertir la dent de scie entre 0 et 1 qui varie 60 fois par seconde en une 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).  +
-\\ \\  +
-Enfin, 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/ +
- +
-{{ :ibniz_sin_220hz_adapted_output.png |}} +
- +
-Au sujet du +1 /2 (ou 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 +
- +
-<WRAP center round important 60%> +
-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. +
-</WRAP> +
- +
- +
-==== L'interpretation vidéo ==== +
-Pour la vidéo, le compteur est incrémenté par pas de OOOO.OOO1 soit 1/65536. +
-Pour la vidéo, le compteur va donc avoir les valeur suivantes : 0, 1/65536, 2/65536, ..., 65535/65536, 1, 65537/65536, ..., 65535, 0, ... +
- +
- +
-===== Les bases de fonctionnement issues de l'ancien wiki ===== +
-Notes : Les informations ci-dessous sont issues de ce que j'ai compris d'IBNIZ, certaines informations sont peut-être plus ou moins exactes, voire complètement fausses :) Des notions d'assembleur sont recommandées pour comprendre la suite ... +
- +
-==== La machine et la pile ==== +
- +
-IBNIZ reproduit un ordinateur virtuel minimaliste qu'on programme en assembleur IBNIZ. +
- +
-IBNIZ fournit un jeu d'instructions assembleur (bas niveau) très complet qui en fait un vrai langage de programmation, il passe d'ailleurs avec succès le test de Turin. +
- +
-On retrouve les instructions habituelles pour programmer en assembleur tel que poser une valeur sur la pile, l'enlever, faire des opérations mathématiques, faire des boucles, des tests, définir des sous-programmes, etc. +
- +
-IBNIZ utilise une pile LIFO : Last In, First Out, et pose à chaque cycle des valeurs sur la pile, qui changent selon le mode (voir plus bas). +
- +
-Les commandes que l'on tape modifient ces valeurs, et IBNIZ utilise ces nouvelles valeurs pour produire de l'image et du son. +
- +
-**Exemple, la fameuse texture du XOR : ^xp** +
- +
-  - IBNIZ pose sur la pile 3 valeurs : X, Y, T (T est au bas de la pile et X en haut. X a été la dernière valeur posée sur la pile, cela sera donc la première valeur enlevée de la pile). IBNIZ balaye l'écran (je ne sais pas encore dans quel sens), X correspond à la valeur de la coordonnées de l'abscisse x, et Y à l'ordonnée y. T est le compteur de frames (de cycles) +
-  - Le chapeau ^ effectue l'opération binaire XOR entre X (première valeur de la pile) et Y (deuxième valeur). La pile contient donc en haut de la pile le résultat de X^Y, et T en seconde position +
-  - La lettre x inverse les deux valeurs de la pile : T passe en première position en haut de la pile, suivi de X^Y en seconde position +
-  - La lettre p (pop) enlève une valeur de la pile, il reste donc sur la pile le résultat de X^Y, et IBNIZ se sert de cette valeur pour faire la video et le son. +
- +
-Un nouveau cycle recommence, IBINIZ repars à l'étape 1 et copie sur la pile les nouvelles valeurs de X, Y et T +
- +
-===== Les différents modes de fonctionnement ===== +
- +
-IBNIZ dispose de 3 modes de fonctionnement : +
- +
-Vidéo en mode TYX : IBNIZ pose sur la pile TTTT.0000, YYYY.YYYY et XXXX.XXXX +
- +
-''%%YYYY.YYYY et XXXX.XXXX sont des valeurs entre -1 et 1, TTTT est le compteur de frames (le temps en soixantième de secondes)%%'' +
- +
-Vidéo en mode T : IBNIZ pose sur la pile TTTT.YYXX +
- +
-''%%YY et XX varient entre 00 et FF (soit entre 0 et 255), TTTT est le compteur de frames%%'' +
- +
-Audio en mode T : IBNIZ pose sur la pile TTTT.TTTT +
- +
-''%%La partie entière est le compteur de frames comme dans le mode vidéo, et la partie décimale est une fraction de 65536.%%'' +
- +
-Attention, l'implémentation courante change le mode du contexte vidéo automatiquement selon la balance de stacks (à expliquer ...) et combien de fois on a appelé whereami (qui permet de reposer les valeurs sur la pile). +
- +
-===== References =====+
   * Le site officiel est http://pelulamu.net/ibniz/   * Le site officiel est http://pelulamu.net/ibniz/
   * Une bonne page pour (commencer à) comprendre [[http://countercomplex.blogspot.fr/2011/12/ibniz-hardcore-audiovisual-virtual.html|le fonctionnement de IBNIZ]].   * Une bonne page pour (commencer à) comprendre [[http://countercomplex.blogspot.fr/2011/12/ibniz-hardcore-audiovisual-virtual.html|le fonctionnement de IBNIZ]].
Ligne 441: Ligne 502:
   * Une version de Ibniz qui permet d'indiquer [[https://github.com/alex-guy/IBNIZ/tree/master/src|la position, la taille et la décoration de la fenêtre]].   * Une version de Ibniz qui permet d'indiquer [[https://github.com/alex-guy/IBNIZ/tree/master/src|la position, la taille et la décoration de la fenêtre]].
   * Une interface graphique qui permet de gérer différents sets IBNIZ et de lancer plusieurs IBNIZ à des positions et avec des tailles et à des positions différentes : [[https://github.com/alex-guy/Pybniz|Pybniz]].   * Une interface graphique qui permet de gérer différents sets IBNIZ et de lancer plusieurs IBNIZ à des positions et avec des tailles et à des positions différentes : [[https://github.com/alex-guy/Pybniz|Pybniz]].
 +  * Un PAD avec plein de "chansons" à télécharger au format TXT {{ media_12:summerlab-ibniz-latest.txt.zip}}
 +  * Une {{ ::bytebeats_beginners_guide_ttnm_v1-5.pdf |bonne documentation}} sur le principe bytebeat ou comment générer du son avec une ligne de code
 +  * https://esoteric.codes/blog/ibniz
 +  * http://countercomplex.blogspot.com/2011/12/ibniz-hardcore-audiovisual-virtual.html
  
- +{{tag>logiciels_audio sonification faire_du_bruit documentation}}
- +
- +
- +
-{{tag>logiciels_audio sonification faire_du_bruit documentation ibniz}}+
ibniz.1543840478.txt.gz · Dernière modification : 2018/12/03 12:34 de Benjamin Labomedia