ibniz
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
ibniz [2018/11/30 09:43] – bigMax | ibniz [2024/03/05 16:23] (Version actuelle) – Benjamin Labomedia | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Ibniz ====== | ====== Ibniz ====== | ||
- | Il y avait un article | + | |
+ | ===== Ibniz ===== | ||
+ | |||
+ | IBNIZ est un logiciel qui permet générer de l' | ||
+ | |||
+ | L' | ||
+ | |||
+ | {{ youtube> | ||
+ | |||
+ | |||
+ | |||
+ | ===== Installation ===== | ||
+ | |||
+ | ==== Sous Ubuntu / Debian / Raspbian ==== | ||
+ | |||
+ | ==== Par les dépôts ==== | ||
+ | IBNIZ is now in debian repository (thks maxigas !) : | ||
+ | sudo apt-get install ibniz | ||
+ | |||
+ | ==== En le compilant ==== | ||
+ | Installer le paquet // | ||
+ | sudo apt-get install libsdl2-dev | ||
+ | Ou plutot en 2024 ?! | ||
+ | sudo apt install libsdl1.2-dev | ||
+ | git clone https:// | ||
+ | cd IBNIZ | ||
+ | make | ||
+ | sudo make install | ||
+ | ./ibniz pour lancer le logiciel | ||
+ | |||
+ | Ou | ||
+ | git clone https:// | ||
+ | cd IBNIZ/src | ||
+ | sudo apt install libsdl1.2-dev | ||
+ | make | ||
+ | ./ibniz | ||
+ | ==== Kano ==== | ||
+ | raspbian customisé par os Kano http:// | ||
+ | < | ||
+ | sudo apt-get install make | ||
+ | sudo apt-get install gcc | ||
+ | sudo apt-get install libsdl1.2-dev | ||
+ | </ | ||
+ | {{: | ||
+ | |||
+ | ==== Sous Mac OSX ==== | ||
+ | |||
+ | ==== Installation de Xcode ==== | ||
+ | Télécharger Xcode, à partir du apple store de votre ordinateur //(menu pomme en haut à gauche app store)// | ||
+ | |||
+ | ==== Installation de Macport ==== | ||
+ | * Choisissez et téléchargez l' | ||
+ | |||
+ | ==== Installation de la librairie SDL ==== | ||
+ | * Choisissez la version qui convient et copier le dossier dans / | ||
+ | |||
+ | ==== Télécharger Ibniz ==== | ||
+ | * Téléchargez le code source | ||
+ | * extraire l' | ||
+ | |||
+ | ==== Compilation ==== | ||
+ | ouvrir un terminal (utilities) | ||
+ | cd / | ||
+ | puis | ||
+ | make | ||
+ | vous obtiendrez des messages comme " | ||
+ | ld: warning: option -s is obsolete and being ignored | ||
+ | C'est normal ... | ||
+ | |||
+ | si vous obtenez l' | ||
+ | gcc -c -Os ui_sdl.c -o ui_sdl.o `sdl-config --libs --cflags` -DX11 -lX11 | ||
+ | / | ||
+ | ui_sdl.c: | ||
+ | make: | ||
+ | essayez d' | ||
+ | port install libsdl | ||
+ | |||
+ | ==== lancement du logiciel ==== | ||
+ | Aller dans votre dossier ibniz et cliquez sur le fichier programme qui vient d' | ||
+ | |||
+ | Ibniz s' | ||
+ | |||
+ | Voila pour le mac | ||
+ | |||
+ | ==== IBNIZ pour Android ==== | ||
+ | Un portage de Ibniz par ce très cher Cedriko <3 en version beta à télécharger là : {{ media_07: | ||
+ | ==== IBNIZ pour iOS ==== | ||
+ | Par ici : http:// | ||
===== Principes & Fonctionnement ===== | ===== Principes & Fonctionnement ===== | ||
- | Je propose de documenter un peu le fonctionnement d' | + | Je propose de documenter un peu le fonctionnement d' |
Ligne 14: | Ligne 101: | ||
* L' | * L' | ||
* L' | * L' | ||
- | |||
- | |||
==== Hexadecimal ==== | ==== Hexadecimal ==== | ||
Ligne 21: | Ligne 106: | ||
Pour éviter la confusion dans ce qui va suivre, je met la base du nombre à gauche du nombre. | Pour éviter la confusion dans ce qui va suivre, je met la base du nombre à gauche du nombre. | ||
Exemples : | Exemples : | ||
+ | < | ||
(b10) 0 = (b2) 0 = (b16) 0 | (b10) 0 = (b2) 0 = (b16) 0 | ||
(b10) 9 = (b2) 1001 = (b16) 9 | (b10) 9 = (b2) 1001 = (b16) 9 | ||
(b10) 14 = (b2) 1110 = (b16) E | (b10) 14 = (b2) 1110 = (b16) E | ||
(b10) 200 = (b2) 11001000 = (b16) C8 | (b10) 200 = (b2) 11001000 = (b16) C8 | ||
+ | </ | ||
Du coup, historiquement, | Du coup, historiquement, | ||
==== Notation polonaise inversée ==== | ==== Notation polonaise inversée ==== | ||
C'est une normalisation qui permet à chacun d' | C'est une normalisation qui permet à chacun d' | ||
- | 3 10+ 2* = 26 | + | 3 10+ 2* = 26 |
- | 10 2* 3+ = 23 | + | |
==== Arithmetique à virgule fixe ==== | ==== Arithmetique à virgule fixe ==== | ||
Ligne 43: | Ligne 130: | ||
Le principe de ibniz, c'est qu'il y a un compteur incrémenté de 0000.0000 jusqu' | Le principe de ibniz, c'est qu'il y a un compteur incrémenté de 0000.0000 jusqu' | ||
- | {{ : | + | {{ media_07: |
==== L' | ==== L' | ||
Pour l' | Pour l' | ||
- | |||
- | 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/ | ||
- | |||
- | {{ : | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | Sur le graphique, | + | La sortie audio de Ibniz ne produit des sons qu' |
</ | </ | ||
+ | |||
+ | 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/ | ||
+ | |||
+ | {{ media_07: | ||
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. | 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. | ||
Ligne 61: | Ligne 148: | ||
D'un autre côté, la note LA, est produite par une sinusoide de fréquence 220 Hz. | D'un autre côté, la note LA, est produite par une sinusoide de fréquence 220 Hz. | ||
- | {{ : | + | {{ media_07: |
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 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. | ||
Ligne 68: | Ligne 155: | ||
\\ \\ | \\ \\ | ||
Enfin, la fonction sinusoide d' | Enfin, la fonction sinusoide d' | ||
+ | |||
+ | {{ media_07: | ||
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. | 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) : | 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 : | 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.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=> | + | |
- | * Pile = 0000.A000=> | + | * Pile = 0000.A000=> |
+ | |||
+ | <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' | ||
+ | </ | ||
- | Tout cela n'est pas ultra clair dans mes exemples, donc pour essayé de l' | ||
- | Pour cela, d' | ||
==== L' | ==== L' | ||
- | Pour la vidéo, le compteur est incrémenté par pas de OOOO.OOO1 soit 1/65536. | + | 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/ | Pour la vidéo, le compteur va donc avoir les valeur suivantes : 0, 1/65536, 2/65536, ..., 65535/ | ||
- | ===== References | + | ==== Les bases de fonctionnement issues de l' |
- | * http:// | + | Notes : Les informations ci-dessous sont issues de ce que j'ai compris d' |
+ | |||
+ | ==== La machine et la pile ==== | ||
+ | |||
+ | IBNIZ reproduit un ordinateur virtuel minimaliste qu'on programme en assembleur IBNIZ. | ||
+ | |||
+ | IBNIZ fournit un jeu d' | ||
+ | |||
+ | On retrouve les instructions habituelles pour programmer en assembleur tel que poser une valeur sur la pile, l' | ||
+ | |||
+ | 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' | ||
+ | |||
+ | **Exemple, la fameuse texture du XOR : ^xp** | ||
+ | |||
+ | | ||
+ | - Le chapeau ^ effectue l' | ||
+ | - 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' | ||
+ | |||
+ | ==== 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 | ||
+ | |||
+ | '' | ||
+ | |||
+ | Vidéo en mode T : IBNIZ pose sur la pile TTTT.YYXX | ||
+ | |||
+ | '' | ||
+ | |||
+ | Audio en mode T : IBNIZ pose sur la pile TTTT.TTTT | ||
+ | |||
+ | '' | ||
+ | |||
+ | Attention, l' | ||
+ | |||
+ | ===== 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 ==== | ||
+ | Pour le rejouer, il faut utiliser la commande suivante : | ||
+ | |||
+ | '' | ||
+ | |||
+ | ===== Exemples ===== | ||
+ | |||
+ | < | ||
+ | Shortest IBNIZ programs that show something " | ||
+ | |||
+ | 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: | ||
+ | - 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: )~ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== en vrac ==== | ||
+ | |||
+ | 0!1!2! 0@2@8rs* 1@2@8r.4+s*+ | ||
+ | |||
+ | Ici aussi : https:// | ||
+ | |||
+ | Et tous les programmes d'une personne qui s'est bien creusée la tête pour comprendre comment fonctionne ibniz : https:// | ||
+ | |||
+ | ==== 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' | ||
+ | |||
+ | < | ||
+ | 1{d6r+} | ||
+ | 2{d4r^} | ||
+ | 3{d3r*} | ||
+ | 4{dFr-} | ||
+ | 2)6r3& | ||
+ | </ | ||
+ | |||
+ | 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' | ||
+ | |||
+ | Les caractères sont codés sur une matrice carrée de 8x8. Ainsi, A et B donnent. | ||
+ | |||
+ | < | ||
+ | .#####.. | ||
+ | ##...##. | ||
+ | #######. | ||
+ | ##...##. | ||
+ | ##...##. | ||
+ | ##...##. | ||
+ | ........ | ||
+ | ........ | ||
+ | |||
+ | ######.. | ||
+ | .##..##. | ||
+ | .#####.. | ||
+ | .##..##. | ||
+ | .##..##. | ||
+ | ######.. | ||
+ | ........ | ||
+ | ........ | ||
+ | </ | ||
+ | En modifiant la place des # il est facilement possible de se créer une font personnalisée. | ||
+ | |||
+ | Voici un essai avec des caractères qui bouclent entre eux. {{: | ||
+ | |||
+ | ==== Construction d'un set avec un script Python ==== | ||
+ | |||
+ | La structure d'un fichier d' | ||
+ | |||
+ | < | ||
+ | int sym=e.key.keysym.sym; | ||
+ | int mod=e.key.keysym.mod; | ||
+ | |||
+ | if(ui.opt_dumpkeys) | ||
+ | { | ||
+ | static int last=0; | ||
+ | int now=getticks(); | ||
+ | if(!sym && e.key.keysym.unicode) | ||
+ | | ||
+ | printf(" | ||
+ | e.key.keysym.unicode, | ||
+ | last=now; | ||
+ | } | ||
+ | </ | ||
+ | getticks() | e.key.keysym.sym | e.key.keysym.unicode | e.key.keysym.mod | ||
+ | |||
+ | Nombre de milliseconde écoulée | [[http:// | ||
+ | |||
+ | Utiles : | ||
+ | |||
+ | * backspace : 8 8 * | ||
+ | * ctrl+A : 97 1 4160 | ||
+ | * Suppr : 97 1 4160 | ||
+ | * Gauche : 276 0 4096 | ||
+ | * Droite : 275 0 4096 | ||
+ | * Haut : 273 0 4160 | ||
+ | * F1 : 282 0 4096 | ||
+ | * F2 : 283 0 4096 | ||
+ | * Escape : 27 27 4096 | ||
+ | |||
+ | Example : | ||
+ | |||
+ | < | ||
+ | # -*- coding: utf8 -*- | ||
+ | # | ||
+ | # Ce script permet de générer un fichier " | ||
+ | # d' | ||
+ | # commande -p < events | ||
+ | # | ||
+ | # En l' | ||
+ | # liste des caractères qui ont une fonction. Puis il les efface. Et ce n fois. | ||
+ | |||
+ | from random import randint | ||
+ | |||
+ | # Liste complète des caractères utiles | ||
+ | liste= ''' | ||
+ | |||
+ | # Temps qui sépare chaque instrucion, en milliseconde | ||
+ | tps = 50 | ||
+ | |||
+ | # Nombre de fois que sera exécutée la boucle | ||
+ | nb_passe = 100 | ||
+ | |||
+ | # Nombre de caractère écrits à chaque boucle | ||
+ | nb_caract = 5 | ||
+ | |||
+ | # Touches ou combinaisons spéciales | ||
+ | F1 = "{0} 282 0 4096\n" | ||
+ | F2 = "{0} 283 0 4096\n" | ||
+ | backSpace = "{0} 8 8 4096\n" | ||
+ | supprAll = "{0} 97 1 4160\n{0} 127 127 4096\n" | ||
+ | Esc = "{0} 27 27 4096\n" | ||
+ | |||
+ | # Crée une page vide | ||
+ | pattern ="" | ||
+ | |||
+ | # Démmarre le traitement | ||
+ | pattern += F1 | ||
+ | |||
+ | for i in range(nb_passe): | ||
+ | |||
+ | # Fait écrire les caractères un par un | ||
+ | for k in range(nb_caract): | ||
+ | |||
+ | # Choisi un nombre entre 0 et le nb d' | ||
+ | choix = randint(0, len(liste)-1) | ||
+ | |||
+ | # Récupère le caractère correspondant dans la liste | ||
+ | caract = liste[choix] | ||
+ | |||
+ | # Récupère la valeur ASCII de ce caractère | ||
+ | ascii_caract = ord(caract) | ||
+ | |||
+ | # Compose l' | ||
+ | pattern += "{0} {1} {1} 4096\n" | ||
+ | |||
+ | # Fait effacer les caractères un par un | ||
+ | for k in range(nb_caract): | ||
+ | |||
+ | pattern += backSpace | ||
+ | |||
+ | # Relance le traitemant audio et vidéo | ||
+ | pattern += F2 | ||
+ | |||
+ | # Écrit la liste d' | ||
+ | with open (" | ||
+ | |||
+ | base.write(pattern) | ||
+ | </ | ||
+ | Le script ci-dessous permet de produire un fichier **events** qui, ouvert avec la commande **-p < events** produira des lignes aléatoires dans le but de générer une trame à partir de la nouvelle font obtenue plus haut. | ||
+ | |||
+ | < | ||
+ | from random import randint | ||
+ | |||
+ | pattern = "" | ||
+ | tps = " | ||
+ | |||
+ | for k in range(500): | ||
+ | |||
+ | a = randint(97, 122) | ||
+ | b = randint(97, 122) | ||
+ | |||
+ | for i in range(15): | ||
+ | |||
+ | pattern += "{0} {1} {1} 4096\n" | ||
+ | pattern += "{0} {1} {1} 4096\n" | ||
+ | |||
+ | pattern += "{0} {1} {1} 4096\n" | ||
+ | pattern += "{0} {1} {1} 4096\n" | ||
+ | |||
+ | |||
+ | with open (" | ||
+ | |||
+ | base.write(pattern) | ||
+ | </ | ||
+ | {{: | ||
+ | |||
+ | ==== Alimenter IBNIZ de l' | ||
+ | |||
+ | Piste : [[http:// | ||
+ | |||
+ | ==== Autres versions ==== | ||
+ | |||
+ | Info : https:// | ||
+ | |||
+ | Github network : https:// | ||
+ | |||
+ | Compilation (il manque le fichier language.h dans le dernier commit, c'est pour ça qu'il faut revenir à un commit de février dernier) : | ||
+ | |||
+ | < | ||
+ | git clone https:// | ||
+ | git checkout project-restructure | ||
+ | git checkout e8be5df317e9e13f0973bdd725269dc11e2d052amake./ | ||
+ | </ | ||
+ | INFO : ./ibniz -e > events | ||
+ | '' | ||
+ | '' | ||
+ | '' | ||
+ | |||
+ | |||
+ | ==== References ==== | ||
+ | * Le site officiel est http:// | ||
+ | * Une bonne page pour (commencer à) comprendre [[http:// | ||
* Documentation d' | * Documentation d' | ||
* Les graphiques sont réalisés avec https:// | * Les graphiques sont réalisés avec https:// | ||
+ | * Les dernières sources de IBNIZ sont sur la [[https:// | ||
+ | * Une source importante d' | ||
+ | * Un doc PDF écrit par Viznut sur [[https:// | ||
+ | * Une version réseau de Ibniz : [[https:// | ||
+ | * Une version de Ibniz qui permet d' | ||
+ | * 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:// | ||
+ | * Un PAD avec plein de " | ||
+ | * Une {{ :: | ||
+ | * https:// | ||
+ | * http:// | ||
{{tag> | {{tag> |
ibniz.1543571021.txt.gz · Dernière modification : 2018/11/30 09:43 de bigMax