Комментарии 8
И зачем все исходники пихать в статью? И ещё такой может для Вас странный вопрос: каким образом Вы собрались создавать экспрессию и динамику с помощью нажатия на кнопку клавиатуры или мыши, если в них нет и не может быть никакой динамики, они либо нажаты, либо нет?
Добро пожаловать в официальный репозиторий Piano
Человек перепутал хабр с гитхабом. Бывает. Бывает же?..
Вы оцениваете инструмент исключительно по силе нажатия (громкости), но забываете про главный элемент музыкальной экспрессии — Агогику (Tempo Rubato) и управление длительностью (Gate Time)!
Да, кнопка мыши имеет дискретное состояние (нажата/отпущена), но живой человек управляет динамикой пауз, растягиванием времени (фермато), ускорением и замедлением ритма (акселерандо и ритардандо).
Программа полностью берёт на себя математическую точность частоты звука (герцы), гарантируя, что инструмент не сфальшивит. Но длительность каждой ноты и момент её извлечения определяет палец человека. Удерживая клавишу дольше или делая микропаузы между шагами, вы создаёте уникальный, дышащий, эмоциональный рисунок произведения, который невозможно заложить в жесткий автоматический MIDI-файл.
Это не игра по клавишам, это интерактивное дирижирование временем!
Да, кнопка мыши имеет дискретное состояние (нажата/отпущена), но живой человек управляет динамикой пауз, растягиванием времени (фермато), ускорением и замедлением ритма (акселерандо и ритардандо).
Говорить можно все, что угодно. Вот только Вы наверное не знаете, что у всех производителей клавишных инструментов типа синтезаторов или MIDI-клавиатур дешевле всего котируются инструменты, у которых нет динамического нажатия на клавиши, а как у Вас, включено-выключено. там тоже палец человека определяет включить-выключить. Вот только такие инструментами ни одним более-менее серьезным музыкантом не используются и абсолютно не подходят для обучения.
Вы оцениваете инструмент исключительно по силе нажатия (громкости), но забываете про главный элемент музыкальной экспрессии — Агогику (Tempo Rubato) и управление длительностью (Gate Time)!
Вы прочитали мои мысли по каким критериям я оцениваю? Я всего лишь сказал, что без динамики Ваш код не представляет ценности для практического использования. И без динамики заведомо не может быть никакой экспрессии. Я наслушался такой музыки еще в 90-е.
у всех производителей клавишных инструментов типа синтезаторов или MIDI-клавиатур дешевле всего котируются инструменты, у которых нет динамического нажатия на клавиши
Причем, реально оценивается скорость нажатия (velocity). Наверное, сейчас MIDI-клавиатур без такой функции уже и купить невозможно. А еще бывают клавиатуры с aftertouch. Который обычно используется не для "классического" исполнения на фортепиано, а для включения всяких дополнительных эффектов синтеза/обработки звука, насколько я знаю (если я ошибаюсь, поправьте меня).
Использование юникодных флагов в коде - явный признак того, что код писал человек. Не говоря уже об общей организации кода. /s
Тут ещё и написано всё на "голом" Windows API. ИМХО, удобнее было бы использовать какие-нибудь библиотеки вроде MFC и Visual Studio (бывают и бесплатные версии, если волнует вопрос с лицензией). Какой бы древней MFC ни была, она все-таки значительно сокращает количество кода при написании Windows-приложений с графическим интерфейсом. Вручную создавать окна и обрабатывать сообщения в WndProc - можно, но зачем? ;-)
Была компания Ntonyx, которая больше 20 лет разрабатывала программы для "очеловечивания" исполнения MIDI-композиций. Эти программы изменяют композиции, чтобы они при воспроизведении звучали так, как бы их играл живой музыкант (добавляют микро-ускорения/замедления, изменяет громкости нот и т.д.). В них вложено много труда и знаний людей с, в том числе, высшим музыкальным образованием (это не реклама, и я в ней не работал, просто знаю про них).
Даже их софт не всегда хорошо имитирует исполнение живым человеком, т.к. задача в самом деле непростая. А здесь, надо же - всего лишь нажимай кнопку в нужные моменты, и ты уже дирижёр! :-) И весь код программы всего в несколько экранов уместился (хоть бы под спойлер его убрали, если не хочется выкладывать куда-нибудь).
const float HZS[]
Вместо таблицы можно частоту нот рассчитать небольшой процедурой в начале программы. А то и прямо в коде считать в строке:
f_sub = HZS[baseIdx - 12]
Чуть выше же не боитесь использовать функцию возведения в степень powf, вряд ли на современных процессорах скорость её вычисления как-то повлияет на работу программы.

Piano — сделал 18 культовых мелодий. C++