Visualizing MusicBrainz instruments

One modern library for data visualization is d3js. You can find a gallery of examples online. I would like to use one of these examples, the Radial Tidy Tree to represent the instruments in MusicBrainz.

Fortunately Jupyter allows to call the d3js library from within a notebook, so that we can continue using Python3 as before:

This page exists as an HTML notebook on github.io and a static copy of the d3 graphs can be found on this page.

Setup

In [1]:
%run startup.ipy
Last notebook update: 2018-06-06
Git repo: git@bitbucket.org:loujine/musicbrainz-dataviz.git
Importing libs
Defining database parameters

Defining *sql* helper function
Last database update: 2018-06-02

Python packages versions:
numpy       1.14.3
pandas      0.23.0
sqlalchemy  1.2.8
CPython 3.7.0b5
IPython 6.4.0

Fetching instruments from the database

There is a table dedicated to instruments in the database and a few relations between instruments.

The list of instruments with their description can be found directly in MusicBrainz. The relations are explained here.

We're going to consider all relationships under the same parent/child umbrella.

In [2]:
df = sql("""
SELECT i0.name AS parent_instrument,
       i1.name AS child_instrument,
       i0.gid  AS parent_mbid,
       i1.gid  AS child_mbid
  FROM link_type               AS lt
  JOIN link                    AS l   ON l.link_type = lt.id
  JOIN l_instrument_instrument AS laa ON laa.link = l.id
  JOIN instrument              AS i0  ON i0.id = laa.entity0
  JOIN instrument              AS i1  ON i1.id = laa.entity1
 WHERE lt.name != 'related to'
   AND lt.name != 'hybrid of'
;""")
In [3]:
df.head()
Out[3]:
parent_instrument child_instrument parent_mbid child_mbid
0 natural brass instruments nabal e5781903-d6ef-4480-a158-60300265577c 4e22ddb3-6908-4a5f-a9ae-b8a7440f6c7c
1 recorder sopranino recorder 3cf4c0c9-160a-4d73-9243-7d0e0df17050 db7a69ea-4cae-44ed-94ab-a112b6bd7a3c
2 recorder subcontrabass recorder 3cf4c0c9-160a-4d73-9243-7d0e0df17050 0385a06d-dbed-4112-bfab-31b78590dd8f
3 recorder tenor recorder 3cf4c0c9-160a-4d73-9243-7d0e0df17050 4a6559f5-cbd3-4f72-8386-af028547ff30
4 double reed crumhorn ee570715-6ded-4cff-ad7e-feef6a5bca44 e1b9fc01-a349-444f-b798-9893b5af83f4

Preparing data for visualization

d3js requires a lot of preparation to display our data as a radial tree. I will not explain in detail how I do it, only the rough idea.

The first step is to create a tree-like structure (with dictionaries) to organize all instruments:

In [4]:
# create subdictionaries with relations {parent: child}
rels = {}
for t in df[['parent_instrument', 'child_instrument']].itertuples():
    rels.setdefault(t.parent_instrument, {})[t.child_instrument] = rels.setdefault(t.child_instrument, {})
    
# find instruments without parents
s = set(df.parent_instrument.tolist()).difference(df.child_instrument.tolist())

# create a main 'tree' dictionary as a global parent to those instruments
tree = {}
for el in s:
    tree[el] = rels[el]

# display only part of the tree, e.g. the bowed string instruments
from pprint import pprint
pprint(tree['strings']['bowed string instruments'])
{'Blaster Beam': {},
 'Cretan lyra': {},
 'alto violin': {},
 'arpeggione': {},
 'baryton': {},
 'bass violin': {'cello': {'electric cello': {}}},
 'bowed psaltery': {},
 'crwth': {},
 'djoza': {'kamancheh': {},
           'rebab': {'rebec': {}, 'rubab': {'sarod': {}}, 'sarod': {}}},
 'double bass': {'electric upright bass': {}},
 'gudok': {'gadulka': {}},
 'haegeum': {},
 'huqin': {'banhu': {},
           'chuurqin': {'morin khuur': {}},
           'cizhonghu': {},
           'diyingehu': {},
           'erhu': {'gaohu': {}, 'zhonghu': {}},
           'gaohu': {},
           'gehu': {},
           "jing'erhu": {},
           'jinghu': {},
           'yehu': {},
           'zhonghu': {},
           'zhuihu': {}},
 'igil': {},
 'jouhikko': {},
 'lirone': {},
 'nyckelharpa': {},
 'ravanahatha': {},
 'rebec': {},
 'sarangi': {'dilruba': {}, 'esraj': {}},
 'saw sam sai': {},
 'saw u': {'yehu': {}},
 'shichepshin': {},
 'soprano violin': {},
 'talharpa': {},
 'tenor violin': {},
 'treble violin': {},
 'tromba marina': {},
 "viola d'amore": {},
 'viola da gamba': {},
 'viola organista': {},
 'violin family': {'cello': {'electric cello': {}},
                   'double bass': {'electric upright bass': {}},
                   'viola': {'electric viola': {}, 'violoncello piccolo': {}},
                   'violin': {'alto violin': {},
                              'electric violin': {},
                              'soprano violin': {},
                              'tenor violin': {},
                              'treble violin': {},
                              'vielle': {},
                              'violotta': {}},
                   'violoncello piccolo': {}},
 'violino piccolo': {},
 'viololyra': {},
 'violoncello piccolo': {},
 'violone': {'double bass': {'electric upright bass': {}}},
 'yaylı tanbur': {},
 'ģīga': {}}

This looks ok. Now, knowing that d3 expects data formatted like {'id': 'root.violins.violin', 'value': ''}, we can prepare the data to convert to JavaScript. Let's try first by taking only the bowed string instruments in order to have relatively few data to display:

In [5]:
data = [{'id': 'strings', 'value': ''}]

def parse(subdict, prefix):
    for instrument_name, children in subdict.items():
        data.append({'id': prefix + instrument_name, 'value': 1000})
        if children != {}:
            parse(children, prefix=prefix + instrument_name + '.')

parse(tree['strings']['bowed string instruments'], prefix ='strings.')
pprint(data[:10])
[{'id': 'strings', 'value': ''},
 {'id': 'strings.jouhikko', 'value': 1000},
 {'id': 'strings.rebec', 'value': 1000},
 {'id': 'strings.violoncello piccolo', 'value': 1000},
 {'id': 'strings.saw u', 'value': 1000},
 {'id': 'strings.saw u.yehu', 'value': 1000},
 {'id': 'strings.haegeum', 'value': 1000},
 {'id': 'strings.nyckelharpa', 'value': 1000},
 {'id': 'strings.lirone', 'value': 1000},
 {'id': 'strings.violin family', 'value': 1000}]

Now we are ready to transfer the data to d3. The easiest is to use the notebook magic to store our data structure as a JavaScript array on the window global object.

In [6]:
# convert our Python dict to JavaScript array
from IPython.display import Javascript
Javascript("""window.stringsData=%s;""" % data)
Out[6]:

And now we copy the CSS and JS we need from the Radial Tidy Tree example

In [7]:
%%html
<style>

.node circle {
  fill: #999;
}

.node text {
  font: 10px sans-serif;
}

.node--internal circle {
  fill: #555;
}

.node--internal text {
  text-shadow: 0 1px 0 #fff, 0 -1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff;
}

.link {
  fill: none;
  stroke: #555;
  stroke-opacity: 0.4;
  stroke-width: 1.5px;
}

</style>
In [8]:
%%javascript
element.append('<svg id="radial-string" width="1000" height="800"></svg>');

requirejs.config({
    paths: { 
        'd3': ['//cdnjs.cloudflare.com/ajax/libs/d3/4.7.4/d3.min'], 
    },
});

// from https://bl.ocks.org/mbostock/4063550

require(['d3'], function(d3) {

    var svg = d3.select("svg#radial-string"),
        width = +svg.attr("width"),
        height = +svg.attr("height"),
        g = svg.append("g").attr("transform", "translate(" + (width / 2) + "," + (height / 2) + ")");

    var stratify = d3.stratify()
        .parentId(function(d) { return d.id.substring(0, d.id.lastIndexOf(".")); });

    var tree = d3.tree()
        .size([360, 500])
        .separation(function(a, b) { return (a.parent == b.parent ? 1 : 2) / a.depth; });

    var root = tree(stratify(window.stringsData));

    var link = g.selectAll(".link")
    .data(root.descendants().slice(1))
    .enter().append("path")
      .attr("class", "link")
      .attr("d", function(d) {
        return "M" + project(d.x, d.y)
            + "C" + project(d.x, (d.y + d.parent.y) / 2)
            + " " + project(d.parent.x, (d.y + d.parent.y) / 2)
            + " " + project(d.parent.x, d.parent.y);
      });

    var node = g.selectAll(".node")
    .data(root.descendants())
    .enter().append("g")
      .attr("class", function(d) { return "node" + (d.children ? " node--internal" : " node--leaf"); })
      .attr("transform", function(d) { return "translate(" + project(d.x, d.y) + ")"; });

    node.append("circle")
        .attr("r", 2.5);

    node.append("text")
      .attr("dy", ".31em")
      .attr("x", function(d) { return d.x < 180 === !d.children ? 6 : -6; })
      .style("text-anchor", function(d) { return d.x < 180 === !d.children ? "start" : "end"; })
      .attr("transform", function(d) { return "rotate(" + (d.x < 180 ? d.x - 90 : d.x + 90) + ")"; })
      .text(function(d) { return d.id.substring(d.id.lastIndexOf(".") + 1); });

    function project(x, y) {
        var angle = (x - 90) / 180 * Math.PI, radius = y;
        return [radius * Math.cos(angle), radius * Math.sin(angle)];
    }
    
    return {};
});
stringsjouhikkorebecvioloncello piccolosaw uhaegeumnyckelharpalironeviolin familytreble violintromba marinaģīgaCretan lyrabowed psalterycrwthgudoksarangitalharpaviola organistaviola da gambayaylı tanburviolino piccoloshichepshinsaw sam saiigilravanahathaarpeggioneviololyradjozadouble basstenor violinsoprano violinalto violinhuqinvioloneviola d'amorebass violinBlaster Beambarytonyehucelloviolaviolinvioloncello piccolodouble bassgadulkaesrajdilrubakamanchehrebabelectric upright bassdiyingehubanhuerhugehujing'erhujinghucizhonghuyehugaohuzhonghuzhuihuchuurqindouble basscelloelectric celloelectric violavioloncello piccolovielleviolottatenor violinsoprano violinalto violintreble violinelectric violinelectric upright basssarodrebecrubabgaohuzhonghumorin khuurelectric upright basselectric cellosarod

Looks nice, doesn't it? If you can't see it I copied the result on github.io.

All instruments

What if we try the same with all instruments?

In [9]:
data = [{'id': 'root', 'value': ''}]

def parse(subdict, prefix):
    for instrument_name, children in subdict.items():
        data.append({'id': prefix + instrument_name, 'value': 1000})
        if children != {}:
            parse(children, prefix=prefix + instrument_name + '.')

parse(tree, prefix ='root.')
In [10]:
# convert our Python dict to JavaScript array
from IPython.display import Javascript
Javascript("""window.data={};""".format(data))
Out[10]:
In [11]:
%%javascript
element.append('<svg id="radial" width="1000" height="800"></svg>');

requirejs.config({
    paths: { 
        'd3': ['//cdnjs.cloudflare.com/ajax/libs/d3/4.7.4/d3.min'], 
    },
});

// from https://bl.ocks.org/mbostock/4063550

require(['d3'], function(d3) {

    var svg = d3.select("svg#radial"),
        width = +svg.attr("width"),
        height = +svg.attr("height"),
        g = svg.append("g").attr("transform", "translate(" + (width / 2) + "," + (height / 2) + ")");

    var stratify = d3.stratify()
        .parentId(function(d) { return d.id.substring(0, d.id.lastIndexOf(".")); });

    var tree = d3.tree()
        .size([360, 500])
        .separation(function(a, b) { return (a.parent == b.parent ? 1 : 2) / a.depth; });

    console.log(data);
    var root = tree(stratify(data));

    var link = g.selectAll(".link")
    .data(root.descendants().slice(1))
    .enter().append("path")
      .attr("class", "link")
      .attr("d", function(d) {
        return "M" + project(d.x, d.y)
            + "C" + project(d.x, (d.y + d.parent.y) / 2)
            + " " + project(d.parent.x, (d.y + d.parent.y) / 2)
            + " " + project(d.parent.x, d.parent.y);
      });

    var node = g.selectAll(".node")
    .data(root.descendants())
    .enter().append("g")
      .attr("class", function(d) { return "node" + (d.children ? " node--internal" : " node--leaf"); })
      .attr("transform", function(d) { return "translate(" + project(d.x, d.y) + ")"; });

    node.append("circle")
        .attr("r", 2.5);

    node.append("text")
      .attr("dy", ".31em")
      .attr("x", function(d) { return d.x < 180 === !d.children ? 6 : -6; })
      .style("text-anchor", function(d) { return d.x < 180 === !d.children ? "start" : "end"; })
      .attr("transform", function(d) { return "rotate(" + (d.x < 180 ? d.x - 90 : d.x + 90) + ")"; })
      .text(function(d) { return d.id.substring(d.id.lastIndexOf(".") + 1); });

    function project(x, y) {
        var angle = (x - 90) / 180 * Math.PI, radius = y;
        return [radius * Math.cos(angle), radius * Math.sin(angle)];
    }
    
    return {};
});
rootstring triogamelanchirimía and drumeffectsviolin octetacoustic guitarfortepianofiddlestring quartetwind instrumentselectronic instrumentstaonga pūorođàn nhịanalog synthesizerstringspipe and tabormirlitonCembaletpercussionruantraditional basque ensemblebullroarerpiano triochimescelloviolaviolinsaronrebabchirimíadrumsebowtalkboxtreble violinsoprano violinalto violintenor violinnylon guitargut guitarclassical guitarSpanish acoustic guitaracoustic fretless guitarpianohardingfeleviolin familysukaoktawkakamanchehkemenchecelloviolaviolinbrasswoodwindorganomnichordDenis d'orDubreq StylophonevocodersynthesizerReactableondes Martenotbass pedalsthereminsamplerdrum machinelaser harpdisk drivevideo game consolepahūtumutumutōkerepoipākurungururehupūmotomotopūtōrinopōrutupūkaeapūtātarapahū pounamupūrerehuapoi āwhiowhiokōauaukōauau ponga ihuhue puruwaihue puruhaurōriate kūpūpakapakaporotiticò ketrautoniumMoogHammond organMinimoogsynthesizerondiolineclaviolinehurdy gurdytaishogotostruck string instrumentsbowed string instrumentsplucked string instrumentsaeolian harptaborthree-hole pipekazoożummaraPianetdrumstuned percussionbin-sasarabody percussionpháchshakerstypewriterwashboardvibraslapboobamidiophonedaruanzhongruanyueqintxalapartatrikititxistudulzainatabortambourinepūrerehuacellopianoviolintubular bellschime barmark treewind chimeelectric celloelectric violavioloncello piccolovielleviolottatenor violinsoprano violinalto violintreble violinelectric violinsarodrebecrubabbarrel drumdrumsetsabarbongoscongaskettle drumcylindrical drumframe drumatabaqueaketecajónchandedholakgong bass drumkudümmadalsurdotanbou katimbalesgarifuna drumfriction drumgoblet drumhourglass drumoctobansteel-string guitartangent pianoprepared pianotack pianoelectric pianobowed pianogrand pianopedal pianotoy pianoupright pianoluthéalminipianopiano spinetorphicacelloviolaviolinvioloncello piccolodouble basskemençe of the Black Seaclassical kemençeelectric celloelectric violavioloncello piccolovielleviolottatenor violinsoprano violinalto violintreble violinelectric violinkeyed brass instrumentsnatural brass instrumentsslide brass instrumentsvalved brass instrumentsreedsflutegemshornreed organtheatre organbarrel organcalliopeelectronic organpipe organOtamatonesynclavierwind synthesizerbass synthesizercontinuumguitar synthesizermarimba luminakeytarvoice synthesizerwavedrumondiolinewavedrumfloppy disk drivehard disk drivepātēpahū pounamupūpakapakaOtamatonesynclavierwind synthesizerbass synthesizercontinuumguitar synthesizermarimba luminakeytarvoice synthesizerwavedrumbulbul tarangdulce melosclavichordChapman stickWarr guitarhammered dulcimerpianopiano spinetBlaster Beamjouhikkorebecvioloncello piccolosaw uhaegeumnyckelharpalironeviolin familytreble violintromba marinaģīgaCretan lyrabowed psalterycrwthgudoksarangitalharpaviola organistaviola da gambayaylı tanburviolino piccoloshichepshinsaw sam saiigilravanahathaarpeggioneviololyradjozadouble basstenor violinsoprano violinalto violinhuqinvioloneviola d'amorebass violinBlaster Beambarytonwashtub bassbuzuqngɔninyatitibolontololochecitolelautenwerckharpsichordütőgardonbandurriacraviolabouzoukiguitar familylyremusical bowtonkoritumbizitherspinetspinettonegitternvihuelalaúdsursingarbarbatbisernicabračbugarijačeloberdatanpurasamicacümbüşbanjolinguitalelebanjo-ukulelebouzar / gouzoukikrarguitorganmandoguitardonso ngɔnirubabGravikordbarytonfujaratxistubarrel drumdrumsetsabarbongoscongaskettle drumcylindrical drumframe drumatabaqueaketecajónchandedholakgong bass drumkudümmadalsurdotanbou katimbalesgarifuna drumfriction drumgoblet drumhourglass drumoctobandulcitonetubulumcowbellfinger snapsfoot percussionhandclapscaxiximaracashue puruwaifrottoiroctobanlamellophonestruck idiophonefriction idiophonewaterphoneTibetan water drumcalabashsênh tiềndafkanjirariqtartefelectric cellotangent pianoprepared pianotack pianoelectric pianobowed pianogrand pianopedal pianotoy pianoupright pianoluthéalminipianopiano spinetorphicavielleviolottatenor violinsoprano violinalto violintreble violinelectric violinsarodyonggodholbukmridangamtaikothaviltaphonklong khaekklong song naklong thatoctobanelectronic drum sethi-hatsnare drumtom-tombass drumcymbalbrushescowbellquintotimpanitabladuggidoholbass drumdununtom-tomsnare drumtinyazabumbaalfaiarepiniquejunjungdavuldoyraocean drumrammanaqilautbangutamborimrototombodhrántambourineashikobaandufundehrepeatersegundaprimerocuícażafżafadarbukazarbklong yaodjembethontrống bôngBatá drumjanggukotsuzumitalking drumōtsuzumiarchtop guitarviola caipiraWurlitzer electric pianokeyboardchamberlinmellotronRhodes pianoPianetelectric grand pianokeytarelectric celloelectric violavioloncello piccolovielleviolottatenor violinsoprano violinalto violintreble violinelectric violinelectric upright bassophicleidecornettserpentnabaldidgeridooalphornbaroque trumpetconchjugnatural hornshofarbuisinebirch lurbronze lurpūkaeapūtātaravuvuzelaolifantpūpakapakanatural trumpettrombonebazookaFrench horncornetflugelhorntrumpethornmellophoneVienna horntubaflumpetdouble reedfree reedsingle reedsadukquadruple reedbirbynėwhistleđing buốttransverse fluteboatswain's pipealgozeyk'lông pútnose flutenose whistlesaó ôi flutevessel flutefipple fluteend-blown fluterehupūmotomotopūtōrinopōrutukōauauthree-hole pipeshruti boxharmoniumregalelectronic organHammond organtelharmoniumfarfisachamber organelectronic organEWILyriconEWILyriconClavinetsanturđàn tam thập lụcsantoorcimbalomyangqinyoochintangent pianoprepared pianotack pianoelectric pianobowed pianogrand pianopedal pianotoy pianoupright pianoluthéalminipianopiano spinetorphicayehucelloviolaviolinvioloncello piccolodouble bassgadulkaesrajdilrubakamanchehrebabelectric upright bassdiyingehubanhuerhugehujing'erhujinghucizhonghuyehugaohuzhonghuzhuihuchuurqindouble basscellodonso ngɔnikamalen ngɔnijeli ngɔnivirginalspinetspinettoneoval spinetluteIrish bouzoukiguitarrón mexicanobass guitarcavaquinhoguitarrón chilenobajo sextocuatroguitartipletresukulelebaroque guitarharpkinnorkitharaberimbauukekete kūpsalterybanduraautoharpAppalachian dulcimerlangeleikđàn bầukanunguzhengguqinvalihachakhediddley bowajaengBaltic psalteriesmarxophoneswarmandaldolceolalap harpspinettonevihuelaguitarbaroque guitarviol familyoudbisernicaSerbo-Croatian tamburica orchestrakamalen ngɔnisarodyonggodholbukmridangamtaikothaviltaphonklong khaekklong song naklong thatoctobanelectronic drum sethi-hatsnare drumtom-tombass drumcymbalbrushescowbellquintotimpanitabladuggidoholbass drumdununtom-tomsnare drumtinyazabumbaalfaiarepiniquejunjungdavuldoyraocean drumrammanaqilautbangutamborimrototombodhrántambourineashikobaandufundehrepeatersegundaprimerocuícażafżafadarbukazarbklong yaodjembethontrống bôngBatá drumjanggukotsuzumitalking drumōtsuzumicelestatap dancingmusical boxjew's harpmarímbulambiraaman khuurGuitarettemür khuurkhulsan khuurrattletumutumutrianglesteelpanbellsgongcastanetshandpanwood blockbell treeratchetmendozagüiroafuche / cabasaxylophonelithophoneslit drumudumetallophonereco-recoanvilWurlitzer electric pianoquijadatxalapartadulcitoneclapperbonessinging bowlmusical sawyuglass harmonicacristal Baschetglass harpwaterphonedaireWurlitzer electric pianokeyboardchamberlinmellotronRhodes pianoPianetelectric grand pianokeytarpakhavajshime-daikonagadou-daikotaborcaixanaobofinger cymbalschaphi-hatnão bạt / chập chõacrotalesjunjungtaborcaixakösdafkanjirariqtartefkeyboard bassmellotrontrumpet familynagakghatampost hornbugleFrench hornbirch lurpūpakapakabaroque trumpetsackbutvalve trombonebass trombonetenor trombonetromboonpocket trumpetbaritone horntenor horn / alto horneuphoniumWagner tubasousaphoneheliconcrumhorndulciandudukhichirikibagpipebombardecornamuseguankortholtpirirauschpfeiferenaissance racketttaepyeongsozurnatromboonbaroque rackettpiccolo oboebass oboenadaswaramsarrusophonechirimíaduck callEnglish hornvibrandoneontenorashawmtarotatiblehmông fluteding tac taki pahkèn lámelodicamouth organaccordionbawuconcertinaaccordinaclaviolareed organzhaleikatubaxtaragotXaphoonlauneddasarghulclarinetchalumeausaxophonemijwizpi naipisamba whistlepiccolosáo trúcdaegeumtreble flutesoprano flutedizishinobuenohkanryutekiflûte d'amourfifeIndian bamboo flutesalto flutebass fluteconcert flutelimbecontrabass flutekagurabueIrish flutekōauau ponga ihuocarinaxunngurutin whistlewillow fluterecorderslide whistlespilåpipakhluithree-hole pipeflageoletflabioltxistukavalneyhotchikupan flutepí thiuquenashakuhachixiaosulingfujaratxistuelectronic organharmoniumHammond organtelharmoniumfarfisaHammond organtelharmoniumfarfisakhimyoochinWurlitzer electric pianokeyboardchamberlinmellotronRhodes pianoPianetelectric grand pianokeytarelectric celloelectric violavioloncello piccolovielleviolottatenor violinsoprano violinalto violintreble violinelectric violinelectric upright basssarodrebecrubabgaohuzhonghumorin khuurelectric upright basselectric cellokamalen ngɔnibanjogumbrioval spinetspinettonetopshuuroudcitternrebabtzouracharangosazdutargumbribandoraxalamyueqinarchlutepipatheorbodramyinđàn nguyệtPortuguese guitarsanxianšargijachanzylaoutolavtadoshpuluurSaraswati veenarudra veenatarvichitra veenachitra veenamandolutegitterntanburjeli ngɔnimandora / gallichonbandurađàn tứacoustic bass guitarđàn tứ dâyfretless basselectric bass guitar12 string guitarHawaiian guitarVietnamese guitarbaritone guitarclassical guitarslide guitarsteel guitartenor guitarharp guitarMexican vihuelaclassical guitarkoraconcert harpfolk harpwire-strung harpParaguayan harpharp guitarharpsichordduxianqingayageumkotođàn tranhyatgageomungoguslikanklėskannelkantelekoklebaroque guitarviol family12 string guitarHawaiian guitarVietnamese guitarbaritone guitarclassical guitarslide guitarsteel guitartenor guitarharp guitarclassical guitartreble violtenor violalto violpardessus de violevioloneviola da gambabass violmandolutebisernicaberdabugarijabraččelopakhavajshime-daikonagadou-daikotaborcaixanaobofinger cymbalschaphi-hatnão bạt / chập chõacrotalesjunjungtaborcaixakösdafkanjirariqtartefmukkurimorsingaman khuurrōriatemür khuurkhulsan khuurpkhachichchachamaracasrainstickshekeresistrumankle rattlerskartalganzáafoxépahū pounamuhandbellsgankoguicarillonagogôcowbellcymbalkhong wongkkwaenggwarixiaoluodaluojingatariganechau gongspoonstōkerekrakebstemple blocksxylorimbaranat kaeoamadindaranat thumt'rưngti bwaranat ekmarimbabamboo angklungbalafongramorimbawooden fishpahūpātēxylophoneglockenspielsaronvibraphonecelestarhythm stickscastanetswhip / slapstickglass harmonicakeyboard bassmellotronchingzilldairepiccolo trumpetbass trumpettrumpetcornettrumpet familysousaphonebassoonbellow-blown bagpipespractice chanterSwedish bagpipesżaqqmusette de courbaroque rackettshawmsuonagralladulzainachirimíaoboetenorabombardetarotatibletiblesáo meòtràm plèpang gu ly hu hmôngtrắng luharmonicađing nămshengkhèn Mèokhenehulusibutton accordionpiano accordionEnglish concertinaGerman concertinaAnglo concertinavibrandoneonshruti boxharmoniumregalalto clarinetbass clarinetbasset hornE-flat clarinetcontrabass clarinetbasset clarinetsoprano clarinettubaxalto saxophonebaritone saxophonebass saxophonecontrabass saxophonesopranino saxophonesoprano saxophonetenor saxophonepi naisopilkavenubansurilow whistlesopranino recordersubcontrabass recordertenor recordertreble recorder / alto recorderdescant recorder / soprano recordergreat bass recorder / c-bass recordergarklein recordercontrabass recorderbass recorderhärjedalspipafujaratxistuEnglish flageoletflabiolTonettenaisyrinxrondadorsikuwottungsoHammond organtelharmoniumfarfisaelectronic organkeyboard bassmellotronsarodfive-string banjofour-string banjomandoluteorpharionlaúdsarodrebecrubabbaglamakomuzsetarorpharionbanjobiwađàn tỳ bàsanshinzhuihuvihuelaguitaryaylı tanburtamburabanjogumbristeel-string guitartable steel guitarlap steel guitarpedal steel guitarsteel-string guitarGravikordelectric harpIrish harp / clàrsachGerman harpvirginalspinetspinettoneoval spinet17-string kotoclassical guitartreble violtenor violalto violpardessus de violevioloneviola da gambabass violsteel-string guitartable steel guitarlap steel guitarpedal steel guitarsteel-string guitardouble basslyra violchingzilldairetemür khuurkhulsan khuurnaobofinger cymbalschaphi-hatnão bạt / chập chõacrotaleskhong wong lekkhong wong yaimetal angklungpātēxylorimbaranat kaeoamadindaranat thumt'rưngti bwaranat ekmarimbabamboo angklungbalafoncelestaclavesboneshyoshigispoonstōkerekrakebspocket trumpetpiccolo trumpetbass trumpettrumpetcontrabassoontromboonNorthumbrian pipesScottish smallpipesuilleann pipesgralladulzainachirimíaoboetenorabombardetarotatiblekèn bầuoboe d'amoreshehnaioboe da cacciagrallaheckelphonedulzainaEnglish horntibletrắng jâubass harmonicachromatic harmonicashochromatic button accordiondiatonic accordion / melodeonelektroniumbandoneónelectronic organharmoniumfourth flutetin whistleTonetteHammond organtelharmoniumfarfisatenor banjosarodTurkish baglamasitarfive-string banjofour-string banjochikuzen biwaheike biwasatsuma biwashamisenbaroque guitarviol family12 string guitarHawaiian guitarVietnamese guitarbaritone guitarclassical guitarslide guitarsteel guitartenor guitarharp guitarbalalaikamandoladomradombrafive-string banjofour-string banjoarchtop guitarviola caipiraresonator guitarelectric lap steel guitararchtop guitarviola caipiraoval spinetspinettonesteel-string guitardouble basslyra violarchtop guitarviola caipiraresonator guitarelectric lap steel guitararchtop guitarviola caipiraelectric upright basschingzillmetal angklungpocket trumpetkèn bầuoboe d'amoreshehnaioboe da cacciagrallaheckelphonedulzainaEnglish horntiblebayanSchwyzerörgelitrikitiHammond organtelharmoniumfarfisaelectronic organlow whistleGreek baglamaelectric sitartenor banjokokyuclassical guitartreble violtenor violalto violpardessus de violevioloneviola da gambabass violsteel-string guitartable steel guitarlap steel guitarpedal steel guitartenor banjodobroelectric guitararchtop guitarviola caipiraelectric upright bassdobroelectric guitarHammond organtelharmoniumfarfisasteel-string guitardouble basslyra violarchtop guitarviola caipiraresonator guitarelectric lap steel guitarelectric fretless guitarelectric fretless guitararchtop guitarviola caipiraelectric upright bassdobroelectric guitarelectric fretless guitar

Copy on github.io.

This time we have probably too much data to display :)