{"id":1639,"date":"2017-01-25T09:24:52","date_gmt":"2017-01-25T14:24:52","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/estg1003\/?p=1639"},"modified":"2026-04-16T09:30:15","modified_gmt":"2026-04-16T14:30:15","slug":"midi-formato-musica-teclas","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/stp-aplica\/midi-formato-musica-teclas\/","title":{"rendered":"MIDI Formato m\u00fasica - teclas"},"content":{"rendered":"\n<p><em><strong>Referencias<\/strong><\/em>: <a href=\"https:\/\/es.wikipedia.org\/wiki\/MIDI\">Wikipedia<\/a><\/p>\n\n\n\n<p>MIDI (Musical Instrument Digital Interface) es un protocolo est\u00e1ndar, una interfaz digital y conectores que permiten que varios instrumentos musicales electr\u00f3nicos, ordenadores y otros dispositivos relacionados se conecten y comuniquen entre s\u00ed.<\/p>\n\n\n\n<p>De un archivo MIDI se puede usar las instrucciones para una solo instrumento, por ejemplo el que ejecuta la melod\u00eda, y revisar los delta tiempos entre cada nota para encontrar su pmf o cdf.<\/p>\n\n\n\n<p><strong><em>Archivo ejemplo<\/em><\/strong>: <a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2018\/02\/el_aguacate.mid\">el_aguacate.mid<\/a><\/p>\n\n\n\n<p><strong>Formato de MIDI<\/strong><\/p>\n\n\n\n<p>Las instrucciones MIDI se pueden leer usando la librer\u00eda mido de Python.<\/p>\n\n\n\n<p>Para instalar la librer\u00eda puede usar pip install midi en una ventana\u201cs\u00edmbolo de sistema\u201d. Revisar instrucciones en el enlace <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ccpg1001\/descargas\/pip-instalar-librerias\/\">pip install<\/a>.<\/p>\n\n\n\n<p>Para abrir el archivo y crear un documento de texto que se pueda interpretar, se dispone del siguiente script de Python:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport mido as md\n\n# INGRESO\narchivomid = 'el_aguacate.mid'\narchivotxt = 'el_aguacatemidi.txt'\n\n# PROCEDIMIENTO\npartitura = md.MidiFile(archivomid)\n\n# SALIDA\npistas = partitura.tracks\nn = len(pistas)\nfor i in range(0,n,1):\n    print(i, pistas&#x5B;i])\n\n# ARCHIVO DE TEXTO\narchivo = open(archivotxt,'w')\nfor dato in partitura:\n    archivo.write(str(dato) + '\\n')\narchivo.close()\n<\/pre><\/div>\n\n\n<p>que muestra el n\u00famero de pistas\/instrumentos en el archivo.mid y crea un archivo de texto.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0 &lt;midi track 'untitled' 47 messages&gt;\n1 &lt;midi track 'BAJO' 1041 messages&gt;\n2 &lt;midi track 'PIANO' 3079 messages&gt;\n3 &lt;midi track 'GUITARRAS' 943 messages&gt;\n4 &lt;midi track 'JAZZ GTR' 383 messages&gt;\n5 &lt;midi track 'PLATILLO' 1002 messages&gt;\n6 &lt;midi track 'TAMBOR' 470 messages&gt;<\/code><\/pre>\n\n\n\n<p>Tambi\u00e9n se puede procesar los datos, para un instrumento, y utilizar las medidas de tiempo como par\u00e1metro para tabular el comportamiento y obtener la pmf y cdf.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/estg1003\/files\/2018\/02\/pmf_cdf_midi.png\"><img decoding=\"async\" src=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/estg1003\/files\/2018\/02\/pmf_cdf_midi.png\" alt=\"\" class=\"wp-image-1641\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport mido as md\n\n# INGRESO\narchivomid = 'el_aguacate.mid'\n# instrumento\ncanal = 'channel=3' \n# para pmf\ntramos = 20     \n\n# PROCEDIMIENTO\n# Abre archivo midi\npartitura = md.MidiFile(archivomid)\n\n# un instrumento, tabla de notas\naccion = 'note_on'\ntabla = &#x5B;]\nfor dato in partitura:\n    linea = str(dato)\n    parte = linea.split(' ')\n    if (parte&#x5B;0]==accion and parte&#x5B;1]==canal):\n        valor = parte&#x5B;2].split('=')\n        nota = int(valor&#x5B;1])\n        valor = parte&#x5B;3].split('=')\n        velocidad = int(valor&#x5B;1])\n        valor = parte&#x5B;4].split('=')\n        tiempo = float(valor&#x5B;1])\n        tabla.append(&#x5B;nota, velocidad, tiempo])\ntabla = np.array(tabla)\nm = len(tabla)\n\n# Cuenta de tiempos\nxmin = 0\nxmax = np.round((np.max(tabla&#x5B;:,2])*1.1),2)\nmuestreo = tramos +1\nx = np.linspace(xmin,xmax,muestreo)\ndeltax = x&#x5B;1]-x&#x5B;0]\ncuenta = np.zeros(muestreo,dtype=int)\nfor f in range(0,m,1):\n    valor = tabla&#x5B;f,2]\n    encuentra = 0\n    j=0\n    while not(j&gt;=muestreo or encuentra==1):\n        if x&#x5B;j]&gt;valor:\n            cuenta&#x5B;j-1] = cuenta&#x5B;j-1]+1\n            encuentra=1\n        j=j+1\nfrelativa = cuenta\/np.sum(cuenta)\nacumulada = np.cumsum(frelativa)\n            \n# SALIDA\n# Presenta pistas\npistas = partitura.tracks\nn = len(pistas)\nprint('pistas\/instrumentos: ')\nfor i in range(0,n,1):\n    print(i, pistas&#x5B;i])\n# Tabulados\nprint('Tabulados: ')\nprint('     x: ',x)\nprint('cuenta: ', cuenta)\n\n# GRAFICAS\nplt.subplot(211)\nplt.bar(x,frelativa, width=deltax*0.8, align='edge')\nplt.title(archivomid + ' , ' + canal)\nplt.ylabel('pmf')\n\nplt.subplot(212)\nplt.plot(x,acumulada,'m')\nplt.ylabel('cdf')\nplt.show()\n<\/pre><\/div>\n\n\n<p><strong><em>Tarea<\/em><\/strong>:<\/p>\n\n\n\n<p>a) Descargar el archivo.mid de la canci\u00f3n de su preferencia, seleccionar una pista y procesar las funciones de probabilidad de masas y acumulada.<\/p>\n\n\n\n<p>b) para las notas del instrumento, mostrar tambi\u00e9n la pmf, cdf<\/p>\n\n\n\n<p><em><strong>Ejemplo<\/strong> <\/em>de instrucciones MIDI generadas en el archivo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>control_change channel=9 control=7 value=120 time=0\nnote_on channel=2 note=62 velocity=64 time=1.5\nnote_on channel=2 note=58 velocity=64 time=0\nnote_on channel=2 note=58 velocity=0 time=0.155\nnote_on channel=2 note=62 velocity=0 time=0.08\nnote_on channel=0 note=43 velocity=64 time=0.065\nnote_on channel=1 note=74 velocity=64 time=0\nnote_on channel=1 note=70 velocity=64 time=0\nnote_on channel=1 note=62 velocity=64 time=0\nnote_on channel=2 note=70 velocity=64 time=0\nnote_on channel=2 note=67 velocity=64 time=0\nnote_on channel=9 note=46 velocity=64 time=0\nnote_on channel=9 note=46 velocity=0 time=0.07<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left\">Midi un instrumento, teclas pmf y cdf<\/h2>\n\n\n\n<p>Se realiza el conteo de cada tecla de un instrumento para una canci\u00f3n desde un archivo.midi<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/estg1003\/files\/2018\/02\/pmf_cdf_midi_notas.png\"><img decoding=\"async\" src=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/estg1003\/files\/2018\/02\/pmf_cdf_midi_notas.png\" alt=\"\" class=\"wp-image-1647\" \/><\/a><\/figure>\n\n\n\n<p>Algoritmo en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Pmf de notas de un instrumento\n# desde archivo midi\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport mido as md\n\n# INGRESO\narchivomid = 'el_aguacate.mid'\n# instrumento\ncanal = 'channel=3' \n# para pmf\ntramos = 100     \n\n# PROCEDIMIENTO\n# Abre archivo midi\npartitura = md.MidiFile(archivomid)\n\n# un instrumento, tabla de notas\ntranscurrido = 0\ndeltat = 0\naccion = 'note_on'\ntabla = &#x5B;]\nfor dato in partitura:\n    linea = str(dato)\n    parte = linea.split(' ')\n    if (parte&#x5B;0]==accion):\n        valor = parte&#x5B;4].split('=')\n        tiempo = float(valor&#x5B;1])\n        transcurrido = transcurrido + tiempo\n        deltat = deltat+tiempo\n        if (parte&#x5B;1]==canal):\n            valor = parte&#x5B;2].split('=')\n            nota = int(valor&#x5B;1])\n            valor = parte&#x5B;3].split('=')\n            velocidad = int(valor&#x5B;1])\n            tabla.append(&#x5B;nota, velocidad, tiempo, deltat])\n            deltat=0\ntabla = np.array(tabla)\nm = len(tabla)\n\nnotas = tabla&#x5B;:,0]\nx, cuenta = np.unique(notas, return_counts=True)\nprint(x)\nprint(cuenta)\n\nfrelativa = cuenta\/np.sum(cuenta)\nacumulada = np.cumsum(frelativa)\n            \ndeltax = 1\n\n# GRAFICAS\nplt.subplot(211)\nplt.bar(x,frelativa, width=deltax*0.8, align='edge')\nplt.title('notas, '+ archivomid + ' , ' + canal)\nplt.ylabel('pmf')\n\nplt.subplot(212)\nplt.plot(x,acumulada,'m')\nplt.ylabel('cdf')\nplt.show()\n<\/pre><\/div>\n\n\n<p>El nuevo sonido de la m\u00fasica<\/p>\n\n\n\n<p>formas de grabar la ejecuci\u00f3n de musica de un instrumento.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"The New Sound of Music (BBC Documentary 1979)\" width=\"500\" height=\"375\" src=\"https:\/\/www.youtube.com\/embed\/fGX2MWmLurw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Referencias: Wikipedia MIDI (Musical Instrument Digital Interface) es un protocolo est\u00e1ndar, una interfaz digital y conectores que permiten que varios instrumentos musicales electr\u00f3nicos, ordenadores y otros dispositivos relacionados se conecten y comuniquen entre s\u00ed. De un archivo MIDI se puede usar las instrucciones para una solo instrumento, por ejemplo el que ejecuta la melod\u00eda, y [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-stp-ejercicios","format":"standard","meta":{"footnotes":""},"categories":[202],"tags":[],"class_list":["post-1639","post","type-post","status-publish","format-standard","hentry","category-stp-aplica"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=1639"}],"version-history":[{"count":1,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1639\/revisions"}],"predecessor-version":[{"id":22299,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1639\/revisions\/22299"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=1639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=1639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=1639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}