Как вы представляете музыку в структуре данных? - PullRequest
9 голосов
/ 22 января 2009

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

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

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

Ответы [ 6 ]

7 голосов
/ 31 января 2009

Многие люди, занимающиеся новыми проектами по распространению западной музыки, используют 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 особенно используется в приложениях по музыковедению и анализу музыки, где его структура данных работает особенно хорошо.

5 голосов
/ 22 января 2009

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

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

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

3 голосов
/ 18 февраля 2009

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

Звучит так, как если бы вы были заинтересованы в LilyPond .

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

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

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

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

Веселись!

2 голосов
/ 22 января 2009

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

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

2 голосов
/ 22 января 2009

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

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

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

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

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

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

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

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

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

1 голос
/ 31 января 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...