Simple guitar tuner using Pd

A reader recently asked me if I could post a guitar tuner patch. Here it is!

It is based on the [sigmund~] object that comes with Pd vanilla. It does pitch tracking, which means that it analyses the frequency of the fundamental -and optionally of partials- in the incoming sound (probably using FFT analysis). This is a great object that I used previously in my (very simple) guitar synthesiser example patch.

In the context of a guitar tuner, we assume that the musician plucks the strings one at a time. [sigmund~] is very good at analysing single notes (or single pitches), so this is the perfect object for us.It has many parameters that can be set, but the size of the analysis window is the most important of all for a guitar tuner. The larger the window, the lower the lowest possible frequency that can be detected. A lower pitch means a longer wavelength, and less oscillations for a given period of time : the window needs to be large enough for [sigmund~] to have enough data to analyse the pitch accurately. The drawback of a large analysis window is increased latency, but it really doesn’t matter in the case of a tuner.

Simple tuner for electric guitar made with Pure Data (Pd)

In the picture above you can see the GUI of the guitar tuner patch. If your string is perfectly in tune, the pointer of the horizontal slider should be perfectly in the middle, and the value in the number box below should be 0. For each target note (say, E for the first string), the width of the slider is equal to a whole step : if the pointer is close to the left end, your string is tuned to Eb, and if it is close to the right end it’s tuned to F. The target note that the patch detects is indicated in the green area. The toggle to the right is there to switch audio on and off inside the tuner, because pitch tracking is quite expensive and you don’t want the tuner to to stay on while you’re playing.

A nice feature of this patch is the possibility of using practically any tuning. The tuner is set to standard tuning by default (E, A, D, G, B ,E), but you can change the target tuning by simply sending a list of 6 midi notes to the tuner’s inlet (lower E is 40, F is 41, F# is 42, etc.). A different list for open-G tuning is there in the example patch just to show you how it works (I kind of like the blues :) ).

Inside of tuner for electric guitar made with Pure Data (Pd)

Please not that this patch is not perfect… You are expected to pluck your strings gently! Slaming your strings may confuse [sigmund~] as the spectrum of the sound may be very different, and give erratic results. For this same reason, the algorithm used to detect whether the note being played is close a specific target note (look inside “IdentifyNote” for details) actually detects the note at three different octaves. This means that if you wanted to tune your lower E string, the patch would actually look for lower E, E one octave higher, and E two octaves higher. It could become confusing if you used a specific tuning that would include a F, as the patch would look for a note between Eb and F for the E string, and for a note between E and F# for the F string. I’ll post an upadte when I find a way to fix this. Anyway, I think it works great for standard and common open tunings.

You can download the patch here. I thought about posting a sound sample for awhile, but then I decided that not everybody has my sense of humour…

About these ads
This entry was posted in Tuner and tagged , , , . Bookmark the permalink.

7 Responses to Simple guitar tuner using Pd

  1. Nicolas says:

    Salut,

    merci pour ton blog qui m’a bien aidé sur PureData !
    Je débute le développement iOS avec Xcode et Pdlib, et j’aimerais bien faire une application “Guitar Tuner”.

    Pour le moment, je débute avec Pdlib… j’arrive à faire une simple application, jouant les notes EADBGe via pdLib, en envoyant la bonne note Midi.

    Concernant l’application d’accordage de guitare :
    Je ne sais pas si ton patch est conseillé au non pour faire ce genre d’application ? Sinon dois-je trouver un autre patch ?
    Si je dois utiliser ton patch, comment faire pour “écouter” le son du micro, et recuper le pitch de la note jouée ?

    Merci pour ton retour !
    Nicolas

    • Salut Nicolas,

      Donc manifestement tu maîtrise déjà un peu libpd, c’est un on départ.
      Je n’ai pour ma part jamais vraiment utilisé cette bibliothèque, j’ai surtout utilisé PdDroidParty (http://droidparty.net/), qui est lui-même construit sur libpd.

      Pour accéder à l’input, je n’ai jamais rien eu de particulier à faire si je me souviens bien. Simplement inclure un [adc~] dans le patch et c’est tout.
      Tu as essayé ? A priori je dirais que mon patch doit fonctionner normalement, à part le GUI (il me semble que dans PdDroidParty les sliders ne peuvent pas bouger tout seuls).

      Pierre.

      • Nicolas says:

        Salut,

        Merci pour ton retour.
        J’avais réussi à faire marcher un autre tuner (un autre patch) que j’avais trouver sur le net, mais il n’est pas aussi précis que le tiens.

        J’avais quelque remarques concernant ton patch.

        1)
        Il fonctionne bien en l’ouvrant via Pd (tuner.pd), par contre je suis obligé de cliquer sur la case pour le faire marcher par défaut (à coté de la note)… peut on le bypasser ? Si oui comment ? Car je ne sais pas comment faire depuis xcode pour envoyer un message on/off…

        Et pour récupérer les informations du patch, depuis mon listener sous Xcode :
        - le nom de la note, c’est bien note_name ?
        - pour recuperer le “delta” de la note (en dessous de l’accordeur), je peux faire un message send “s delta” ?

        Merci d’avance, si ce n’est pas clair dis moi :)

      • Salut,
        Pour le bouton on/off : dans tuner.pd, tu déconnectes simplement le toggle de l’objet [switch~] en dessous, et il sera allumé dès l’ouverture du patch principal (Main_tuner.pd). Ou tu supprimes [switch~].
        Pour le nom de la note : toujours dans tuner.pd, en haut à droite, il y a un groupe d’objets qui commence par [r midi_to_letter]. En bas de ce groupe, la lettre correspondant à la note jouée sort de [symbol], et entre dans le message qui l’envoie au canvas Note_name. Tu n’as qu’à mettre un [s lettre_note] juste après le [symbol], avant le message.
        Pour le delta : c’est envoyé par [s cursor_tuner], en bas à gauche de tuner.pd. Tu récupères la valeur ici (elle varie entre -1 et 1).

  2. Nicolas says:

    Merci.

    Cela fonctionne en enlevant le TGL et le switch, le tuner se met en route directement en lancent Main_tuner.pd depuis PureData.

    Pour l’ajout du Note_name, c’est bien un message qu’il faut rajouter, pas un objet ?
    Et tu met s lettre_note dans le nom, mais aussi dans la propriété sender ?

    Par contre quand je le lance depuis Xcode, j’obtiens l’erreur suivante dans la console de Debug :
    Pd: error: signal outlet connect to nonsignal inlet (ignored).
    Les 3 fichiers pd sont bien au même endroit.

    et j’ai rajouté le code suivant pour récupérer la valeur cursor_tuner :
    dispatcher addListener:self forSource:@”cursor_tuner”];

    Mais il ne passe pas dans ma fonction où je dois recevoir les infos – cela fonctionnait avec l’autre patch que j avais trouver sur le net :

    -(void)receiveFloat:(float)value fromSource:(NSString *)source {
    int pitchTemp;
    int note;
    int octave;
    float delta;
    int diff;

    NSLog(@”ici”); <—– je n'ai pas cette ligne de debug, il ne passe pas ici

    Sûrement du à l'erreur signal outlet connect to nonsignal inlet (ignored) ?

    Merci pour ton aide et mes excuses pour mon ignorance :)

    • Salut, pour l’erreur “signal outlet…”, lance le patch dans Pure Data et regarde ce que ça dit. Moi ça ne me donne aucune erreur, a priori tu peux ignorer.
      D’une façon générale, il faut utiliser un objet [s nom] pour envoyer des messages quelque part avec Pd. Donc pour Note_name il faut créer un objet [s Note_name] si tu veux pouvoir le recevoir avec Libpd.
      Moi je ne connais pas du tout Xcode, donc je peux ps aller plus loin. Tu devrais essayer avec un petit patch tout simple qui envoie un message par un objet [s ], et le tester avec ton code pour être sûr que tout fonctionne bien.

  3. Pingback: guru post

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s