Автор Гілка: MIDI: замінити інструмент?..  (Прочитано 3177 раз)

Відсутній Дмитро Редчук

  • Кореспондент
  • ***
  • дописів: 104
  • Карма: +0/-0
Маю купу midi файлів, у яких прописаний інструмент "Choir Aahs" чи щось таке.

timidity каже:
No instrument mapped to tone bank 0, program 52 - this instrument will not be heard
Rosegarden чудово міняє інструменти, але його не можна використовувати для «масової обробки».

Поставив python-midi та mingus, написав «програми» для зчитування midi, заміни інструментів у доріжках, запису midi у файл (з використанням почергово python-midi та mingus).

Працює, але псує ритміку, помиляється із тривалістю нот.

Почитав трохи про формат midi і написав отаке:

#!/usr/bin/env python
#

import sys
import re

patt = re.compile('(\xC0|\xC1|\xC2|\xC3|\xC4|\xC5|\xC6|\xC7).')

try:
    filein = sys.argv[1]
except IndexError:
    print "Specify input file as an argument."
    sys.exit(1)

try:
    fileout = sys.argv[2]
except IndexError:
    fileout = '%s-out2.mid' % filein.replace('.mid', '')

filein_data = open(filein, 'rb').read()

open(fileout, 'wb').write(patt.sub('\1\x00',filein_data))

Тобто, просто міняю те, що вважаю командою зміни інструменту, на команду зміни на інструмент 0 (Acoustic Grand Piano).

Власне, питання (до фахівців у цій галузі) у тому, чи це «безпечно» .)

І чи можна якимось чином знаходити команди зміни інструментів краще. Але цікавить саме не зчитування й інтерпретація midi (з наступною переінтерпретацією і записом у інший файл), а «тупа заміна» інструментів.
«Критика має бути конструктивною. Інакше вона деструктивна» ©
Щось не так? — Зроби так.

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3636
  • Карма: +3/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Re: MIDI: замінити інструмент?..
« Відповідей #1 : 2012-04-09 19:46:07 »
Як на мене, то безпечно, але краще було б просто знайти банк (patches) з потрібним інструментом (у мережі валяються банки розмірами під 1 ГБ, — десь же має бути відповіний запис?).
Try to reach you before winter comes
Always a place for you in my heart
You're not alone
All used up
I'd give anything to talk to you

Відсутній Дмитро Редчук

  • Кореспондент
  • ***
  • дописів: 104
  • Карма: +0/-0
Re: MIDI: замінити інструмент?..
« Відповідей #2 : 2012-04-09 20:47:19 »
але краще було б просто знайти банк (patches) з потрібним інструментом
Та справа в тім, що ті мідішки треба викласти у мережі — і бути впевненим, що всі почують мелодію. Звучання ролі не грає.
«Критика має бути конструктивною. Інакше вона деструктивна» ©
Щось не так? — Зроби так.

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3636
  • Карма: +3/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Re: MIDI: замінити інструмент?..
« Відповідей #3 : 2012-04-09 20:53:54 »
але краще було б просто знайти банк (patches) з потрібним інструментом
Та справа в тім, що ті мідішки треба викласти у мережі — і бути впевненим, що всі почують мелодію. Звучання ролі не грає.
В такому разі слід спочатку перевірити на найпоширенішій платформі: мідішки Radiohead (наприклад Planet Telex) не відтворюються timidity (належним чином), але чудово працюють у WMP (така доля  ;) ).
« Змінено: 2012-04-09 20:56:43 від yurchor »
Try to reach you before winter comes
Always a place for you in my heart
You're not alone
All used up
I'd give anything to talk to you

Відсутній Дмитро Редчук

  • Кореспондент
  • ***
  • дописів: 104
  • Карма: +0/-0
Re: MIDI: замінити інструмент?..
« Відповідей #4 : 2012-04-09 21:23:54 »
В такому разі слід спочатку перевірити на найпоширенішій платформі
Вже перевірив (той, хто прислав; а в мене немає найпоширенішої, в мене лише дивацька); але треба «більш-менш гарантувати».

Та ні, не треба .) просто заманулося ,)
«Критика має бути конструктивною. Інакше вона деструктивна» ©
Щось не так? — Зроби так.

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3636
  • Карма: +3/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Re: MIDI: замінити інструмент?..
« Відповідей #5 : 2012-04-09 21:40:58 »
В такому разі слід спочатку перевірити на найпоширенішій платформі
Вже перевірив (той, хто прислав; а в мене немає найпоширенішої, в мене лише дивацька); але треба «більш-менш гарантувати».

Та ні, не треба .) просто заманулося ,)
Ну, тоді все зрозуміло: кому треба знайде банки, а прихильники найпоширенішої платформи вже мають FL Studio тієї самої ліцензійної чистоти, що і платформа. ;)
Try to reach you before winter comes
Always a place for you in my heart
You're not alone
All used up
I'd give anything to talk to you

Відсутній Дмитро Редчук

  • Кореспондент
  • ***
  • дописів: 104
  • Карма: +0/-0
Re: MIDI: замінити інструмент?..
« Відповідей #6 : 2012-04-10 07:08:46 »
кому треба знайде банки
Ха-ха.

Я Вас запевняю, є купа людей, які навіть не знають, що їм треба знайти якісь банки.

І є купа жертв найпоширенішої платформи, які й гадки не мають про FL Studio. І не матимуть ніколи.

Тому мені й закортіло зробити так, щоб не було потреби про це думати.

Хоча, звичайно, «це ваші проблеми, від нас куля вилетіла» — це також варіант, я Вас розумію ,О)

ps. Дякую за «Як на мене, то безпечно» у першому відгуку :-) Ще шукатиму.
« Змінено: 2012-04-10 07:10:36 від dor »
«Критика має бути конструктивною. Інакше вона деструктивна» ©
Щось не так? — Зроби так.

Відсутній Дмитро Редчук

  • Кореспондент
  • ***
  • дописів: 104
  • Карма: +0/-0
Re: MIDI: замінити інструмент?..
« Відповідей #7 : 2012-04-12 11:41:57 »
Я був неправий — python-midi is цяця-ляля :-)

#!/usr/bin/env python
#
#
# Міняємо номери всіх інструментів на нуль
# (всі інструменти — на 'Acoustic Grand Piano' чи як воно там зветься).
#

import sys
import midi

try:
    infile = sys.argv[1]
except IndexError:
    print "Specify input file as an argument, please."
    sys.exit(1)

try:
    outfile = sys.argv[2]
except IndexError:
    outfile = '%s-out.mid' % infile.replace('.mid', '')

midi_data = midi.read_midifile(infile)

print '%s' % infile

for track_idx in range(len(midi_data)):
    for event in midi_data[track_idx]:
        if isinstance(event, midi.ProgramChangeEvent):
            event.data = map(lambda x: 0, event.data)
            print event
        if isinstance(event, midi.SetTempoEvent):
            print 'BPM is %s' % event.get_bpm()
            # event.set_bpm(event.get_bpm()*2)
            pass
        # print event

print

midi.write_midifile(outfile, midi_data)
«Критика має бути конструктивною. Інакше вона деструктивна» ©
Щось не так? — Зроби так.