Записать ноты по midi файлам

Содержание
  1. Лучшие бесплатные программы для написания нот
  2. Написание нотного письма
  3. Обзор бесплатных программ для написания нот
  4. Программа MuseScore отличный нотный редактор
  5. Программа Lilypond уникальный подход к нотной записи
  6. Программа Finale Notepad простой и удобный редактор нот
  7. Программы для преобразования песни в ноты
  8. Здесь представлены пять лучших программ для автоматической расшифровки музыки и преобразования песни в ноты
  9. Музыкальный пример
  10. Музыкальная нотация
  11. Нотная запись в европейской традиции
  12. Протокол midi
  13. Музыкальная запись в виде событий
  14. Преобразование событий во времени
  15. Класс преобразований во времени
  16. Композиция треков
  17. Экземпляры стандартных классов
  18. Ноты в midi
  19. Синонимы для нот
  20. Высота ноты
  21. Длительность ноты
  22. Громкость ноты
  23. Смена инструмента
  24. Паузы
  25. Перевод в midi
  26. Пример
  27. Эффективное представление музыкальной нотации
  28. Краткое содержание
  29. Упражнения

Лучшие бесплатные программы для написания нот

Написание нотного письма

Программа для написания нот, как и любое другое программное обеспечение, должна быть хорошо написана, функциональна и практична, а так же предоставлять пользователям удобный и понятный пользовательский интерфейс. Узкая специализация задачи и сложность составления музыкальных нот часто отражается на ценнике коммерческих продуктов. Однако, не стоит переживать, на просторах интернета существует достаточно бесплатных программ, способных реализовать ваши потребности.

Основной задачей данного класса программ является создание композиций из нот и их последующее предоставление в печатном варианте. Конечно, ручное составление нотной записи, при помощи пера и бумаги, может быть более увлекательным занятием и носить в себе тонкий аромат творчества, который никогда не сможет заменить программа.

Однако, перед вами могут возникать более обыденные задачи, которые намного легче решаются при наличии автоматизирующих инструментов. Например, дублирование повторяющихся частей композиций, вставка нот в нужные места, перетаскивание нот из одной части в другую, что при ручном составлении может решаться вплоть до составления композиции или отдельной страницы нотной записи с нуля.

Читайте также:  Ftc 33 настройка укулеле

Тем не менее, данный класс программ — это как раз один из тех вариантов, где не стоит гнаться за автоматизацией, принося в жертву свободу действий. Прежде всего, программы для составления нот не должны мешать вам записывать композицию. Основной целью такого приложения должно быть сопровождение и предоставление дополнительных инструментов для быстрых операций.

Поэтому если вы установили программу и обнаружили, что ваши возможности каким-либо образом ограничиваются или от вас требуют изменить привычный вам способ написания, то лучше найдите другую программу, даже если в ней будет меньше инструментов.

Помните, любое написание композиции — это прежде всего творческий процесс. Просто представьте, вы составляете композицию. Перед вами лежит ручка и нотная бумага. Как вы думаете насколько уместно будет удаление «лишних» нот или многократное дублирование из-за того, что программа не может перенести скобку вольты на следующую строку или страницу?

Существует много бесплатных программ для составления нотной записи. Некоторые могут показаться лучше, некоторые хуже. Дело вкуса. Тем не менее, при выборе нужно учитывать, что каждая из этих программ имеет свой индивидуальный интерфейс, на разбор особенностей и функций которого вам может потребоваться, как минимум, от получаса.

Примечание: В основном, время на разбор больше обусловлено не столько сложностью программ, сколько различными подходами к организации меню, расположению кнопок и других элементов управления.

В данном обзоре представлены известные и мощные кроссплатформенные программы для написания нот.

Обзор бесплатных программ для написания нот

Программа MuseScore отличный нотный редактор

MuseScore является отличным нотным редактором, которая совместима с ОС Windows, Mac OSX, Linux и FreeBSD. Программа позволяет не только создавать простые нотные композиции, но и полноценные акколады для фортепьяно, а так же нотные записи для оркестровых партитур.

WYSIWYG интерфейс MuseScore, в большинстве случаев, позволяет достаточно быстро получить на выходе то, что вам нужно. Хотя, как и с большинством подобных музыкальных программ, вам придется потратить время на разбирание в устройстве интерфейса.

Но, не волнуйтесь, ответы на большинство ваших вопросов, вы найдете даже простым «методом тыка». В крайнем случае, вы всегда сможете найти свой ответ не только в справке программы, но и на сайте разработчика (можно переключить на русский язык в одном из блоков справа). Где-то после часа использования программы, вы уже освоите написание и редактирование нот, а так же вставку дополнительных символов (лига, фермата и т.д.).

MuseScore содержит полноценный набор инструментов. Программа может воспроизводить музыку, используя собственный или ваш файл с набором звуков (в некотором роде — звуковой шрифт). MuseScore может открывать MIDI, musicXML и несколько собственных форматов файлов. Вы так же можете экспортировать полученные нотные записи в различные форматы, в том числе MIDI, musicXML, WAVE-аудио и PDF. Кроме того, на сайте разработчиков имеет достаточно объемный набор всевозможных плагинов, которые позволяют автоматизировать большую часть возникающих задач.

В целом, MuseScore будет отличным выбором для написания композиций любой сложности.

Программа Lilypond уникальный подход к нотной записи

Lilypond использует уникальный подход к составлению нотной записи. На вход программе подается текстовый файл, составленный на своеобразном языке программирования. Который в последствии преобразуется в PDF или MIDI файл.

Хоть такой подход может несколько пугать, но не стоит спешить с выводами. У Lilypond существует достаточно неплохая документация, которая ориентирована даже на начинающих пользователей. В ней вы найдете не только примеры, но и детальное описание всех различных параметров. Потратив некоторое время на исследование программы, вы обнаружите, что Lilypond позволяет быстро создавать любые сложные композиции.

Помните, что редактирование обычного текстового файла происходит намного быстрее, нежели редактирование по средствам WYSIWYG редакторов. Даже простое добавление вольт будет происходить намного быстрее и легче. В дополнение ко всему, полученная нотная запись в PDF-формате будет выглядеть красиво (хороший PDF конвертер).

Примечание: У такого подхода есть свои весомые плюсы. Во-первых, редактировать текстовые файлы всегда быстрее (как и говорилось чуть ранее). Во-вторых, при необходимости вставки частей композиции из других файлов, все что вам потребуется это скопировать и вставить текст туда, куда вам нужно. В-третьих, такой подход позволяет использовать Lilypond в качестве отдельной части комплексной системы. Например, существует ряд графических оболочек для Lilypond, но об этом чуть дальше. В-четвертых, как и с любым текстовым файлом, вы можете использовать весь арсенал функций текстовых редакторов. Быстрый поиск, замена и т.д.

Конечно, писать музыку на непривычном языке, без определенной сноровки и без возможности сразу видеть готовый результат, задача не самая простая. Особенно, если собираетесь писать с нуля или исправлять уже имеющуюся сложную композицию. Можно достаточно долго изучать особенности и функции Lilypond, и в итоге чувствовать себя вполне естественно.

Но, так же можно использовать специальные графические оболочки, которые доступны на сайте Lylipond. Речь идет о Frescobaldi и Denemo. Frescobaldi позволяет одновременно с редактированием текстового файла, просматривать полученный скомпилированный PDF-файл. Так же в правой части главного окна есть панель кнопок для быстрой вставки нужных нот, точнее соответствующего текстового кода в файл.

Если же вам не нравится сама мысль редактирования текстового файла, то Denemo — это то, что вы искали. Denemo использует Lilypond за кулисами, предлагая пользователю составлять нотную запись только по средствам графических средств.

Примечание: Стоит понимать, что если вы по каким-либо причинам чувствуете себя неуютно только при об одном напоминании об «редактировании текстовых файлов» и не готовы при необходимости открывать текстовый редактор, то вам все же стоит использовать аналоги.

Lilypond поддерживает Mac OSX, Windows, Linux и FreeBSD. Frescobaldi поддерживает ОС Windows и Linux. Для использования Frescobaldi на Mac OSX, потребуется совершить несколько действий «руками». Denemo поддерживает Mac OSX, Windows и Linux.

Программа Finale Notepad простой и удобный редактор нот

Finale Notepad предоставляет достаточно простой набор функциональностей для составления нот, которые удовлетворят большинство потребностей пользователей.

Хоть и Finale Notepad отстает по функциональности от MuseScore и Lilypond, его основная привлекательность заключается в простоте использования. Благодаря своему прекрасно организованному интерфейс и отличному набору электронных руководств, вы можете начать составлять композицию сразу после запуска программы.

Finale Notepad может импортировать и экспортировать не только файлы собственных форматов, но и MIDI и musicXML. Отметим, что при импортировании MIDI, данные могут квантоваться.

Finale Notepad позволяет записывать ноты с помощью клавиатуры, щелчков мыши или проигрывая их на MIDI-устройствах. Программа предоставляет несколько наборов стандартных символов и обозначений, которые можно применять как к нотам, так и к самим себе, если это возможно (например, вольта).

Finale не столь гибкая, как MuseScore, и поддерживает меньше различных инструментариев. Отсутствует поддержка нотации аккордов, обращений гитарных трезвучий и ряда других инструментов. Тем не менее, Finale достаточно стабильная и простая в освоении программа, которая сохраняет блеск ее двоюродных братьев в линейке продуктов MakeMusic.

В целом, Finale Notepad больше подойдет для создания средней сложности композиций. Для сложных композиций, все же лучше использовать первые программы.

Источник

Программы для преобразования песни в ноты

Здесь представлены пять лучших программ для автоматической расшифровки музыки и преобразования песни в ноты

Здесь представлены пять лучших программ для автоматической расшифровки музыки.

The Transcribe! – это программное обеспечение помогает пользователям расшифровывать записанную музыку. Это помощник для людей, которые хотят обработать музыкальное произведение из записи, чтобы сыграть его самостоятельно или написать.

Эта программа не выполняет транскрипцию для пользователя, но это специализированная программа проигрывателя, улучшенная для транскрипции.

Ознакомьтесь с его лучшими функциями ниже:

  • Может использоваться для практики игры.
  • Мгновенно изменяет высоту тона и скорость, позволяя сохранять и вызывать любое количество именованных петель.
  • Вы сможете практиковаться во всех тональностях, а также сможете ускоряться и замедляться.
  • Может использоваться для транскрипции речи.
  • Если вы работаете с видеофайлом, эта программа также может отображать видео.
  • Не работает с файлами MIDI, но имеет дело с файлами данных аудиосэмплов.
  • В разделе справки программного обеспечения есть несколько советов по практике игры, и вам также следует проверить это.

Даже если программа воспроизводит и записывает аудиофайлы, это не значит, что это аудиоредактор.

NCH ​​TwelveKeys – это музыкальная программа, предназначенная для помощи музыкантам при расшифровке музыкальных записей. Инструмент работает со многими инструментами, играющими одновременно

Вот некоторые из наиболее заметных особенностей этого замечательного инструмента:

  • Слушайте музыкальные записи и смотрите ноты в реальном времени
  • Клавиатура пианино с поддержкой тембров помогает распознавать ноты
  • Замедление музыки без изменения высоты звука
  • Циклические участки записей
  • Графики монотонных и полифонических записей
  • Настраиваемые параметры для максимально четких графиков
  • Встроенный риппер для извлечения звука прямо с компакт-дисков
  • Поддерживает ножные педали для работы без помощи рук
  • Быстрая и простая работа
    Эта программа идеально подходит для музыкантов, пытающихся научиться играть музыкальное произведение без нотной записи или для помощи в записи других композиций и импровизаций.

Akoff Music Composer – один из лучших инструментов для автоматической расшифровки музыки. Эта программа использует сложный процесс автоматической транскрипции музыки.

Чтобы создать MIDI-последовательность для мелодии, записанной в аудиоформате, музыкант должен определить скорость, высоту и длительность каждой проигрываемой ноты.

Пользователь должен записать эти параметры в последовательность MIDI-событий.

Akoff Music Composer обычно транскрибирует полифоническую музыку одним инструментом или голосом.

Ознакомьтесь с основными функциями этого программного обеспечения:

  • Возможность отслеживать определенный темп во время записи или воспроизведения
  • Анализирует звуковые сигналы
  • Возможность определять динамику и частоту нот
  • Переводит всю информацию в MIDI-события и создает стандартную MIDI-последовательность.
  • Возможность редактирования нот

AnthemScore – Это программное обеспечение, которое автоматически создает ноты из аудиофайлов, включая WAV, MP3 и другие.

Программа использует нейронную сеть, которая обучена на миллионах выборок данных, чтобы иметь возможность получить высокий уровень точности и точности.

Ознакомьтесь с основными функциями AnthemScore:

  • Создает ноты в формате MusicXML, позволяя просматривать и редактировать их с помощью любого стандартного музыкального программного обеспечения.
  • Возможность просматривать график частоты / времени, играть на виртуальной клавиатуре, замедлять темп, а также сохранять ноты в другой тональности.
  • Ноты всех инструментов объединятся в одну часть.
  • Быстрая обработка песни.
  • Опция Staffs, позволяющая переместить все ноты на скрипичный или басовый ключ без изменения их высоты тона.
  • Параметры настройки высоты тона изменяют высоту тона всех нот вверх или вниз на фиксированное количество октав и полутонов.

AudioScore Ultimate – это полнофункциональная версия программного обеспечения, известного как AudioScore Lite, которое входит в состав Sibelius.

Используя это программное обеспечение, вы сможете преобразовывать записанный звук, живые выступления с микрофона или MIDI в ноты.

Источник

Музыкальный пример

В этой главе мы напишем музыкальный секвенсор. Мы будем переводить нотную запись в midi-файл с помощью библиотеки HCodecs . Она предоставляет возможность создания midi-файлов по описанию в Haskell. При этом описание напоминает описание самого формата midi. Мы же хотим подняться уровнем выше и описывать музыку нотами и композицией нот.

Музыкальная нотация

Для начала зададимся выясним: а что же такое музыка с точки зрения нашего секвенсора? Мы ищем представление музыки, термины, в которых было бы удобно мыслить композитору. При этом необходимо понимать, что наш поиск ограничен средствами низкоуровневого представления музыки. В нашем случае это midi-файл. Так например мы можем сразу отбросить представление в виде сигналов, последовательности сэмплов, поскольку мы не сможем реализовать это представление в рамках midi. За ответом обратимся к истории.

Нотная запись в европейской традиции

В европейской традиции принято описывать музыку в виде нотной записи. Нотный лист состоит из серии нотных станов. Нотный стан состоит из пяти линеек. Каждая линейка обозначает определённую высоту. Нота состоит из обозначения длительности и высоты. Разные длительности обозначаются штрихами и цветом ноты, а высоте соответствует расположение на нотном стане.

Буквенные обозначения высоты ноты

По длительности ноты различают на: целые, половины, четверти, восьмые, шестнадцатые и так далее. Каждая последующая длительность в два раза меньше предыдущей. Длительность измеряется в долях от такта. Такты обозначаются сплошной линией, которая перечёркивает все пять линеек нотного стана. По высоте ноты, зависят от двух целых чисел, это номер октавы и номер ступени лада. В ладе обычно всего 12 ступеней. Их обозначают разными именами. Например в латинской нотации их обозначают так:

В самом нижнем ряду расположены имена нот. Во втором и четвёртом – обозначения нот с диезами и с бемолями. Одна и та же нота может обозначаться по-разному. Буквами обозначают ноты тональности до мажор (это семь букв для семи нот), а остальные ноты получают повышением на один шаг с помощью знака диез $#$ или понижением на один шаг с помощью знака бемоль $b$ .

Также ноты различают по громкости. В европейской традиции считается, что громкость изменяется не часто в сравнении с высотой и длительностью, поэтому для обозначения громкости введены специальные символы, которые пишутся под нотным станом, только когда громкость изменяется.

Из этого обзора мы поняли, что единицей музыкальной записи является нота, она состоит из обозначения длительности, высоты и громкости. Высота в свою очередь состоит из обозначения октавы и ступени лада. Теперь давайте посмотрим крупным планом на протокол midi .

Протокол midi

Протокол midi появился в ответ на бурное развитие синтезаторов. Каждый из синтезаторов предлагал свои тембры, при этом люди задумались, а нужна ли синтезатору клавиатура? Вопрос кажется абсурдным, если мы думаем об одном синтезаторе, но представьте, что у вас их десять, в каждом свой чем-то особенный тембр. При этом нам нужно десять разных тембров, но мы вынуждены таскать за собой десять примерно одинаковых клавиатур. Для того чтобы отделить тембр от управления (нажатия на клавиши игроком) был придуман протокол midi. Протокол midi описывает специфическую для нажатия на клавиши информацию. Производители тембров или генераторов тона, могут научить генератор тона понимать midi. При этом мы можем сделать отдельную клавиатуру, которая не имеет собственного генератора тона, но умеет посылать сообщения протокола midi, так мы сможем управлять десятью генераторами тона от разных производителей с помощью одной клавиатуры. Такие клавиатуры называют midi-клавиатурами.

Познакомимся с терминологией midi. Протокол midi рассчитан на управление синтезаторами в режиме реального времени. Можно сказать, что midi-файл – это история концерта или выступления, низкоуровневая нотная запись. Каждое движение игрока кодируется событием. Например нажатие на клавишу, отпускание клавиши, сила давления на клавишу в определённый момент времени, нажатие педали, поворот реле или смена тембра.

Протокол midi изначально задумывался как расширяемый протокол. Каждый производитель тембров имеет возможность добавить какие-то особенные настройки. При этом те сообщения, которые данный генератор тона не понимает просто игнорируются. Наш секвенсор будет понимать такие события как нажатие на клавишу и отпускание клавиши. Также у нас будут разные инструменты.

Установим библиотеку HCodecs с Hackage :

Теперь заглянем на страницу документации этого пакета (на сайте Hackage), нас интересует модуль Codec . Midi , ведь мы хотим создавать именно midi-файлы. Здесь мы видим описание протокола midi, закодированное в типах. Посмотрим на тип Message , он описывает midi-сообщения. В первую очередь нас интересуют конструкторы:

Восклицательные знаки перед типами означают взрывные шаблоны, о которых мы говорили в главах о ленивых вычислениях. Конструктор NoteOn обозначает нажатие клавиши на канале Channel с высотой Key и уровнем громкости Velocity . Конструктор NoteOff обозначает отпускание клавиши, параметры имеют тот же смысл, что и в случае NoteOn .

Думаю что такое высота и громкость примерно понятно, но что такое канал? Считается, что один исполнитель может управлять сразу несколькими генераторами тона. Управление распределяется по каналам. На каждом канале мы можем управлять отдельным инструментом. Немного о высоте и громкости. Они кодируются целыми числами из диапазона от 0 до 127. Ноте до первой октавы ( $C$ ) соответствует цифра 60, ноте ля первой октавы ( $A$ ) соответствует номер 69. Одно число кодирует сразу и октаву и ступень лада.

Может показаться странным параметр Velocity в конструкторе NoteOff , он обозначает отпускание клавиши с определённой громкостью. Обычно этот параметр игнорируется и в него записывают среднее значение 64 или начальное значение 0.

Также мы будем играть разными инструментами. Инструменты в протоколе midi называются программами. Мы можем установить определённый инструмент на данном канале с помощью сообщения:

Целое число Preset указывает на код инструмента. Теперь посмотрим, что же такое midi-файл:

midi-файл состоит из трёх значений. Это обозначение типа файла:

По типу midi-файлы могут различаться на файлы с одним треком, файлы с несколькими треками, и файлы, которые содержат группы треков, которые называют узорами (pattern). По смыслу трек соответствует партии инструмента.

Тип TimeDiv кодирует скорость записи сообщений. Различают два варианта:

Первый конструктор говорит о том, что разрешение времени закодировано в формате PPQN, он указывает на число ударов в одной четвертной длительности. Второй конструктор говорит о том, что разрешение кодируется в формате SMPTE, оно указывает на число кадров в секунде.

Теперь посмотрим, что такое трек:

Трек это список событий с временными отсчётами. Время в midi отсчитывается относительно предыдущего события. Например в следующей записи три события произошли одновременно и затем спустя 10 тактов произошли ещё два события:

Музыкальная запись в виде событий

Писать музыку в виде событий midi очень неудобно, пусть даже и через HCodecs , необходимо придумать надстройку над протоколом midi. Я долго думал об этом и в итоге пришёл к выводу, что наиболее простой и податливый способ представления музыки на нотном уровне реализован в языке Csound. Там ноты представлены в виде последовательности событий. Каждое событие начинается в определённый момент и длится некоторое время. Событие содержит код инструмента и набор параметров, которые могут включать в себя громкость, высоту звука и какие-то специфические для данного инструмента настройки. Обязательными параметрами события являются лишь номер инструмента, который играет ноту, начало события и длительность события. Мы ослабим эти ограничения. Событие будет содержать лишь время начала, длительность и некоторое содержание.

Параметр t символизирует время, а параметр a – некоторое содержание события. Мы будем говорить, что в некоторый момент времени произошло значение типа a и оно длилось некоторое время. Треком мы будем называть набор событий, которые длятся определённой время:

Первый параметр указывает на общую длительность трека, а второй содержит события, которые произошли. Мы явно указываем длительность трека для того, чтобы иметь возможность представить тишину. Значение тишины будет выглядеть так:

Этим мы говорим, что ничего не произошло в течение t единиц времени.

Преобразование событий во времени

Наши события привязаны ко времени. Мы можем ввести линейные операции, которые будут изменять расположение событий во времени. Самый простой способ изменения положения это задержка. Мы можем задержать появление события, прибавив какое-нибудь число ко времени начала события:

Ещё одно простое преобразование заключается в изменении масштаба времени, в музыке или анимации этой операции соответствует перемотка. Событие начинает происходить быстрее или медленнее:

Для изменения масштаба времени мы умножили временные параметры на число s . Эти операции мы можем перенести и на значения типа Track .

Класс преобразований во времени

У нас есть аналогичные операции преобразования во времени для событий и треков, это говорит о том, что мы можем ввести специальный класс, который объединит в себе эти операции. Назовём его классом Temporal (временной):

В этом классе определён один тип, который обозначает размерность времени, и три метода в дополнении к методам delay и stretch мы добавим метод dur , мы будем считать, что всё что происходит во времени конечно и с помощью метода dur мы всегда можем узнать протяжённость значения их класса Temporal во времени. Для определения этого класса нам придётся подключить расширение TypeFamilies . Теперь мы легко можем определить экземпляры класса Temporal для Event и Track :

Композиция треков

Определим две полезные в музыке операции: параллельную и последовательную композицию треков. В параллельной композиции мы играем два трека одновременно:

Теперь общая длительность трека равна длительности большего из треков, а события включают в себя события каждого из треков. С помощью преобразований во времени мы можем определить последовательную композицию, для этого мы сместим второй трек на длину первого и сыграем их одновременно:

При этом у нас как раз и получится, что мы сначала сыграем целиком трек a , а затем трек b . Теперь определим аналоги операций =:= и +:+ для списков:

Мы можем определить в терминах этих операций цикличный повтор событий:

Экземпляры стандартных классов

Мы можем сделать тип трек экземпляром класса Functor :

Мы можем также определить экземпляр для класса Monoid . Параллельная композиция будет операцией объединения, а нейтральным элементом будет тишина, которая длится ноль единиц времени:

Ноты в midi

С помощью типа Track мы можем описывать всё, что имеет свойство случаться во времени и длиться, мы можем описывать наборы событий. Операции из класса Temporal и операции последовательной и параллельной композиции дают нам возможность собирать сложные наборы событий из простейших. Но для того чтобы это стало музыкой, нам не хватает нот.

Так построим их. Поскольку мы собираемся играть музыку в midi, наши ноты будут содержать только три основных параметра, это номер инструмента, громкость и высота. Длительность ноты будет кодироваться в событии, эта информация уже встроена в тип Track .

Итак нота содержит код инструмента, громкость и высоту и ещё один параметр. По последнему параметру можно узнать сыграна нота на барабане или нет. В midi ноты для ударных обрабатываются особым образом. Десятый канал выделен под ударные, при этом номер инструмента игнорируется, а вместо этого высота звука кодирует номер ударного инструмента. Теперь определимся с типами параметров:

Целые числа соответствуют целым числам в протоколе midi. Значения для типов Volume и Pitch лежат в диапазоне от 0 до 127.

Введём специальное обозначение для музыкального типа Track :

Синонимы для нот

Высота ноты

Музыкантам ближе буквенные обозначения для нот нежели коды midi. Определим удобные синонимы:

Эта функция строит трек, который содержит одну ноту. Нота длится одну целую длительность играется на инструменте с кодом 0 , на средней громкости. Параметр функции задаёт смещение от ноты до первой октавы. Определим остальные ноты:

Первая буква содержит буквенное обозначение ноты, а вторая либо s (от англ. sharp диез) или f (от англ. flat бемоль). Все эти ноты находятся в первой октаве, но смещением высоты на 12 единиц мы легко можем смещать эти ноты в любую другую октаву:

С помощью этих функций мы легко можем смещать группы нот в любую октаву. Функция higher принимает число октав, на которые необходимо сместить вверх высоту во всех нотах трека. Смещение высоты на 12 определяет смещение на одну октаву. Остальные функции определены в через функцию higher .

Длительность ноты

Пока что наши ноты длятся 1 единицу времени. Но нам бы хотелось иметь в распоряжении и другие длительности. Ноты других длительностей мы можем легко получать с помощью функции stretch , мы просто изменим масштаб времени и длительность всех нот изменится. Определим несколько синонимов:

Эти преобразования отвечают длительностям нот в европейской музыкальной традиции.

Громкость ноты

Пока мы умеем создавать ноты средней громкости, но мы можем определить преобразователи на манер тех, что изменяли высоту звука октавами:

Смена инструмента

Изначально мы создаём ноты, которые играются на инструменте с кодом 0, в протоколе General Midi этот номер соответствует роялю. Но с помощью класса Functor мы легко можем изменить инструмент:

Согласно протоколу midi в случае ударных инструментов высота звука кодирует инструмент. Поэтому в функции drum мы изменяем именно поле notePitch . Создадим также несколько синонимов для создания нот, которые играются на барабанах. В этом случае нам не важна высота звука но важна громкость:

Номер 35 кодирует “бочку”.

Паузы

Слово silence верно отражает смысл, но оно слишком длинное. Давайте определим несколько синонимов:

Перевод в midi

Теперь мы можем составить какую нибудь мелодию:

Мы можем составлять мелодии, но пока мы не умеем их интерпретировать. Для этого нам нужно написать функцию:

Мы реализуем простейший случай. Будем считать, что у нас только 15 инструментов, а все остальные инструменты – ударные. Мы запишем нашу музыку на один трек midi-файла, распределив 15 неударных инструментов по разным каналам. Ещё одно упрощение заключается в том, что мы зададим фиксированное разрешение по времени для всех возможных мелодий. Будем считать, что 96 ударов для одной четверти нам достаточно. Принимая во внимания эти посылки мы можем написать такую функцию:

Мы загрузили модуль Codec . Midi под псевдонимом M , так мы сможем отличать низкоуровневые определения от тех, что мы определили сами. Теперь перед каждым именем из модуля Codec . Midi необходимо писать приставку M .

В нашей упрощённой реализации на одном канале может играть только один инструмент. В самом начале мы назначим инструмент на канал с помощью сообщения ProgramChange . Для этого нам необходимо понять какому инструменту какой канал соответствует. В библиотеке HCodecs каналы идут от нуля до 15. Девятый канал предназначен для ударных. Представим, что у нас есть функция, которая распределяет нотную запись по инструментам:

Эта функция принимает нотную запись, а возвращает пару. Первый элемент содержит список списков нот для неударных инструментов, каждый подсписок содержит ноты только для одного инструмента. Второй элемент пары содержит все ноты для ударных инструментов. Представим также, что у нас есть функция, которая превращает эту пару в набор midi-сообщений:

Наши отсчёты времени записаны в виде значений типа Double , Нам необходимо перейти к целочисленным Ticks . Представим, что такая функция у нас уже есть:

Тогда функция toTrack примет вид:

Все три составляющие функции пока не определены. Начнём с функции tfmTime . Нам необходимо отсортировать события во времени для того, чтобы мы смогли перейти из абсолютных отсчётов во времени в относительные. Специально для этого в библиотеке HСodecs определена функция:

Также нам понадобится функция:

Она проводит квантование во времени. С помощью неё мы преобразуем отсчёты в Double в целочисленные отсчёты. С помощью этих функций мы можем определить функцию timeDiv так:

В этой функции мы сначала сортируем события во времени, затем переходим от абсолютных единиц к относительным и в самом конце производим квантование по времени. Функция sortBy сортирует элементы согласно некоторой функции упорядочивания:

Она принимает функцию упорядочивания и список. Мы воспользовались этой функцией, потому что нам необходимо отсортировать элементы списка сообщений по значению временных отсчётов. Функцию упорядочивания мы составляем с помощью специальной функции on , которая определена в модуле Data . Function . С этой функцией мы уже сталкивались, когда говорили о функциях высшего порядка, она принимает функцию двух аргументов и функцию одного аргумента и словно “подкладывает” вторую функцию под первую:

Теперь напишем функцию mergeInstr . Она устанавливает инструменты на каналы и преобразует события в последовательность midi-сообщений. При этом мы различаем сообщения для ударных и сообщения для всех остальных инструментов:

Имя instrs’ указывает на последовательность списков сообщений для каждого неударного инструмента. Функция setChannel принимает номер канала и список событий. По ним она строит список midi-сообщений. Определим эту функцию:

Первым событием мы присоединяем событие, которое устанавливает на данном канале определённый инструмент. По построению программы все ноты в переданном списке играются на одном и том же инструменте, поэтому мы узнаём идентификатор инструмента из первого элемента списка. У нас появилась новая неопределённая функция fromEvent она переводит сообщение в список midi-сообщений:

Определив эти функции, мы легко можем написать и функцию setDrumChannel она переводит сообщения для ударных инструментов в midi-сообщения:

Для ударных инструментов выделен отдельный канал. Считается, что все они происходят на 10 канале. Поскольку в библиотеке HCodecs первый канал называется нулевым, мы будем записывать все сообщения на девятый канал.

Мы переводим событие в два midi-сообщения, первое говорит о том, что мы начали играть ноту, а второе говорит о том, что мы закончили её играть. Функция clipToMidi приводит значения для высоты и громкости в диапазон midi.

Нам осталось определить только одну функцию. Эта функция распределяет события по инструментам. Сначала мы разделим события на те, что играются на ударных и неударных инструментах, а затем разделим “неударные” ноты по инструментам:

В этом определении мы воспользовались двумя новыми стандартными функциями из модуля Data . List . Функция partition разделяет список на пару списков. В первом списке находятся все те элементы, для которых заданный предикат вернул True , а во втором списке – все остальные элементы исходного списка:

Функция groupBy превращает список в список списков:

Если бинарная функция на соседних элементах исходного списка вернула True , то они помещаются в один подсписок. Эта функция используется для того чтобы сгруппировать элементы списка по какому-нибудь признаку. При этом для того чтобы сгруппировать элементы по идентификатору инструмента, мы сначала отсортировали события по значению идентификатора. После этого значения с одинаковыми идентификаторами стали соседними и мы сгруппировали их с помощью groupBy .

Функция first применяет функцию к первому элементу пары. Вот мы и закончили, можно послушать результаты. На самом деле остались два нюанса. В функции setChannel мы полагаем, что мелодия начинается в момент времени t = 0 , но на практике это может оказаться не так, мы можем сместить ноты функцией delay в отрицательную сторону. Тогда первые ноты будут содержать отрицательное время начала события. Но мы можем исправить эту ситуацию, сместив все ноты на время самой первой ноты, конечно смещать необходимо только в том случае если время окажется отрицательным:

Вызовем эту функцию сразу после функции trackEvents в функции groupInstr . Второй нюанс заключается в том, что каждый трек в midi-файле должен заканчиваться специальным сообщением, в библиотеке HCodecs оно обозначается с помощью конструктора TrackEnd . В самом конце необходимо добавить сообщение ( 0 , TrackEnd ) :

Теперь мы можем проверить, что у нас получилось. Создадим файл:

В функции out мы переводим нотную запись в значение типа Midi , затем сохраняем это значение в файле tmp . mid и в самом конце запускаем файл с помощью проигрывателя timidity . Вместо timidity вы можете воспользоваться вашим любимым проигрывателем midi -файлов. Теперь загрузим модуль Main в интерпретатор. Послушаем ноту до:

Далее следуют сообщения из проигрывателя timidity и долгожданный звук. Мы слышим ноту до, сыгранную на рояле. Наберём какую-нибудь мелодию:

Сыграем в два раза быстрее, на другом инструменте:

Сыграем канон. Канон это когда одна и та же мелодия ведётся в разных голосах с запаздыванием. Сыграем двухголосный канон:

Номера инструментов можно посмотреть по справке к протоколу General Midi. Это дополнение к протоколу midi определяет какие номера каким инструментам должны соответствовать. Звучит ужасно, но звучит!

Пример

Опираясь на примитивы композиции, которые мы определил в модуле Score , мы можем написать мелодию. Ниже приведён небольшой пример. Инструменты:

Уже сейчас мы можем загрузить эту партию в интерпретатор и послушать, вызвав out drums . Аккорды к мелодии:

Добавим в конце звук тарелки:

Соберём всё вместе и послушаем:

В конце стоит фиктивный элемент rest 0 для того чтобы было удобно глушить инструменты комментированием.

Эффективное представление музыкальной нотации

Реализация, которую мы рассмотрели не эффективна, Мы могли бы определить тип Track и по-другому. Мы очень часто пользуемся операцией delay через операцию line . Так в выражении:

Мы будем несколько раз обходить элемент s3 для каждого применения line . К примеру сначала мы смести все элементы на 3, потом сместим на 5, потом на 10, но вместо этого мы могли бы сразу сместить все элементы на 18 за один проход. Для этого мы можем закодировать преобразования событий во времени в типе Track :

Тип TList позволяет проводить быстрое объединение списков. Дополнительный конструктор TFun обозначает линейное преобразование списка во времени. Линейное преобразование кодируется двумя числами, это масштаб и смещение. Мы считаем, что события в конструкторе Single начинаются в момент времени 0 и длятся 1 единицу времени. Так например событие, которое произошло на 2 единице времени и длилось 4 единицы можно представить так:

Значение Tfm k d обозначает линейную функцию

Для того чтобы получить настоящие отсчёты по времени мы применяем её к временным координатам “не преобразованного” события, то есть события Event 0 1 a .

Единственное, что нам нужно для того чтобы встроить этот вариант в библиотеку это написать функцию:

И конечно переопределить все функции композиции. Но все сложные функции, которые отвечают за перевод из Track в Midi останутся прежними.

Краткое содержание

В этой главе мы построили секвенсор для создания midi-файлов. Мы воспользовались библиотекой HCodecs и создали над ней небольшую надстройку.

В нашей библиотеке примитивными конструкциями были события, параллельная композиция (одновременное воспроизведение) и преобразование событий во времени (сдвиг и масштабирование). Все остальные операции выражались через эти простейшие операции. Отметим, что есть и другие подходы. Например в библиотеках Haskore и Euterpea примитивными конструкциями является единичное событие (без отметок во времени) и параллельная и последовательная композиции. Подход, который мы рассмотрели в более общем виде реализован в библиотеках temporal — music — notation и temporal — music — notation — demo .

Упражнения

Попробуйте написать какую-нибудь мелодию.

Подумайте каких операций не хватает. Например было бы удобно иметь возможность вырезать из мелодии куски. Так в примере у нас остались хвосты от ударной секции, определите операцию, которая позволяет убрать лишнее.

Источник

Оцените статью
0 1 2 3 4 5 6 7 8 9 10 11