jeudi 4 août 2011, 20:19:37 (UTC+0200)

La gestion d'événements avec chuck, exemple d'un synthétiseur MIDI

Pour connecter un contrôleur midi à un synthétiseur, il faut pouvoir gérer efficacement plusieurs voix en parallèle, ce qui n'est pas trivial avec un système de threading basique. J'ai tenté d'implémenter un synthétiseur commandé par mon contrôleur MIDI, donc, et le résultat est assez concluant.

La première partie explique la théorie des événements chuck, et je commenterai le code dans la seconde partie.

La théorie

Si vous ne connaissez pas MIDI, il s'agit d'un protocole très simple pour partager des notes de musique et des commandes entre plusieurs instruments, et des ordinateurs. L'utilisateur appuie sur une touche de son clavier avec une certaine vélocité, et ces paramètres sont envoyés par le port MIDI.

Ensuite, un oscillateur à la bonne fréquence est branché à la sortie, avec le bon gain (le volume, modulé en fonction de la pression sur la touche). Tout ceci est fort amusant jusqu'à ce que l'utilisateur désire appuyer sur deux touches en même temps.

Ma première approche à été de créer un oscillateur et une enveloppe pour chaque note. L'enveloppe d'un son est, en gros, l'évolution de son volume au cours du temps.

methode 1

Lorsqu'une note est reçue par le manager, un thread est lancé et s'occupe soit d'activer la bonne note, soit de la désactiver, en utilisant pour cela une sorte de pile FIFO.

Cette méthode fonctionnait, mais j'ai tout de même dû ajouter un thread de vérification. En effet, certains événements noteOff étaient ignorés ou perdus.

Ensuite, j'ai découvert dans les exemples de chuck une méthode bien meilleure :

methode 2

Au début, un nombre N de threads sont crées, et attendent chacun un événement. Lorsqu'une note est reçue, le manager déclenche l'événement pour un unique thread (le premier dans la liste). Celui-ci va connecter un oscillateur à la sortie et déclencher la note, puis attendre l'événement signalant la fin de la note. Quand le manager reçoit une fin de note, il déclenche l'événement correspondant à cette note dans un tableau, qui est réceptionnée par le bon thread.

Implémentation

Cette partie peut nécessiter quelques notions de ChucK, mais le langage est plutôt compréhensible. Le code coloré avec pygments et donc à peu près lisible se trouve ici.

Initialisation

class NoteEvent extends Event {
    // Cette classe crée des événements contenant quelques données
    // additionnelles
    int note;
    int velocity;
}

NoteEvent on;

// Création d'un tableau d'événements
// Ces événements seront déclenchés à chaque note relâchée
// Le "@" permet de créer des références vides, c'est-à-dire de ne rien
//  instancier pour le moment. Les threads se chargeront de cela
Event @ keys[128];

// On connecte un gain à la sortie audio
// Tous les oscillateurs y seront connectés
Gain g => dac;

Une voix

fun void voice() {
    // On applique une enveloppe à l'oscillateur qui sera connecté à la sortie
    SinOsc s => ADSR a;
    // On fixe les rampes de l'enveloppe
    a.set(10::ms, 100::ms, .3, 500::ms);
    // L'événement qui servira à récupérer la fin de la note
    Event off;
    // Les codes de la note et de la vélocité (0 - 127)
    int note;
    int vel;

    while (true) {
        // Cette ligne permet d'attendre que l'événement soit déclenché
        on => now;

        // L'événement contient deux valeurs : la note et sa vélocité
        on.note => note;
        on.velocity => vel;

        vel / 128.0 => s.gain;
        // La fonction mtof convertit une note MIDI en une fréquence
        Std.mtof(note) => s.freq;

        // Connexion de l'enveloppe au gain principal
        a => g;
        // Début de la note
        // Elle sera maintenue jusqu'à ce qu'on utilise explicitement la méthode
        //  keyOff()
        a.keyOn();

        // On place l'événement off spécifique à ce thread à la bonne place dans
        //  le tableau. Ainsi, le manager pourra y accéder.
        off @=> keys[note];
        // Puis on attend.
        off => now;
        // Lorsque la note est terminée, on replace la référence vide dans le
        //  tableau
        null @=> keys[note];

        a.keyOff();
        // On déconnecte la sortie
        a =< g;
    }
}

Le manager

// On crée vingt threads
for (0 => int i; i < 20; i++)
    spork ~ voice();

// On tente d'ouvrir une connexion à un périphérique MIDI
MidiIn mid;
MidiMsg msg;
if (!mid.open(0))
    me.exit();

while (true) {
    // MidiIn est un événement, on va donc simplement attendre
    mid => now;
    // À la réception d'un message, il est analysé
    while (mid.recv(msg)) {
        // Seul noteon est intéressant ici, le reste est donc rejeté.
        if (msg.data1 != 144)
            continue;

        if (msg.data3 > 0) {
            // Si la vélocité est supérieure à 0, la note est appuyée
            msg.data2 => on.note;
            msg.data3 => on.velocity;

            // La méthode signal() déclenche l'événement pour le premier
            //  shred en attente uniquement (au contraire de la méthode
            //  broadcast())
            on.signal();

            // On permet ensuite au shred de tourner sans avancer le temps
            //  dans le shred courant
            me.yield();

        } else {
            // Sinon, cela signifie que la note est relâchée
            // On déclenche donc l'événement 'off' correspondant
            if (keys[msg.data2] != null)
                keys[msg.data2].signal();
        }
    }
}

La suite

Je compte déjà permettre plusieurs oscillateurs par voix, avec la possibilité de synchronisation et de ring modulation, puis d'associer chaque paramètre à des potentiomètres ou des curseurs (dès que j'aurai un meilleur clavier maître). Si vous êtes intéressé, suivez l'activité sur mon dépôt.


Posted by chickenzilla | Permanent link | /\

mercredi 23 février 2011, 02:18:23 (UTC+0100)

Des projets, des trucs, des machins

Oh, euh, coucou, ça fait un bail. J'ai plein de projets intéressants et d'obligations stupides, ces temps-ci, donc pas trop d'articles ni de techniques douteuses, mais ça reviendra.

D'abord, il y a phiwiki. J'avais besoin de quelque chose pour collecter mes découvertes et mes, hum, recherches dans un endroit correct. Donc évidemment, un wiki. J'aurais pu utiliser celui de olol (allez donc y faire un tour, ça sent bon la lavande), mais étant donné que je vais y placer quelques trucs un peu officiels, "fuckthesystem" me paraissait nettement plus convenable.

Comme j'utilise un hébergement gratuit chez alwaysdata, j'ai cherché un wiki ultra léger, et je suis tombé sur monkeywiki, auquel j'ai apporté des modifications conséquentes.

Tout ceci est expliqué .


Il y a ChucK, avec lequel je fais quelques d'expérimentations, et à propos duquel j'ai commencé un tutoriel. J'ai également, pour l'occasion, écrit un lexer pour pygments, bref, beaucoup de fun.


Il y a aussi mondedemerde, une espèce de messageboard anonyme pour gens aigris en django, mais j'en parlerai quand il sera en ligne.


Et puis...


Posted by chickenzilla | Permanent link | /\

samedi 14 août 2010, 01:12:08 (UTC+0200)

alphabeta

Je suis censé écrire un petit quelque chose à propos de mon formateur de texte, -- et faire des maths et faire le ménage et sortir les poubelles et trouver une fille -- mais je suis très occupé à procrastiner ces temps-ci. Alors à la place, je vais parler de alphabeta.

Il s'agit d'un langage de programmation formé uniquement des lettres de l'alphabet, minuscules et majuscules. Les données sont stockées dans cinq registres ainsi qu'une mémoire. Les deux premiers registres peuvent être changés, le troisième stocke les résultats, et les deux autres soit les pointeurs de mémoire et de position.

Les commandes de a à l permettent de changer les registres 1 et 2, celles de m à w permettent de faire des opérations. A à F servent à la copie entre 1, 2, et 3, G à I gèrent la mémoire, H à M s'occupent des entrées/sorties standard, puis de N à R viennent les conditions. Enfin, S à Z permettent de s'occuper des deux pointeurs mémoire et position. Z permet en fait de switcher entre les deux registres pour les opérations S à Y.

Évidemment, j'ai écrit un interpréteur python (je sais, il faut vraiment que j'investisse dans un repo.)

Les registres sont des int, la mémoire un defaultdict, et je gère la grammaire avec un dict et des fonctions lambda. Lots of fun, donc. À la syntaxe de base, j'ai ajouté des commentaires : des lignes commençant par un "#". J'ai aussi mis en place un moyen de débuguer facilement, ie. d'afficher les différents registres pendant le déroulement, avec des "%".

Voici un programme en alphabeta :

# On place les valeurs ascii en mémoire
eddddbCLISddaaCLISdaCLI
# On donne la bonne valeur au registre de position et au compteur
cb ZUUUZ
# Et hop, la boucle
Y HDLSHDLSHDL byO

Dans la première ligne, on initialise des valeurs dans le premier registre, que l'on place en mémoire.

À la seconde ligne, on réutilise la valeur existante dans le registre 1 pour en faire un compteur. Ensuite, ça se complique. On passe au mode « édition du pointeur de position » avec Z, puis on y met la valeur désirée. Pour cela, il faut anticiper la taille en caractères du programme jusqu'à l'endroit où on souhaite placer le point de départ de la boucle. À la fin du second Z, il y a 30 caractères, soit la position 30. C'est plutôt amusant à faire. J'ai ajouté des instructions d'affichage de caractère (L) à la première ligne pour simplifier le compte.

À la troisième ligne, on récupère les infos en mémoire et on les affiche puis on revient à la position désignée par le pointeur, tant que le compteur n'est pas à zéro.

Et au final on obtient quarante-deux smileys facétieux.

Étonnant, non ?


Posted by chickenzilla | Permanent link | /\

vendredi 6 août 2010, 11:14:18 (UTC+0200)

Les commentaires

Gasch faisait remarquer à juste titre que ma fainéantise chronique ne devrait pas m'empêcher de créer un système de commentaires.

Mon précédent blog était composé d'un unique script python de 500 lignes qui s'occupait de tout le blog. En plus de poser des soucis de performance, il était difficile à maintenir. Comme j'avais déjà créé un système de blog avant ça, et que je travaille sur deux autres projets web actuellement, je n'avais aucune envie de refaire un système complet.

Je suis donc parti à la recherche d'une nouvelle plate-forme de blog simple, qui aurait juste le nécessaire pour ajouter et éditer des articles. J'avais déjà entendu parler de nanoblogger, et le système de gestion m'a plu dès le début. Maintenant que je l'ai un peu utilisé, je vois trois gros problèmes :

  • la lenteur. Cela ne constitue pas réellement un problème, plutôt une gène, mais la génération du contenu statique prend parfois presque une minute;
  • l'absence de commentaires. Il s'avère que ce blog a des visiteurs, et un système de commentaires est bien entendu indispensable. Seulement,
  • c'est du bash. Moi qui me précipite toujours vers les solutions les plus originales, un moteur de blog en bash me paraissait séduisant au début. Après avoir été confronté à quelques soucis, avec les flux rss et l'encodage notamment, je me rends compte que la moindre modification demande d'aller taper à coup de grep et de echo barbares pour que cela fonctionne. Et il faut à chaque fois attendre un temps insensé pour vérifier.

J'avais pensé à deux types de systèmes, pour les commentaires :

  • l'intégration avec un script cgi fait par moi-même ou existant Je n'ai actuellement pas envie de faire ça à la main, et les solutions que j'ai trouvées sont assez mal documentées et demandent des modifications dans le code.
  • L'utilisation d'un outil externe, comme par exemple disq.us ou buzzerl. Pour buzzerl, je ne vais évidemment pas ajouter moi-même les liens puisque ce n'est pas la raison d'être du site. Pour l'instant, la seule solution que j'ai trouvée est d'ajouter les liens à la main. Cela ne me dérange pas du tout, mais ce n'est évidemment pas une solution durable. Une amélioration serait déjà d'ajouter le nombre de commentaires et peut-être l'intégration. C'était l'objectif de mes quelques tests d'AJAX qui ont donné le gadget inutile en bas de chaque article. Vérifier si des commentaires existent et en écrire le nombre serait déjà une bonne avancée.

C'est pourquoi je compte refaire un énième moteur de blog, très semblable à nanoblogger mais qui palliera à ses quelques lacunes, lorsque je serai remotivé.

Proof of concept : commentaires.


Posted by chickenzilla | Permanent link | File under: blog | /\

jeudi 5 août 2010, 23:58:26 (UTC+0200)

De l'ergonomie des sites web

EDIT. : 6/08/10 j'ai ajouté un paragraphe à propos de gopher dans la section codex, et j'ai corrigé les liens.

L'état actuel des choses

Lorsque j'entre sur un site internet, c'est la disposition, le style, les couleurs qui me permettent de me faire une idée préliminaire. Pour ce qui est de la qualité du contenu, cela n'intervient qu'après quelques secondes ou minutes de lecture. Et chez beaucoup, la présentation est essentielle, dès les premiers instant. Les internautes jugent un site Web en 50 millisecondes

Le modèle

Je parlerai par la suite des sites web proposant du contenu, et pas de ceux servant simplement de façade à une entreprise.

Pour ce qui est de la disposition, ils se séparent en deux catégories (en mettant de côté les applications web) :

  • les sites d'artistes servent souvent de portfolio et doivent attirer par leur qualité visuelle et leur originalité. Il n'y a donc pas de standard, si ce n'est la plupart du temps des graphismes soignés et une sobriété inhabituelle (quelques liens, un peu de texte).
  • les sites standards, comprenant :

    • un gros titre -- en général sous forme de logo -- en haut à gauche ou centré ;
    • un champ de recherche en haut à droite;
    • le contenu sous la forme d'un bloc occupant la plus grosse largeur de page, généralement au centre ;
    • des panneaux latéraux contenant

Actuellement, la mode est de compléter le moindre espace vide par des informations, souvent inutiles.

Les structures courantes

J'ai choisi quelques exemples, au hasard. Pour moi qui ait l'habitude de les voir, il est plutôt difficile d'avoir une vision critique, j'essaie de me placer dans le peau des différents visiteurs susceptibles d'accéder à ces sites.

  • Le site du zéro (site). Étonnement, l'interface est plutôt bien pensée. On a évidemment des informations pas vraiment intéressantes (nombre de connectés) mais en quantité limitée. Il y a deux types de visiteurs du site du zéro : ceux qui cherchent des cours pour un outil qu'ils doivent ou ont envie d'apprendre, et ceux qui écrivent régulièrement sur les forums. Pour ces derniers, la partie « membre » est très accessible et discrète ; pour les autres, la recherche et les différentes catégories son également faciles d'accès. Quelques visiteurs ont entendu parler de ce site et désirent savoir ce qu'il en est. Au lieu d'un long texte descriptif, ils ont une explication simple avec des liens et un menu dans le panneau central. Il reste évidemment les informations destinée au financement du site (pubs et vente de livre), qui n'intéressent que rarement le visiteur, mais les débats sur le financement des sites web n'ont pas besoin d'un troll supplémentaire.
  • Lambda the ultimate (site). Tout ici met l'accent sur le contenu. On distingue du premier coup d'œil où il faut lire. Et c'est exactement ce que cherche le visiteur : les articles, par ordre chronologique inversé. Une petite partie désirera chercher un vieil article, et le champ de recherche est en évidence. Pour celui qui veut des informations supplémentaires sur le site, le panneau latéral gauche est plutôt clair. Enfin, l'habitué aura un accès simple aux forums. Seulement voilà : il n'est pas beau. Le style de la page s'occupe presque uniquement de la structure, et pas des couleurs, ce qui donne un résultat plutôt rude. Les couleurs de base du navigateur sont la plupart du temps très laides, leur but étant le contraste plutôt que l'esthétique. Dans ma capture, le bleu jure avec le orange, le fond blanc agresse et j'ai une aversion particulière pour les couleurs par défauts des liens.
  • The lambda church (site). Un site très jeune, où la sobriété est de mise. Aucune information n'est superflue. Le problème ici, c'est que l'on ne sait pas dans quel sens lire, quoi lire en premier. À la première visite, il faut quelques temps pour comprendre ce que signifient les différents blocs, qu'une colonne est destinée aux articles et l'autre aux séries. Mais évidemment, ce site existant depuis quelques jours, il est destiné à se perfectionner.
  • Les journaux utilisent souvent la même présentation que le format papier (e.g. The New York Times (site)) ou un format vaguement allégé (The Guardian site, Le Monde (notez le plugin flash qui est d'humeur joueuse) site). La conclusion est toujours la même : beaucoup trop de contenu visible. C'est une tâche très pénible que de visualiser ce genre de site sur un écran 15".
  • Un blog que j'apprécie en ce moment less than 3 (site). Je l'ai sélectionné car il propose du contenu mixte : du texte et de la musique, dans presque tous les articles. La bannière, ainsi que les événements défilants prennent clairement trop de place. On devra à chaque fois descendre d'une page complète pour accéder au contenu que l'on est venu chercher. Les structures de type volumen (voir plus bas) ne doivent pas posséder de page d'accueil complète. Cependant, le reste de la navigation est agréable, et plus particulièrement l'intégration de la musique et le lecteur en html5.
  • Je suis tombé, pendant mes recherches, sur le paperblog. Sans m'étendre trop longuement là-dessus, la simple vue de la page d'accueil m'a fait étouffer un hurlement de désarroi mêlé d'horreur. On fait difficilement la différence entre les publicités et le contenu, le style est bancal et ressemble à celui du sordide myspace.

Je ne vais pas m'étendre sur flash ou silverlight pour la conception de sites web car le simple fait d'en parler me donne de l'urticaire et ces technologies seront bientôt mortes. Mais à un moment dans l'histoire de l'Internet, des gens ont pensé que ceci était une bonne idée.

Vers une standardisation ?

Ayant des problèmes de concentration, j'utilise régulièrement readability, un outil génial en javascript qui permet d'isoler la substantifique moelle d'un page web pour pouvoir la lire tranquillement. Le problème, c'est qu'on ne devrait pas avoir à utiliser un tel script. Un concepteur de site web doit avoir pour seule perception le point de vue du lecteur.

Le passage d'une page à l'autre, d'un article à l'autre doivent être fluides et le plus simple possible. La navigation devrait permettre de se concentrer sur une seule tâche à la fois. Lorsque je lis un article, je ne veux pas de pubs clignotantes, de panneaux latéraux défilants ou dieu sait quelle atrocité les marketeux sont capables d'inventer. Sans aller vers ces extrêmes, les modèles de blogs propulsés par wordpress ou dotclear, comme The Internets par exemple, sont assez agréables et simples à appréhender. Cependant, la barre latérale omniprésente, même si elle ne gène pas vraiment, ne permet pas de se concentrer complètement sur le contenu.

D'autre part, Le flux d'information est aujourd'hui tel que l'on doit faire des efforts pour se réhabituer à lire normalement. Lorsque je parcours les nouvelles du jour sur reddit ou hackernews, j'ouvre quelques articles que je lis en diagonale, afin de pouvoir saisir l'essentiel sans forcément comprendre tous les tenants et la aboutissants. C'est une très mauvais habitude. On a gagné du temps, mais on ne sait toujours rien au final. Seulement, pour changer ça, c'est un véritable reconditionnement qu'il faut entreprendre, et la disposition des pages web joue un rôle essentiel là-dedans.

La marge, par exemple, est plutôt importante. Il suffit de voir l'énorme marge des documents LaTeX (qui sont une référence en terme de disposition parfaite). On sera beaucoup plus enclin à lire ce texte que celui-çi (lien), même si on sait qu'on le lira de toute façon.

Dans l'idéal, on peut distinguer deux formats pour un site web.

Le codex

Soit privilégier la navigation par hyperliens, et donc le présenter comme un livre ; cette analogie est presque entièrement applicable à la navigation sur des pages html. La page d'accueil indique brièvement le contenu, et a surtout pour but d'intriguer le lecteur, de l'inciter à poursuivre sa visite. Puis vient le sommaire, qui est un plan complet du site (quelque chose comme le html généré par DocBook XSL. Enfin, une page résume le contenu du site et présente l'auteur. Elle est placée discrètement à la fin, mais tout le monde sait où elle se trouve (à propos, about, …) C'est plus ou moins le mode choisi par Sam Hugues : la navigation est simple malgré la quantité importante de contenu. De plus, la disposition des articles eux-même est idéale, on n'est troublé à aucun moment par des éléments indésirables, puisque la lecture se fait exclusivement de haut en bas, et de façon continue.

Le protocole gopher utilise cette structure. Si on peut discuter du sérieux de gopher, il n'en reste pas moins un bon moyen de partager du texte, et ceci en conservant la même disposition pour tous les sites. Lorsque l'on arrive sur un site gopher, on sait exactement où poser les yeux, quoi lire. En effet, il permet seulement de servir du contenu (html, texte, …) et des menus. Ceux-ci ne contiennent que des liens ou un texte descriptif. On pourra critiquer l'absence de possibilité de personnaliser, mais la navigation est aisée et agréable.

Le volumen

Un autre format intéressant est de placer tout le contenu ou une grande partie sur la page d'accueil. Le blog Ours & Hippy, par exemple, bien qu'un brin trop fourni à mon goût, fait un usage des ancres fort astucieux pour la navigation entre les articles.

Et donc ?

L'échange de données a fait des bonds formidables avec le p2p notamment. Des outils comme Embedly permettent de mettre de l'ordre dans la quantité de données qui circule sur les pages web. L'organisation et la présentation peinent pourtant. En étant un tant soit peu réaliste, on ne peut pas s'attendre à une standardisation des sites web, mais les modèles suivis actuellement ne sont pas parfait. Les objectifs premiers du World Wide Web sont l'échange de connaissance, d'idées, de projets ou de documents. Il peut être bon de reconsidérer notre manière d'organiser tout ça, pas par un « retours aux sources », mais en examinant les soucis dans les modèles actuels et en les corrigeant.


Je parlerai dans mon prochain article d'un sujet pas trop éloigné, le formatage de texte pur, avec un peu plus de réflexion que mon survol précédent.

Note : je suis tout à fait conscient que mon blog va à l'encontre des propos de ce blog. Étant fatigué de faire du web, je me concentre sur d'autres projets, mais je compte faire une plate-forme de blog semblable à nanoblogger (et pas y contribuer ou forker, je m'expliquerai dans un autre billet.)

Commentaires


Posted by chickenzilla | Permanent link | /\

samedi 31 juillet 2010, 21:04:20 (UTC+0200)

Oh look ! It has social shit.

Chose promise, chose due. Dans le cadre d'un test de javascript laid+cgi, et surtout pour le lulz, j'ai ajouté un module super communautaire pour me rapprocher de mes fans. Eh ouais, regardez donc là en-bas, le petit bouton.

Si vous connaissez sur le bout des doigts vos machins de blogging trop hype, vous aurez certainement reconnu ceci. Ce n'est évidemment pas en relation avec facebook, tout est stocké ici-même.
Voilà, l'utilité est à peu près du même ordre que celle de la banane volante sur ma page d'accueil, mais ça m'amusait.

Unleash your apathy!


Posted by chickenzilla | Permanent link | /\

jeudi 29 juillet 2010, 22:42:04 (UTC+0200)

It's a bird.

Ça y est, ce blog est aux normes web2.0. Si si, regardez donc à droite, admirez le machin twitter qui s'intègre merveilleusement bien à la page. Le blog étant entièrement statique, il m'a suffit de faire une petite fonction qui se charge de créer la liste de mes derniers tweets, puis de l'intégrer au script que je présentais dans mon billet précédent. Cela m'a d'ailleurs forcé à implémenter des délais différents pour chaque flux. Bientôt un module facebook et plein d'outils pour me masturber allègrement sur mon nombre de followers ? STAY TUNED.

Non, sérieusement, je pense ajouter des commentaires pour certains billets par l'intermédiaire de buzzerl. Mais pour cela, il faudrait que je bricole un plugin pour nanoblogger permettant d'associer un lien buzzerl à mes posts, parce que bon, je ne vais pas les éditer à la main, quand même.


Posted by chickenzilla | Permanent link | File under: osef | /\

dimanche 25 juillet 2010, 19:38:44 (UTC+0200)

Script flux rss bla

Ouais donc j'ai décidé d'écrire un peu plus dans mon blog, même quand je fais des scripts insignifiants. Parce que maintenant, j'ai un moteur de blog qui fonctionne ! Yeah. Et pas de commentaires, parce que bon, pas envie. Pour me contacter, voyez la page contact à droite.

Au menu aujourd'hui, un script permettant de récupérer des flux RSS (ouais ou atom gnagna.) et de lancer des commandes pour tout nouvel élément. Au lieu de bricoler quarante scripts et de bidouiller crontab, pouf on centralise le tout dans un joli fichier de conf. Ça existe probablement déjà en mieux, mais mes trente secondes de recherche n'ont mené à rien.

La configuration est plutôt simple, c'est du python alors c'est joli et facile à comprendre.


from monmodulegenial import mafonctiontropcool

delay = 30 # minutes
cache = "/home/Leia/.cache/rssblah"
verbose = False

sites = (
    ("http://site1.bla/feed.xml", "/home/Leia/scripts/site1.sh"),
    ("http://sit2...", "/usr/bin/perl /home/Leia/foo.pl", {"args": (lambda e:
            e.link)})
    ("http://site2...", mafonctiontropcool, {"once": True})
)

Une explication pour les arguments : cela peut être soit une liste ou une chaîne, soit une fonction qui prend un élément en argument. J'utilise universal feedparser pour gérer les flux, donc il s'agit d'une entry

Ensuite, on lance le script, éventuellement avec un nohup parce que c'est la vie. La configuration est relue à chaque fois, donc on n'a pas à se soucier du process, en théorie.

Ici, le code

Posted by chickenzilla | Permanent link | File under: codaz, python | /\

samedi 24 juillet 2010, 00:46:23 (UTC+0200)

Formatage de texte brut

Voici donc ma dernière merveille, un script permettant d'écrire du texte brut sans se soucier de la largeur et l'alignement.
Il a surtout été motivé par ma feignantise chronique et répond en fait à plusieurs besoins:

  • ne pas s'occuper de la largeur du texte que l'on écrit tout en limitant le nombre de colonnes (un bon éditeur de texte se charge normalement de cela),
  • ne pas s'occuper de l'alignement, du centrage,
  • ne pas se soucier de la numérotation des sections et titres,
Mon script est capable pour l'instant de créer des marges, de centrer, de gérer les listes numérotées ainsi que les titres sur différents niveaux, et enfin d'ajouter un sommaire.

La syntaxe devait être la plus simple possible, pas de xml, pas de signes bizarres ({}<>/). Puisqu'il s'agit de texte brut, les possibilités offertes par le langage seront très limitée, et le nombre de mots-clés faible. Nul besoin, donc, de commandes du type \begin{bloc} \end{bloc}.
Pour la même raison, pas question non plus de récupérer la syntaxe des langages de balisage léger existants, puisque leur but est surtout le formatage au niveau du texte, et non au niveau des blocs.
La priorité est l'écriture du texte, et surtout pas le rendu final, j'ai donc choisi une syntaxe par blocs, définie ainsi:


␣␣␣␣instruction [arguments]
texte
texte
...
␣␣␣␣instruction [arguments]
texte
...

Une instruction est précédée d'au minimum trois espaces ou une tabulation. Pour l'instant, les commandes disponibles sont :
  • title niveau titre
  • margin taille, rmargin taille, lmargin taille, margin gauche droite
  • list [mode] mode peut être a, i, I, 1 suivi de signes quelconques, ou vide. Par exemple list a) produira a), b), c)…
  • center.

Il manque encore un système de références/bibliographie avec une syntaxe inline du genre ((référence)) ou [[référence]]. Puisqu'il n'y a pas de pagination ni de différence de style, je ne pense pas ajouter de notes de bas de page.

Pour l'instant, les options ne peuvent pas être passées dans la commande, elles sont placées au début du script. Ça viendra.

Voici un exemple de texte en entrée (qui est moins repoussant dans une console.):


    center

BLAH 

    plain
Intro moche : Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.

    margin 5
Sommaire :

{{SUMMARY}}

    title 1 Cras elementum ultrices diam. Cras elementum ultrices diam Cras elementum ultrices diam Cras elementum ultrices diam Cras elementum ultrices diam

Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper.

    title 2 Duis arcu massa, scelerisque vitae.

consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue.

    title 2 Praesent egestas leo in pede.

Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;

    title 1 Aliquam nibh.
    title 2 Mauris ac mauris sed pede pellentesque fermentum.

Maecenas adipiscing ante non diam sodales hendrerit. Ut velit mauris, egestas sed, gravida nec, ornare ut, mi.

    margin 40 20
Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula.
Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam.

   title 3 Integer quis metus

vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

    title 3 Morbi vel erat non mauris convallis vehicula.

Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna.

    title 2 Aliquam convallis sollicitudin purus.

Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna.

    list a.
  - Praesent aliquam, enim at
  - fermentum mollis, ligula massa adipiscing nisl,
  - ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien.
  Vivamus leo.
  - Aliquam euismod libero eu enim.

    plain

Nulla nec felis sed leo placerat imperdiet.

    title 2 Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi.

Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

Et la sortie :

                                                                               
                                      BLAH                                      

Intro moche : Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non
risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies
sed, dolor.

     Sommaire :  
      I.      Cras elementum ultrices diam. Cras elementum ultrices diam Cras
              elementum ultrices diam Cras elementum ultrices diam Cras
              elementum ultrices diam
      I.1.    Duis arcu massa, scelerisque vitae.
      I.2.    Praesent egestas leo in pede.
      II.     Aliquam nibh.
      II.1.   Mauris ac mauris sed pede pellentesque fermentum.
      II.1.a) Integer quis metus
      II.1.b) Morbi vel erat non mauris convallis vehicula.
      II.2.   Aliquam convallis sollicitudin purus.
      II.3.   Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue.
              Nulla tincidunt tincidunt mi.

  I. Cras elementum ultrices diam. Cras elementum ultrices diam Cras elementum
     ultrices diam Cras elementum ultrices diam Cras elementum ultrices diam

Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin
porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam
nisl sit amet erat. Duis semper.

    1. Duis arcu massa, scelerisque vitae.

consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero
pharetra tempor. Cras vestibulum bibendum augue.

    2. Praesent egestas leo in pede.

Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia
Curae;

  II. Aliquam nibh.

    1. Mauris ac mauris sed pede pellentesque fermentum.

Maecenas adipiscing ante non diam sodales hendrerit. Ut velit mauris, egestas
sed, gravida nec, ornare ut, mi.
                                        Aenean ut orci vel
                                        massa suscipit
                                        pulvinar. Nulla
                                        sollicitudin. Fusce
                                        varius, ligula non
                                        tempus aliquam, nunc
                                        turpis ullamcorper
                                        nibh, in tempus
                                        sapien eros vitae
                                        ligula. Pellentesque
                                        rhoncus nunc et
                                        augue. Integer id
                                        felis. Curabitur
                                        aliquet pellentesque
                                        diam.
      a) Integer quis metus

vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing
elit.

      b) Morbi vel erat non mauris convallis vehicula.

Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue
eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non
elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae
magna.

    2. Aliquam convallis sollicitudin purus.

Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et
tristique ligula justo vitae magna.

  a. Praesent aliquam, enim at
  b. fermentum mollis, ligula massa adipiscing nisl,
  c. ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien.   Vivamus
     leo.
  d. Aliquam euismod libero eu enim.

Nulla nec felis sed leo placerat imperdiet.

    3. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla
       tincidunt tincidunt mi.

Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et
ultricies lacus lorem varius purus. Curabitur eu amet.

Et le script se trouve ici. [Commentaires](http://buzzerl.iuwt.fr/web/link?id=231)

Posted by chickenzilla | Permanent link | File under: codaz, python | /\

vendredi 23 juillet 2010, 23:38:57 (UTC+0200)

Chuck

Chuck est un langage de programmation à la syntaxe proche du C permettant la synthèse audio, la composition et l’analyse du son. Rien que ça. Il est plutôt simple à prendre en main, et peu s’avérer très puissant.

Voici mon premier essai, rien de plus qu’un peu de bruit :

PulseOsc p => dac => WvOut w => blackhole;
"/tmp/dump.wav" => string filename => w.wavFilename;


20 => p.freq;
.7 => p.width;
.01 => p.phase;

fun void beat1 (float s, float e, float l) {
    1 => int sign;
    s => p.freq;
    if (e < s) {
        s => float t; e => s; t => e;
        -1 => sign;
    }
    (e - s) / l => float stp;
    <<< "Start:", s, "  End:", e, "  Step:", stp, "  Sign:", sign >>>;
    for (s => float i; i < e; i + stp => i) {
        p.freq() + (sign * stp) => p.freq;
        1::ms => now;
    }
}

for (.5 => float b; b > 0.01; b - 0.01 => b) {
    beat1(420, 20, 500.0 * b);
}

for (50 => int i; i < 200 ; i++) {
  beat1(80, 22, 200);
  22 => int j;
  while (j < 550) {
    beat1(j, j + 100, 90);
    j + 20 => j;
  }
  beat1(550, 22, 200);
  (p.width() + 0.1) % 0.9 => p.width;
  <<< "Pwet." >>>;
}

Le résultat est là : crap.wav

Avec un peu d’entraînement, il doit être possible de faire du son écoutable, et même de la musique (!!). Gonna be fun.


Posted by chickenzilla | Permanent link | File under: codaz, chuck, son | /\