From 84403d2bbac189b015cd31fe3ee93d3fdbf3bb04 Mon Sep 17 00:00:00 2001 From: Adrien MALINGREY Date: Mon, 24 Feb 2025 13:14:50 +0100 Subject: [PATCH] =?UTF-8?q?T=C3=A9l=C3=A9verser=20les=20fichiers=20vers=20?= =?UTF-8?q?"/"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- midi2beep.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 midi2beep.py diff --git a/midi2beep.py b/midi2beep.py new file mode 100644 index 0000000..60de8e8 --- /dev/null +++ b/midi2beep.py @@ -0,0 +1,94 @@ +#!/usr/bin/python3 + +### +# +# midi2beep.py +# Author: Adrien MALINGREY +# +# Play MIDI files with PC speaker using the beep command. +# +# Usage: python3 midi2beep.py +# +# Dependencies: +# - Python 3 +# - mido library (https://mido.readthedocs.io/) +# - beep command +# +### + +import sys +import subprocess +import math +import mido + +if len(sys.argv) < 2: + print("Usage: python3 midi2beep.py [channel]") + sys.exit(1) + +arpege = 0.015#ms + +FREQUENCIES = [ +# C, C#, D, D#, E, F, F#, G, G#, A, A#, B + 16.35, 17.32, 18.35, 19.45, 20.6, 21.83, 23.12, 24.5, 25.96, 27.5, 29.14, 30.87, + 32.7, 34.65, 36.71, 38.89, 41.2, 43.65, 46.25, 49, 51.91, 55, 58.27, 61.74, + 65.41, 69.3, 73.42, 77.78, 82.41, 87.31, 92.5, 98, 103.83, 110, 116.54, 123.47, + 130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185, 196, 207.65, 220, 233.08, 246.94, + 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392, 415.3, 440, 466.16, 493.88, + 523.25, 554.37, 587.33, 622.25, 659.26, 698.46, 739.99, 783.99, 830.61, 880, 932.33, 987.77, + 1046.5, 1108.73, 1174.66, 1244.51, 1318.51, 1396.91, 1479.98, 1567.98, 1661.22, 1760, 1864.66, 1975.53, + 2093, 2217.46, 2349.32, 2489.02, 2637.02, 2793.83, 2959.96, 3135.96, 3322.44, 3520, 3729.31, 3951.07, + 4186.01, 4434.92, 4698.64, 4978.03, 5274.04, 5587.65, 5919.91, 6271.93, 6644.88, 7040, 7458.62, 7902.13, +] + +midi_file_path = sys.argv[1] +try: + mid=mido.MidiFile(midi_file_path) +except TypeError: + mido.read_syx_file(midi_file_path) + +if len(sys.argv) > 2: + channel = int(sys.argv[2]) +else: + channel = -1 + +time = 0 +note_on = 0 +start = 0 +tempo = 0 +try: + for msg in mid: + time += msg.time + + if msg.type == "track_name": + print(msg.name) + + if msg.type == "set_tempo": + tempo = msg.tempo + + if (msg.type == "note_on" or msg.type == "note_off") and (msg.channel == channel or (channel == -1 and msg.channel != 9)): + if msg.time: + lines = math.ceil(4e6 * (time - start) / tempo) + if note_on: + for _ in range(lines): + print(note_on * " " + "█") + subprocess.run(["beep", f"-f{FREQUENCIES[note_on]:.0f}", f"-l{1000*(time - start):.0f}"]) + elif start: + for _ in range(lines): + print() + subprocess.run(["sleep", f"{0.8*(time - start)}"]) + + if msg.type == "note_on" and msg.velocity: + if msg.time or msg.note > note_on: + note_on = msg.note + else: + note_on = 0 + + start = time + + lines = math.ceil(4e6 * (time - start) / tempo) + for _ in range(lines): + print(note_on * " " + "█") + subprocess.run(["beep", f"-f{FREQUENCIES[note_on]:.0f}", f"-l{1000*(time - start):.0f}"]) + +except KeyboardInterrupt: + subprocess.run(["beep", "-f1", "-l1"])