My personal blog,
Joseph Basquin (Orléans, France)



Contact via email for data / Python consulting and freelancing.

Articles about:

Don't read #tech articles except you really want to.

Some of my projects:
BSQN Digital BigPicture

A few thingz

Joseph Basquin


An improved Launchpad for Ableton Live

The Novation Launchpad is a great controller for Ableton Live, especially because it allows you to play / jam / record without having to look at the computer screen.

Except for one thing: you can play a clip, record a clip, stop a clip... but you cannot delete a clip. This limitation can be annoying, because sometimes when playing with your synth/guitar/whatever you need to record many takes before having the right one, and you also want to be able to immediately delete the bad recordings. Strangely, this was not possible with the Launchpad (now possible with Launchpad Pro, but it is more than twice as expensive).

So here is a "MIDI remote script" (just a little .py file) that you can copy in C:\ProgramData\Ableton\Live 10 Suite\Resources\MIDI Remote Scripts\Launchpad (for Windows, or the equivalent folder on Mac), that adds this feature to the Launchpad: the bottom right button will be a "delete the currently selected clip" button.

Bonus: this script also transforms the last row of the Launchpad into "stop clip" buttons, which is quite useful.




Void CMS – A lightweight website creation tool

Back in 2014, each time I wanted to start a new project and do a quick webpage, I had to create a Wordpress, create a new database by my hosting provider, edit the Wordpress configuration files about the database, and then navigate in the WP admin panel to create a new page, etc. Not lightweight enough! Also it was impossible to duplicate a whole website in 2 seconds by copying /var/www/wordpress1/ to /var/www/wordpress2/.

For all these reasons, I spent 1 or 2 evenings to juste write my own website creation tool: Void CMS.

100 lines of PHP code, and that's it! It works for both static websites and blog articles. Five years later, I still use it for a few projects of mine.

How do you write articles with it? Just open your favourite text editor, write a page (using Markdown syntax) and save it as a .txt file like /page/example.txt or /article/01.txt:


#Example page

This is a nearly empty page.

Do you want to get the latest news? The [blog](blog) is here!

You can try it here: Void CMS.

Joseph83 & 2Things - Smile (They Said)

Here is a song I composed and produced in London with the songwriter and singer Natalie Mitchell.

"The songs about
people hurting u
but just pretend to be happy
and it may work just smile."


Available on Spotify.


Here is the music video:

RaspFIP, ou comment (re)découvrir la radio FIP

Voir ici pour la page du projet: RaspFIP.

Soyons clairs : FIP est l'une des meilleures radios en France (merci Radio France) à écouter pendant des heures sans se lasser : peu de distraction en parole (une ou deux fois par heure et avec des voix qui font la réputation de la station), et surtout de la musique. Et de la bonne musique - on peut passer en 15 minutes d'un jazz hyper pointu à une nouveauté indie-pop (qu'on a juste envie de Shazamer pour découvrir l'album), et avoir ensuite du J.S. Bach suivi par du hip-hop. Les années étudiantes où j'écoutais beaucoup FIP m'ont permis de découvrir des nouveaux albums cool toutes les semaines.

Seul problème : la station n'émet en FM qu'à Paris (105.1 Mhz), Strasbourg (92.3 Mhz), Bordeaux, et cinq ou six grandes villes, mais pas ailleurs, hélas ! Pendant longtemps j'ouvrais un onglet dans le browser à la page FIP, mais après il faut brancher son laptop à des haut-parleurs pour avoir un bon son ou se connecter via Bluetooth, de même on peut utiliser l'app FIP sur téléphone, mais finalement, son téléphone est occupé par ça, et j'ai remarqué qu'à l'usage, le fait d'avoir plusieurs actions à faire pour démarrer la radio faisait que je l'écoutais moins souvent que quand j'étais dans une ville couverte en FM, où il suffisait d'appuyer sur ON sur son poste de radio.

Comme dans la plupart de mes projets open-source (exemple celui-ci) où je suis convaincu que le taux d'utilisation au quotidien d'un outil donné est inversement proportionnel au nombre d'actions nécessaires, j'ai cherché une solution où je peux démarrer cette radio en UNE SEULE ACTION.

Voici un prototype purement fonctionnel :

Voici donc : RaspFIP - Un FIP player sur Raspberry Pi. Il existe sans-doute des centaines de media player sur Raspberry Pi, mais j'ai cherché à faire un objet simple qui ne fait qu'une seule chose :

L'utilisation est donc la suivante : quand on arrive dans la pièce, on appuie sur ON, et 10 secondes plus tard, la radio démarre sur FIP. Rien d'autre à faire.

Après quelques années d'utilisation, je constate qu'avec cette méthode j'écoute à nouveau cette radio autant que quand j'avais juste à allumer ma radio FM calée sur la bonne fréquence (dans une ville couverte en FM).

Comment faire une RaspFIP ? Voir ici pour plus de détails:

Low latency audio on a Windows PC with the built-in soundcard

(Edited 05 November 2019)

So you want to use your music production software, with low latency on your PC/Windows laptop?

You have basically two options:

Michael Tippach's ASIO4ALL is incredibly useful for the PC music community since more than 10 years, because it turns your cheap computer's built-in soundcard into a low-latency one! With ASIO4ALL, you can plug a MIDI keyboard and play piano or synth with no "delay". Without it, the delay of more than 50 ms between the keypress and the sound makes it nearly impossible to play.

But ASIO4ALL has one major drawback: it's not multi-client. This means that if your DAW is open with ASIO4ALL as sound driver, then, if you open:

... then it won't work: the audio is not available for them: your DAW and ASIO4ALL have locked your soundcard.

This is really annoying and I can't count how many hours of my life I wasted since 10 years to find a solution for this (every few months/years I retried and retried and benchmarked every new method). (Ok switching to Mac would have been a faster solution...)

The real difficulty is that we would like to use

Setup (1): A music software in ASIO + a standard application like Firefox using the so-called Windows WDM driver

Here is a list of things I tried, unsuccessfully:

Now, promising solutions:

Now, a working solution (update 2019):

Interested for future evolutions and other (audio) tools?



An attempt to generate random data with audio (and your computer's built-in microphone)

You probably know that generating some real random data is not so easy to do with a computer. How to design a good Random Number Generator (or a pseudo-random one) is a math topic that you can work years on ; it's also something very important for real-life applications such as security/cryptography, for example when you need to generate strong passwords.

Usually (and this is true in general in cryptography), designing your own algorithm is bad, because unless you're a professional in this subject and your algorithm has been approved by peers, you're guaranteed to have flaws in it, that could be exploited.

But here, for fun (don't use it for critical applications!), let's try to generate 100 MB of good random data.

1) Record 20 minutes of audio in 96khz 16bit mono with your computer's built-in microphone. Try to set the mic input level so that the average volume is neither 0 dB (saturation) nor -60 dB (too quiet). Something around -10 dB looks good. What kind of audio should you record? Nothing special, just the noise in your room is ok. You will get around 20*60*96000*2 ~ 220 MB of data. In these 220 MB, only the half will be really useful (because many values in the signal - an array of 16-bit integers - won't use the full 16-bit amplitude: many integers "encoding" the signal might be for example of absolute value < 1024, i.e. will provide only 10 bits)

2) Now let's shuffle these millions of bits of data with some Python code:

from import wavfile
import numpy as np
import functools

sr, x ='sound.wav')  # read a mono audio file, recorded with your computer's built-in microphone

L = []  # list of bits
for i in range(len(x)):
    bits = format(abs(x[i]), "b")  # get binary representation of the data
                                   # don't use "016b" format because it would create a bias: small integers (those not using
                                   # the full bit 16-bit amplitude) would have many leading 0s!
    L += map(int, bits)[1:]        # discard the first bit, which is always 1!

print L.count(1)
print L.count(0)  # check if it's equidistributed in 0s and 1s

n = 2 ** int(np.log2(len(L)))
L = L[:n]  # crop the array of bits so that the length is a power of 2; well the only requirement is that len(L) is coprime with p (see below)

# The trick is: don't use **consecutive bits**, as it would recreate something close to the input audio data. 
# Let's take one bit every 96263 bits instead! Why 96263? Because it's a prime number, then we are guaranteed that
# 0 * 96263 mod n, 1 * 96263 mod n, 2 * 96263 mod n, ..., (n-1) * 96263 mod n will cover [0, 1, ..., n-1].  (**)
# This is true since 96263 is coprime with n. In math language: 96253 is a "generator" of (Z/nZ, +).

p = 96263  # The higher this prime number, the better the shuffling of the bits! 
           # If you have at least one minute of audio, you have at least 45 millions of useful bits already, 
           # so you could take p = 41716139 (just a random prime number I like around 40M)

M = set()
with open('random.raw', 'wb') as f:
    for i in range(0, n, 8):
        M.update(set([(k * p) % n for k in range(i, i+8)]))  # this is optional, here just to prove that our math claim (**) is true
        c = [L[(k * p) % n] for k in range(i, i+8)]   # take 8 bits, in shuffled order
        char = chr(functools.reduce(lambda a, b: a * 2 + b, c))  # create a char with it

print M  == set(range(n))  # True, this shows that the assertion (**) before is true. Math rulez!

Done, your random.raw file is filled with random data!


On random multiplicative functions

We consider a sequence $(f(p))_{p \ prime}$ of independent random variables taking values ±1 with probability 1/2, and extend $f$ to a multiplicative arithmetic function defined on the squarefree integers.

Finding an upper bound for $M(x) = \sum_{n \leq x} f(x)$ has been long studied. Wintner proved in 1944 that $M(x) \ll x^{1/2 + \varepsilon}$ a.e., later improved by Erdös who establishes $M(x) \ll \sqrt{x} (\log x)^c$. Halász then obtains in 1983 the upper bound $M(x) \ll \sqrt{x} e^{c \sqrt{(\log\log x)(\log\log \log x)}}$ a.e. In a preliminary work by Lau, Tenenbaum, Wu (improved since then), the bound $M(x) \ll \sqrt{x} (\log \log x)^{5/2 + \varepsilon}$ has been obtained.

The use of martingale methods, a generalization of the Doob inequality (Hájek-Renyi inequality) and other techniques allows to obtain

$$M(x) \ll \sqrt{x} (\log \log x)^{2 + \varepsilon} \qquad\textrm{a.e.}$$

This was the goal of my work Sommes friables de fonctions multiplicatives aléatoires published in Acta Arith., 2012, as well as obtaining estimations of the type $\Psi_f(x,y)\ll \Psi(x,y)^{1/2+\varepsilon}$ on y-smooth (a.k.a. friable) integers ≤ x.

Is it possible to improve the exponent $2+\varepsilon$ further? The question remains open (the exponent $3/2 + \varepsilon$ had been claimed – but then removed in an updated version – in a more recent article).

How to create symbolic links with Windows Explorer?

Quick tip: here is how to create symlinks in Windows without using any command line tool.

Create symbolic links with a GUI

1) If you have Python installed, create

import win32clipboard    # pip install pywin32 if you haven't installed it already
import sys, os, subprocess
fname = sys.argv[1]
filenames = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
for filename in filenames:
    base = os.path.basename(filename)
    link = os.path.join(fname, base)
    subprocess.Popen('mklink %s "%s" "%s"' % ('/d' if os.path.isdir(filename) else '', link, filename), shell=True)

2) Open regedit and

How to use it?

SamplerBox - a hardware sampler (to be continued)

This is in my Top10 biggest projects.

For many years, I had been looking for a small portable inexpensive sampler that can be used to play a good 1 GB piano sample set (with many velocity layers and supporting sustain pedal), a 500 MB Rhodes piano sampleset, drums, etc. and all sorts of sounds.

There was nothing like this on the market, but instead:

So I started brainstorming about this (this was my first sketch, I always search ideas with a pen + paper):



... and came to the idea that this could be possible with a Raspberry Pi. I then started to code a mixing engine in Python. Everybody told me "This is impossible, you won't be able to have a decent polyphony with Python, it's not fast enough...". The challenge was appealing for this reason and also because the only solutions available on Raspberry Pi at that time were 6-voice polyphony software samplers.

I spent days on this, and finally released both open-source code and hardware (rough) schematics:

Here is the blog:

I was happy to achieve a polyphony of ... nearly 100 voices at the same time, so my mixing engine in Python+Cython was not too bad ;)

Then it's a long story, many people contacted me, a commmunity growed on the forum (I should do a post about the software powering the forum, it's handmade too), etc.

(to be continued...)

Pour en finir avec les préfaces (postfaçons-les!)

Figure 1: Version DIY-postfacée des Confessions de Rousseau.


Par quelle prétention, oui prétention, l'éditeur ou le "préfaceur" peut-il placer ses propres mots – une vingtaine de pages explicatives, souvent utiles a posteriori après lecture du texte principal, mais peu éclairantes avant la lecture du texte – en début de livre, avant même les mots de l'auteur ?

Par quel mystère est-il devenu la norme pour les livres de poche de devoir feuilleter jusqu'à la page 35 pour enfin pouvoir lire les premières lignes du texte original de l'auteur ?

Pour illustrer mon propos, je ne vois pas en quoi les premières lignes des Confessions de Rousseau:

Voici le seul portrait d'homme, peint exactement d'après nature et dans toute sa vérité, qui existe et qui probablement existera jamais.
Je forme une entreprise qui n'eut jamais d'exemple et dont l'exécution n'aura point d'imitateur. Je veux montrer à mes semblables un homme dans toute la vérité de la nature ; et cet homme ce sera moi.

ne se suffiraient pas à elles-mêmes et nécessiteraient d'être précédées par cette préface:

Ce livre, pour son auteur comme pour nous, est d'abord un acte: confessions, non mémoires, même si la scansion du récit s'appuie sur une trame chronologique; appel à l'autre, appel séducteur et pathétique, qui suscite en alternance chez le lecteur intimité complice et mise à distance irritée, non recherche du temps perdu ; apologie et non bilan ; ...

et une vingtaine de pages du même acabit ?

Hormis rares cas (notamment préface choisie en accord avec l'auteur au moment de l'édition, ce qui n'est clairement pas le cas ici pour Rousseau), je pense n'avoir jamais lu une préface d'une œuvre classique qui fasse réellement sens avant d'avoir lu le texte de l'auteur. La quasi-totalité des préfaces de textes classiques apportent un éclairage supplémentaire, historique, des éléments de contexte qui sont intéressants après lecture du corps du texte, mais pourquoi placer ces informations avant ? Dans le cas illustré précédemment, cette préface de J. B. Pontalis aurait certainement toute sa place dans cet ouvrage, mais en tant que postface.

Si on pousse le raisonnement plus loin, on pourrait presque arriver à la conclusion que l'éditeur estime que l'auteur n'a pas suffisament donné d'éléments de contexte pour que le texte puisse se suffire à lui-même et donc qu'il faudrait "corriger" cela grâce des explications préalables pour pouvoir appréhender le texte. C'est pourtant le choix de l'auteur de débuter son texte comme il l'a fait, pourquoi estimer qu'il faut l'expliquer au prélalble comme si ses mots étaient insuffisants ?

Les préfaces sont aussi une aberration d'un point de vue pédagogique : on a tous croisé au lycée des personnes (pas si rares) qui se targuaient de ne pas avoir lu le livre sur lequel on était censé travailler:

— Tu l'as lu toi?
— Non j'l'ai pas lu!

Pour quelqu'un pas franchement branché lecture, réussir à trouver le début du texte original de l'auteur n'est pas une mince affaire. Je suis prêt à parier que bon nombre de collégiens sont passés à côté d'une pièce de Molière parce qu'ils se sont perdus ou endormis dans les quinze premières pages d'élucubrations d'un quelconque inspecteur général (sans savoir qu'ils ne lisaient en fait pas du Molière). Je suis prêt à parier aussi que le taux de lecture, dans une classe de 3ème, d'une pièce de Molière serait bien supérieur si la pièce démarrait en page 3 et non pas en page 33 !

Quel meilleur moyen de donner éclat à un texte d'auteur si ce n'est de lui permettre d'apparaître noir sur blanc dès la première ou deuxième page après avoir ouvert l'ouvrage ?

De grâce, chers éditeurs, postfacez vos préfaces.

Newer articles Older articles