Comments 40
Статья интересная, но не хватает ссылок на сгенерированные аудиозаписи.
И не совсем понятно, зачем анализировать последовательность нот в произведениях, если все уже давным-давно проанализировано.
> анализировать последовательность нот в произведениях, если все уже давным-давно проанализировано.

Вы дали ссылку на гамму. Если вы проанализируете гамму, то цепь Маркова будет вам генерировать только ту же самую гамму.
Да-да, гамма — она такая.

В гамме До-мажор после До идет Ре и никак иначе. Посему вероятность перехода из ноты До в Ре в цепи Маркова будет равна единице. Тут уж ничего не поделаешь. Поэтому анализ гаммы через цепь Маркова даст ту же самую гамму.
Классическая гармония, кстати, может быть описана математическими формулами. Попробуйте написать гармонизатор для существующей мелодии — будет круто.
3 года назад у меня был диплом «Автоматизация Гармонизации Мелодии» — я его защищал и в у универе (информатика), и в консерватории. В универ нес документ, что диплом логичен с музыкальной точки зрения, в консерваторию — что с математической. Весьма удобно было защищать 1 диплом в 2 вузах :) просто с двух разных сторон. Получалось гармонизировать весьма неплохо — сделал интерфейс на канвасе, закодил правила из учебника (Бригадного) и получал несколько вариантов классического решения. Ну а для прослушивания того что получилось генерировал midi.

Классная статья, спасибо
Программой из диплома не поделитесь? ;)

Бригадный учебник рулит! На кого учились в консе, и в какой?
Учился в филиале Донецкой консы в Симферополе — скрипка. Учился заочно, чтобы учиться на информатике в ТНУ.

вот прога, должна работать — bit.ly/1e3KzLf.
p.s. За код строго не ругайте — первое знакомство с php+js+canvas ;)
Естественно, мы люди и хотим видеть результат в привычной нам нотной записи.

Я бы сказал, что люди хотят послушать музыку. Честно говоря, не представляю как это сделать на PHP, который мой основной язык за последние 10+ лет, кроме как вникать в подробности музыкальной теории, преобразующей ноты в частоты, и математики, преобразующей частоты в амплитуды, а амплитуды в конкретный звуковой файл.

И то, мои ранние эксперименты (не на PHP, а на ассемблере) на этом поприще приводили к тому, что математически и алгоритмически преобразование безупречно (не считая погрешности дискретизации на уровне сотых долей Герца и АЧХ тракта), но одноклассники, серьезно музыкой занимающиеся, говорили и о «фальши» и о «неправильном темпе» даже на простейших мелодиях типа «Во поле березка стояла». При этом я не программировал динамик напрямую через порты, а пользовался какой-то (С?)БИС, которая синхронизировалась от кварца.

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

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

Попробуйте в малых пределах рандомизировать частоту, авось, что и выйдет ;)
Под хардварными вы имеете в виду «устаревшие» или различные навороченные звуковые карты, хранящие в ПЗУ сэмплы?

Да поздно уже пробовать. Я разочаровался в музыкантах — их даже резонанс камертона не убеждал :) А если серьезно, то мои эксперименты в этой области окончились в прошлом тысячелетие, столкнувшись с субъективной критикой, которую объективно не подтверждается.
> Под хардварными вы имеете в виду «устаревшие» или различные навороченные звуковые карты, хранящие в ПЗУ сэмплы?

под хардварными я имею в виду «живые» инструменты с живым исполнителем, играющим на них.

> Я разочаровался в музыкантах — их даже резонанс камертона не убеждал :)

хреновые вам музыканты попадались, раз они суть™ не рубят

> субъективной критикой, которую объективно не подтверждается

человечество не привыкло к точным звукам. С этим ничего не поделаешь, это как темперированная система, или строение мажора и минора — к ним тоже все привыкли, и их изменение воспринимается с удивлением (и подчас с негативом).
Да очень много тонкостей. Что вы знаете про mel-scale? А, ну да, увеличение частоты в два раза на слух не всегда воспринимается как повышение тона на октаву. А от чего ещё зависит тон, кроме частоты? А от амплитуды зависит. Более интенсивный звук кажется (то есть, воспринимается) более высоким. И вот опа, вы можете подстроить частоту точно, но человеком будет восприниматься как фальшивая нота.

Я ещё напомню про различные коммы, в том числе, то, что двенадцать квинт != семь октав (как должно было бы быть). В равномерно темперированном строе чуток «смяли» квинту и сделали её слегка не чистой, что вполне можно расслышать, И слышно это как «небольшая фальшь». Хотя частоты точно вычислены по формуле, да.
Для преобразования нот в частоты есть такая формула: .

Звуковые файлы можно теоретически генерировать на PHP при помощи класса WavFile из Securimage. Но проще всего будет «проигрывать» музыку при помощи очень простого приложения на C, использующего функцию WinAPI Beep(), которая подает сигнал определенной частоты на спикер.
Вот именно функцию аналогичную Beep (правда о Windows тогда речи не было, по крайней мере в моем распоряжении) я использовал. Правда для нот использовал табличные значения для основной октавы и деление/умножение для остальных.
UFO landed and left these words here
Вот именно эта формула и есть фальшивая.

Всем известно, что октава — соотношение частот 1:2, а квинта (чистая натуральная) — 3:2. А теперь внимание, найдите проблему.
Очень кстати. Я тут набросал пример по мотивам кода из поста.
Только оперирует с RTTTL — мелодиями.
Онлайн конвертер RTTTL->MIDI.

Сами мелодии можно найти в интернете. Их ещё много осталось со времён Nokia 3310.
Примеры мелодий
Pacman:d=4,o=5,b=112:32b,32p,32b6,32p,32f#6,32p,32d#6,32p,32b6,32f#6,16p,16d#6,16p,32c6,32p,32c7,32p,32g6,32p,32e6,32p,32c7,32g6,16p,16e6,16p,32b,32p,32b6,32p,32f#6,32p,32d#6,32p,32b6,32f#6,16p,16d#6,16p,32d#6,32e6,32f6,32p,32f6,32f#6,32g6,32p,32g6,32g#6,32a6,32p,32b.6
LeisureSuit:d=16,o=6,b=56:f.5,f#.5,g.5,g#5,32a#5,f5,g#.5,a#.5,32f5,g#5,32a#5,g#5,8c#.,a#5,32c#,a5,a#.5,c#.,32a5,a#5,32c#,d#,8e,c#.,f.,f.,f.,f.,f,32e,d#,8d,a#.5,e,32f,e,32f,c#,d#.,c#
Bond:d=4,o=5,b=320:c,8d,8d,d,2d,c,c,c,c,8d#,8d#,2d#,d,d,d,c,8d,8d,d,2d,c,c,c,c,8d#,8d#,d#,2d#,d,c#,c,c6,1b.,g,f,1g.
Terminator II:d=4,o=5,b=90:32d6,16e6,2f6,8e6,8c6,2f,16p,32d6,16e6,2f6,8e6,8c6,2a6,2g6
Toccata:d=4,o=5,b=160:16a4,16g4,1a4,16g4,16f4,16d4,16e4,2c#4,16p,d.4,2p,16a4,16g4,1a4,8e.4,8f.4,8c#.4,2d4
fifth:d=4,o=5,b=63:8P,8G5,8G5,8G5,2D#5
Flinstones:d=4,o=5,b=40:32p,16f6,16a#,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,d6
Tetris:d=4,o=5,b=160:e6,8b,8c6,8d6,16e6,16d6,8c6,8b,a,8a,8c6,e6,8d6,8c6,b,8b,8c6,d6,e6,c6,a,2a,8p,d6,8f6,a6,8g6,8f6,e6,8e6,8c6,e6,8d6,8c6,b,8b,8c6,d6,e6,c6,a,a
MahnaMahna:d=16,o=6,b=125:c#,c.,b5,8a#.5,8f.,4g#,a#,g.,4d#,8p,c#,c.,b5,8a#.5,8f.,g#.,8a#.,4g,8p,c#,c.,b5,8a#.5,8f.,4g#,f,g.,8d#.,f,g.,8d#.,f,8g,8d#.,f,8g,d#,8c,a#5,8d#.,8d#.,4d#,8d#.

Онлайн конвертер у меня выдает ошибку при попытке воспроизведения мелодий из вашего примера.
Нашел причину — в конвертере ноты нужно указывать через маленькую латинскую букву(8f6) а у вас в примере — через большую(8F6).
Спасибо. Не только поправил, но и использовал библиотеку, предложенную . Теперь из генерируется MIDI-файл, который можно скачать и послушать.
Зачем делать это на PHP? Можно же взять какую-нибудь MIDI игралку. А Midi — это ноты и есть.

Я всегда буду читать комментарии, прежде, чем писать свой!
я думаю, прежде чем продолжать, вам надо покурить тональности (мажор / минор) и гаммы… если не забуду вечером кину хорошую книжку, где музыка разбирается с точки зрения физики/математики.
и попробуйте обращать внимание не на то что «после А4 идет С5» а то что после А4 следующий звук на 3 полутона выше (терция)
С. Попов «Музыкальное и аппликатурное мышление гитариста» Отличная книга по теории музыки.
Лучше даже так: надо при анализе смотреть не то, какой высоты нота (A4, если примеры выше), а то, какой ступенью она является в используемой тональности — и статистику считать уже относительно ступеней. Например, первая ступень часто встречается после седьмой, второй и пятой.

Либо, если лень считать ступенями, надо всё приводить к до-мажору/ля-минору (там нет знаков при ключе) и сбор статистики с сочинением вести именно в этой паре беззнаковых тональностей.
А, кстати, почему отбросили («не стали заморачиваться») с длительностью нот?
Думаю по тому же принципу можно и длительность получить.
UFO landed and left these words here
Странно то что в моем анализе большого кол-ва произведений наиболее вероятная нота это — та же самая нота
не странно

но нужно выбирать не самую вероятную ноту, а случайную, но по неравномерному распределению

Марковский процесс действительно не подходит. Нота же зависит не только от предыдущих, а ещё и, например, от положения в такте, в квадрате (или другом сегменте, если музыка «неквадратная») и так далее.
Выглядит как обычный n-gram, сомневаюсь, что на выходе будет что-то не раздражающее слух сколько на чем не тренируй.
Если не тащить PHP, а сразу взять что-то вроде Overtone или athenaCL, то можно сразу работать в предметной области.
Зря вы сделали отсылку к Маркову, и забыли сделать отсылку к Моцарту. У него же есть книжка о том, как сочинять музыку с помощью двух игральных костей. И он даже примеры сочиненных таким образом приводит :)
Вот тут можно сочинить музыку по методу «Музыкальная игра в кости» Моцарта
sunsite.univie.ac.at/Mozart/dice/#options (очень неплохой результат получается 1 1 если ввести, а если 7 8 мне уже не очень)
Only those users with full accounts are able to leave comments. Log in, please.