Найти - Пользователи
Полная версия: Чтение миди-файла
Начало » Python для новичков » Чтение миди-файла
1
leonid_10
Мысль такая: трансформировать миди-файл в кривую безье. На русском ничего не нашёл. Модули, работающие с миди есть, но, как ими пользоваться я не разобрался, потому что не знаю английский. Может, кто-то знает, как перевести миди в текст? Имея текст я уж соображу, как составить из него кривую.
Win95
я не совсем хорошо представляю что такое кривая безье, но как мне показалось тебе нужно получить массив из миди файла. я сталкивался с подобной задачей, однако для wav файла. думаю тебе может помочь следующий код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wave
import numpy as np
np.set_printoptions(threshold=np.nan)
types = {
    1: np.int8,
    2: np.int16,
    4: np.int32
}
wav = wave.open("record.wav", mode="r")
(nchannels, sampwidth, framerate, nframes, comptype, compname) = wav.getparams()
content = wav.readframes(nframes)
samples = np.fromstring(content, dtype=types[sampwidth])
p=samples.reshape(-1, 2)
gool=str(p)
z=gool.translate(None, '[]')
f = open('record.txt', 'w')
f.write(z)
wav.close()
f.close()
print u"* файл перекодирован"
в конце мы получаем массив в текстовом файле. Однако если тебе нужно строить график (есть возможность не переводить звук в массив) тебе стоит почитать про matplotlib
gisolog
попробуйте Python Midi, может чего получится)
Они уверяют, что:
It's just as easy to load your MIDI file from disk.
>>> z = midi.read_midifile("d:\\Python\\Pypi\\mics\\midi\\mary.mid")
>>> z.textdump()
>>> #что вроде как правда, но textdump у меня выдал AttributeError...
>>> #однако, можно просто написать
>>> print z
midi.Pattern(format=1, resolution=220, tracks=\
[[midi.TimeSignatureEvent(tick=0, data=[4, 2, 24, 8]),
  midi.KeySignatureEvent(tick=0, data=[0, 0]),
  midi.EndOfTrackEvent(tick=1, data=[])],
 [midi.ControlChangeEvent(tick=0, channel=0, data=[91, 58]),
  midi.ControlChangeEvent(tick=0, channel=0, data=[10, 69]),
  midi.ControlChangeEvent(tick=0, channel=0, data=[0, 0]),
  midi.ControlChangeEvent(tick=0, channel=0, data=[32, 0]),
  midi.ProgramChangeEvent(tick=0, channel=0, data=[24]),

midi.NoteOnEvent(tick=974, channel=0, data=[60, 0]),
  midi.NoteOnEvent(tick=0, channel=0, data=[52, 0]),
  midi.EndOfTrackEvent(tick=1, data=[])]])
и… дальше сами)
удач!
ps
есть еще Pyo, но эксперимент с midi в нем у меня не вышел(
leonid_10
Спасибо! :)
vkopey
MIDI слишком сложен для разбора.
Удобнее работать с форматом MusicXML MusicXML.
Еще удобный формат для разбора - LilyPond.
Конвертировать MIDI в MusicXML или LilyPond можно с помощю бесплатной программы MuseScore.
leonid_10

vkopey
MIDI слишком сложен для разбора.
Удобнее работать с форматом MusicXML MusicXML.
Еще удобный формат для разбора - LilyPond.
Конвертировать MIDI в MusicXML или LilyPond можно с помощю бесплатной программы MuseScore.

Спасибо за подсказку! Просто LMMS должна открывать MIDI и сохранять в MXML, но в альтлинуксе оно не открывает. Пока найдёшь и скачаешь этот конвертер для альтлинукса со всеми зависимостями на минимальной скорости (да ещё б оно заработало в этой системе), проще миди разобрать питоном.

Duck-Pagan
Здравствуйте, leonid_10.
Можете подробней рассказать, как собираетесь трансформировать миди-файл в кривую Безье?
Количество дорожек - степень кривой или она у вас линейная?
Расстояние между опорными точками зависит от размера (длины?) ноты?
Какие миди-элементы определяете за опорные точки?

————-
Если не серкет: используете для анализа звуковых файлов или просто для создания визуализации?
- тема просто интересна
leonid_10

Duck-Pagan
Здравствуйте, leonid_10.
Можете подробней рассказать, как собираетесь трансформировать миди-файл в кривую Безье?
Количество дорожек - степень кривой или она у вас линейная?
Расстояние между опорными точками зависит от размера (длины?) ноты?
Какие миди-элементы определяете за опорные точки?

————-
Если не серкет: используете для анализа звуковых файлов или просто для создания визуализации?
- тема просто интересна

Здравствуйте. Ну, для начала, я хотел бы посмотреть, что из себя представляет массив. Я пока не имею малейшего представления о содержании, поэтому и задал вопрос, а получив ответ думаю, как установить python-midi, ибо требуется swig, а мне пока некогда. Может, правда, проще будет применить конвертер.
А, вообще, изначально вопрос я сформулировал неточно: кривую мне нужно создать используя некоторые элементы полученного массива, а некоторые высосать из пальца. Мне это нужно для работы в трёхмерном редакторе Blender.
Duck-Pagan
Понятно. Python хороший инструмент для подобного рода заданий.
Удачи!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB