Как вы представляете музыку в структуре данных?

Как бы вы моделировали простой музыкальный балл для одного инструмента, написанного в стандартной стандартной нотации? Конечно, есть много библиотек, которые делают именно это. Мне в основном интересно узнать о различных способах представления музыки в структуре данных. Что работает хорошо, а что нет?

Игнорируя некоторые из более сложных аспектов, таких как динамика, очевидным способом был бы буквальный перевод всего в объекты - показатели сделаны из "Меры" из Notes. Синтез, я полагаю, означал бы определение времени начала и окончания каждой ноты и смешивания синусоидальных волн.

Является ли очевидный способ хорошим способом? Каковы другие способы сделать это?

Ответ 1

MIDI файлы были бы обычным способом сделать это. MIDI - это стандартный формат для хранения данных о музыкальных нотах, включая время начала и окончания, объем примечаний, инструмент, на котором он играл, и различные специальные характеристики; вы можете найти множество предварительно написанных библиотек (включая некоторые открытые исходники) для чтения и записи файлов и представления данных в них в терминах массивов или объектов, хотя обычно они не делают этого, имея объект для каждой заметки, который скомпонованный объем памяти.

Инструменты, определенные на MIDI, представляют собой только цифры от 1 до 128, которые имеют символические имена, такие как скрипка или труба, но сам MIDI ничего не говорит о том, что на самом деле должны звучать. Такова работа синтезатора, которая принимает высокоуровневые MIDI-данные и преобразует их в звук. В принципе, да, вы можете создать любой звук, накладывая синусоидальные волны, но на практике это не так хорошо, потому что он становится интенсивным с вычислительной точки зрения, когда вы будете играть параллельно с несколькими треками; Кроме того, простой спектр Фурье (относительные интенсивности синусоидальных волн) просто недостаточен, когда вы пытаетесь воспроизвести реальный звук инструмента и выразительность человека, играющего его. (Я написал простой синтезатор, чтобы сделать это, поэтому я знаю, что он может создать достойный звук). В науке синтеза много исследований, и в целом DSP (обработка цифровых сигналов), поэтому вы должны безусловно, сможете найти множество книг и веб-страниц, чтобы прочитать об этом, если хотите.

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

Ответ 2

Многие люди, делающие новые общие нотные проекты западной музыки, используют MusicXML в качестве отправной точки. Он обеспечивает полное представление нотной записи, которую вы можете подобрать для удовлетворения ваших потребностей. В настоящее время существует определение схемы XSD, которое, как и ProxyMusic, использует для создания объектных моделей MusicXML. ProxyMusic создает их на Java, но вы должны иметь возможность сделать что-то подобное с другими инструментами привязки данных XML на других языках.

Как сказал один из пользователей MusicXML:

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

Доступно гораздо больше информации - XSD и DTD, образцы файлов, учебник, список поддерживаемых приложений, список публикаций и т.д. - на

http://www.makemusic.com/musicxml

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

Правда, нотация музыки не является иерархической. Поскольку XML является иерархическим, MusicXML использует парные элементы start-stop для представления неиерархической информации. Собственная структура данных может представлять вещи более прямо, что является одной из причин того, что MusicXML является лишь отправной точкой для структуры данных.

Для более прямого способа представления нотной записи, которая фиксирует свою горизонтальную и вертикальную структуру, просмотрите формат Humdrum, который использует больше модели электронной таблицы/решетки. Humdrum особенно используется в приложениях для обработки музыки и музыки, где его структура данных работает особенно хорошо.

Ответ 3

Музыка в структуре данных, стандартная нотация,...

Похоже, вас будет интересовать LilyPond.

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

Если вы так наклонены, вы можете сгенерировать текстовые файлы с помощью программы и вызвать LilyPond, чтобы преобразовать его в нотацию и файл midi для вас.

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

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

Удачи!

Ответ 4

Хммм, забавная проблема.

На самом деле, у меня возникнет соблазн включить его в Command pattern вместе с Composite. Это своего рода превращение нормального подхода OO на голову, поскольку вы в некотором смысле создаете глаголы моделируемых объектов вместо существительных. Это будет выглядеть так:

a Примечание - это класс с одним методом, play(), and a ctor taking length and tone`.

вам нужен Инструмент, который определяет поведение синтезатора: тембр, атаку и т.д.

У вас будет счет, который имеет TimeSignature, и представляет собой композитный шаблон, содержащий "Меры"; Меры содержат примечания.

Фактически это означает интерпретацию некоторых других вещей, таких как Repeats and Codas, которые являются другими Контейнерами. Чтобы воспроизвести его, вы интерпретируете иерархическую структуру Composite, вставляя заметку в очередь; поскольку заметки перемещаются по очереди на основе темпа, каждая нота имеет свой метод play().

Хммм, может инвертировать это; каждое примечание дается в качестве входных данных для Инструмента, которое интерпретирует его, синтезируя форму волны по мере необходимости. Это возвращается к чему-то вроде вашей оригинальной схемы.

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

Интересная проблема.

Ответ 5

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

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

Ответ 6

Полезность модели может быть оценена только в заданном контексте. Что вы пытаетесь сделать с этой моделью?

Многие респонденты заявили, что музыка не является иерархической. Я согласен с этим, но вместо этого предполагаю, что музыку можно рассматривать иерархически со многих разных точек зрения, каждая из которых порождает другую иерархию. Мы можем рассмотреть его как список голосов, каждый из которых имеет заметки с атрибутами on/off/velocity/etc. Или мы можем рассмотреть его как вертикальные звучности с целью гармонического анализа. Или мы можем рассмотреть его таким образом, который подходит для контрапунктального анализа. Или много других возможностей. Хуже того, мы можем видеть это с разных точек зрения для одной цели.

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