не программист, французским не владею. буду писать своими словами как я это понял сам.
уже наверное месяц черепашьим темпом двигается проект специального конвертера музыки для игры Dune: The Battle For Arrakis. и занимаюсь всякой фигней для этого конвертера, вместо самой главной функции - то есть самой конвертацией. куча кода, куча глюков, половина ничего толком не работает
а количество идей, что хотелось бы туда впихнуть не убавляется...
вот среди всей этой ненужности возникла проблема с миди. точнее тут два нюанса и их хотелось бы обсудить. поэтому был бы рад видеть в этой теме тех, кто более менее разбирается в миди файлах и сможет проконсультировать.
1. как известно миди состоит из тиков. а мне нужно расчитать паузу Delay для правильной скорости проигрывания. пока отбросим плавающий темп, предположим что темп константа. сама Delay, в моем случае - в миллисекундах. то есть 1 секунда = Delay(1000)
в миди есть параметр "разрешение", аналогично как в 1 сантиметре есть 10 миллиметров, только в нашем случае миди сообщает о том, сколько мидишных тиков входит в 1/4 ноту (тики это типа миллиметры, 1/4 нота - сантиметр)
так-же в миди есть параметр Delta - хотя в названии я не уверен... так вот это значение в микросекундах (не миллисекундах!!!) длительность времени, сколько должна звучать 1/4 нота.
зная эти данные нам нужно вычислить количество тиков в 1 секунду, и в соответствии с этим произвести расчет Delay в программе:
Delay = 1000 / ( 100 * ( Delta / (Resolution / 10000) ) )
1000 - это моя 1 секунда в миллисекундах для делея
10000 - это 1% от 1 000 000 - количества микросекунд в секунде
Resolution / 10000 - получение количества процентов времени звучания этой 1/4 ноты от 1 секунды
Delta / (Resolution / 10000) - получение значение 1% в... сам забыл в чем... тиках видимо. типа сколько миди тиков в 1%
100 * на 1% тиков - получение числа сколько тиков должно играть в 1 секунде
и наконец 1000 / разделить на это число тиков в секунде - получим значение паузы Delay сколько должно быть между тиками при проигрывании миди.
насколько эта формула точна? сейчас в данный момент спрашиваю у очень умного буржуя, но что-то он молчит в чате... или отошел, или несколько завис
неизвестно ответит ли... однако мне хотелось бы уточнить правильность этой формулы.
2. момент номер два. проблема в том, что минимальное значение паузы может быть Delay(1), следовательно если по предыдущей формуле я получил значение типа 0.45 - то точно играть не будет. точнее оно вообще по определению точно играть не будет, так как пауза может содержать только целые числа - но тем не менее с 0.45 это полный капец. то есть Delay(1) это очень много и грубо - песня будет звучать значительно дольше, чем в оригинале. я тогда подумал, что в данном случае можно попытаться пожать массив тиков, что предварительно прочитал из мидишки. типа массив имел 25 ячеек. 1 ячейка - единица времени.
0 0 0 0 0 0 0 4 0 0 0 2 0 0 0 1 0 0 0 0 0 5 0 2 0
и я хочу его пожать скажем кратно 5 и использовать первое попавшееся значение в этой пятерке. в итоге получается что-то типа такого:
0 4 2 1 5 (нота 5 в последней пятерке встретилась раньше ноты 2, и следовательно сожрала её)
в результате музыка конечно потеряет мелкие ноты, будет небольшое сбитие темпа местами, но по идее рассинхрона не будет (который скатина был, в первой версии проекта). хотелось бы надеяться что этот шаг кратности - 5 будет довольно мелким, чтобы серьезно повлиять на звучание песни.
однако это лишь мое мнение, и оно по определению не верное из-за моей малограмотности в данном вопросе
посему будут ли у кого какие идеи, как можно было бы выкрутится из данной закавыки в виде слишком грубого минимального значения делей?
однако в пользу этой моей теории пожатия должно сказаться само конвертирование - а именно игра может проиграть минимальную ноту как 1/24 - то есть 1/32 или 1/64 проиграть не выйдет (только если темп увеличивать, но это уже другая история) - так что выходит все равно нужно будет пожатие массива, а следовательно будут небольшие огрехи в звучании. (ишак нюхал этих производителей с их нестандартным 1/24 решением. могли бы уж 1/32 что-ли запилить, чтоб как у людей)
п.с.: хотелось бы надеяться, что эту свою телегу я все-таки доведу хоть до какой-то степени ездовости.
*********************
26.08.2015
примерное представление о наборе функций
а тут во вложении можно даже уже какие-то функции потестировать
пока правда они все из "проигрывательной" части... до самого конвертирования пока не дошло. чтоб проигрывало верно - следует всегда выставлять барабаны на 6 дорожку. пока еще не решил что с этими барабанами делать... плюс еще мидишки могут быть разные. мне попадалась такая, где барабаны были записаны на различных дорожках... кароче нюансов еще тонна целая. все надо предусмотреть. темп для миди и для предварительного озвучивания вроде бы верный, как на самой мидишке, а вот темп при проигрывании code файла ( треки 000, 001, 002 и так далее в папке со сборщиком Дюны у Ti_ ) - не верный, плюс еще само звучание не совсем корректное. так-же нет поддержки громкости инструментов, в результате музыка звучит мягко говоря совершенно другая
до кучи еще нет поддержки зацикливания проигрывания некоторых дорожек в этих треках... все потом как-нибудь.
и еще чуть чуть подправил.