LINUX.ORG.RU

IronTick 1.0: стабильный кроссплатформенный метроном

 , , ,

IronTick 1.0: стабильный кроссплатформенный метроном

0

1

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

Возможности и особенности:

  1. Высокая точность: стабильные щелчки, точное поддержание темпа.

  2. Поддержка различных размеров: основные размеры (2/4, 3/4, 4/4, 6/8), а также возможность задания любого другого размера.

  3. Визуализация: индикатор сильных и слабых долей.

  4. Управление темпом: изменение темпа, запуск и останов метронома возможен при помощи одной клавиатуры, без мыши.

Какие проблемы решает

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

Эта проблема в IronTick решена очень просто — он синтезирует непрерывный PCM поток аудиосемплов, в котором точно в нужные места вставлены звуки кликов. Этот поток воспроизводится непрерывно звуковой картой, как любой аудио поток, например песня в аудиоплеере. У вас же песня в плеере не заикается периодически, независимо от того какая программа на переднем плане, и какая нагрузка? Вот и метроном, работающий по такому принципу, щелкает так же стабильно как аудио плеер воспроизводит трек. Для этого ему не нужен неточный таймер.

Вторая проблема, уже менее важная — как правило, неудобно менять темп, не выпуская гитару из рук. Поэтому, в IronTick из коробки сделано клавиатурное управление одной клавишей (именно одной, не надо зажимать «аккорды») для основных функций. Так же, сделан настраиваемый шаг увеличения/уменьшения темпа. Я использую это так — начинаю отрабатывать пассаж с медленного темпа, например 120 bpm, и периодически нажимаю клавишу J чтобы увеличить bpm на 5 единиц. Потом еще на 5, и так далее. Можно задать любой шаг. Нажать одну кнопку легко, не выпуская медиатор из рук.

Файлы

В рамках релиза подготовлен AppImage.

Программа написана на языке c++, лицензия – GPL 3.0 или более новая.

>>> Проект на GitHub

★★★★★

Проверено: dataman ()
Последнее исправление: hobbit (всего исправлений: 6)

Я решил разработать это приложение

Добавил тег от автора. :)

dataman ★★★★★
()

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

Подозреваю там проблема не только в таймере, а и в том что запуск проигрывания никем не гарантируется иметь детерминированную задежрку. Возможно даже вторая причина важнее. Таймеры то, хоть и не совсем точные, но приемлемую для подобного использования точность по-моему всё-таки могут иметь.

firkax ★★★★★
()

генерирует непрерывный аудиопоток с кликами

Отлично! Респект за реализацию этой идеи. Достали заикающиеся метрономы на таймерах

Alden ★★★★★
()
Ответ на: комментарий от firkax

Это для запуска без синхронизации с чем-либо. Если надо чтобы кликало синхронно с подкладом, то в любой DAW есть встроенный таймер который запускается синхронно. Но не всегда надо с тяжелой DAW заниматься, для этого отдельный простой метроном.

James_Holden ★★★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от firkax

но приемлемую для подобного использования точность по-моему всё-таки могут иметь

В идеальных условиях - да. Но если в фоне что-то работает, часто заикаются и пропускают клики.

James_Holden ★★★★★
() автор топика

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

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

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

James_Holden ★★★★★
() автор топика
Ответ на: комментарий от James_Holden

Ещё бы и имя исполняемого файла не в CamelCase. :)

dataman ★★★★★
()

Вообще не моя тема, никогда о таком не заботился, но крайне удивлён, что «просто выставить приоритет процесса по-больше» не решает проблему. Автор, в любом случае, молодец.

ugoday ★★★★★
()

часто не точно держат темп, пропускают клики

однако!

ist76 ★★★★★
()

Зачёт! Сразу захотелось ввода BPM вручную (по дабл-клику, например).

ЗЫ то есть, по даб-клику вводишь число, но если добавишь tap-to-tempo - воще круто будет

kott ★★★★★
()
Последнее исправление: kott (всего исправлений: 1)
     Push the Tempo
     Push the Tempo
     Push the Tempo
   Opmet eht-the tempo!
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от James_Holden

Это да. Но мне всегда не хватало метронома с разными тактами. Например 4/4 и следующий 5/4. Или три 7/4 и один 3/4. Да, для такого приходилось использовать секвенсоры. Но когда прорабатываешь партию или просто разминаешься, секвенсоры слишком. И ты сам сказал, они не точные.

PcheloBiaka
()
Ответ на: комментарий от PcheloBiaka

Я сначала хотел так и делать, чтобы был программируемый метроном, где задаешь последовательность темпов и размеров по тактам, но подумал что это оверкилл. Вообще, мысль такая витает. После Angine de Pointrine термин «оверкилл» требует пересмотра ))

James_Holden ★★★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)

Прекрасно. А он умеет работать со сложными группами ритмов вроде пунктирного?

И нет ли возможности ставить не из appimage/snap/flatpak, кроме исходников, конечно? А пропуск разных долей? А подцепить свой звук вместо стандартного?

zbarassky
()

А адресуется ли как-то пробелма большого буфера перед звуковым выводом? На некоторых системах реалтайм аудио работает с буфферизацией больше 10 мс, что вносит ощутимую задержку. И на разных устройствах вывода операционка может выставлять разные размеры буфера (например, задержка на колонках отличается от задержки в наушниках). Я знаю что в SDL есть возможность как-то запрашивать через какие-то апишки у операциоки более тонкий буфер, чтобы сделать задержку минимальной. А в Qt есть такое?

txgk
()
Ответ на: комментарий от txgk

А адресуется ли как-то пробелма большого буфера перед звуковым выводом?

Для данного приложения это не имеет значения, потому что он просто кликает сам по себе, без синхронизации с чем-либо. Главное, что соблюдаются интервалы времени между кликами, что не зависит от величины буфера.

А в Qt есть такое?

Начиная с Qt 6.10 есть функция QAudioSource::setBufferSize, которую надо вызывать перед QAudioSource::start. Но вопрос остается, как какая звуковая система в какой ОС на это отреагирует. Насколько я понимаю, четко и надежно это сделать кроссплатформенно пока нельзя. Можно было бы, например, добавить код для pipewire который настраивает любой нужный буфер, как это делают DAW. Потом такой же код для alsa, и так далее. Но это будут не-кроссплатформенные специфичные для звуковых систем функции.

James_Holden ★★★★★
() автор топика

Жаль под андроид нет - в мобильном варианте было бы удобнее. Не каждый попрёт c гитарой на пьянку с компом на репетицию :)

zabbal ★★★☆☆
()
Последнее исправление: zabbal (всего исправлений: 1)
Ответ на: комментарий от zbarassky

А он умеет работать со сложными группами ритмов вроде пунктирного?

Пока акцент на функции классического простого метронома, работу со сложными ритмами я не делал чтобы не усложнять его.

И нет ли возможности ставить не из appimage/snap/flatpak, кроме исходников, конечно?

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

А подцепить свой звук вместо стандартного?

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

А пропуск разных долей?

Вот тут интересный вопрос. Лично мне не особо надо, ну или я не осознаю, что это надо ))) Можно узнать юзкейсы, как это у вас используется - сложные ритмы и пропуски долей? Надо что, чтоб каждую ноту откликивал? Это для того чтобы риффы отрабатывать, или для чего?

James_Holden ★★★★★
() автор топика
Ответ на: комментарий от zabbal

Под андроид надо делать, да, жаль что кроссплатформенность туда не особо распространяется. Формально, есть Qt, но вот такое widgets приложение я не знаю как портанется. Может, кто сталкивался?

James_Holden ★★★★★
() автор топика
Ответ на: комментарий от zabbal

Жаль под андроид нет

На днях https://codeberg.org/thetwom/metronome обновился до 6.0.0:

  • New audio engine (less latency)
  • User defined sounds.
  • Built-in sine sounds.
  • Chinese translations.
  • Playback works now on devices with exotic sample rates.
  • Tap-in fixes.
dataman ★★★★★
()
Ответ на: комментарий от James_Holden

Можно узнать юзкейсы, как это у вас используется - сложные ритмы и пропуски долей?

Надо-надо.
Про сложные ритмы не скажу, это более высокий уровень, на нем работают, когда в простой ритм уже умеешь. А вот пропуск долей - очень полезное упражнение. Когда пропускаешь несколько кликов, и потом все равно попадаешь ровно куда нужно - это полезное. Тут бы, конечно, какой-нибудь инструмент контроля, что попал. Но для этого daw есть.

ist76 ★★★★★
()
Ответ на: комментарий от ugoday

крайне удивлён, что «просто выставить приоритет процесса по-больше» не решает проблему

@James_Holden, можешь это прокомментировать? Не пробовал такое с другими программами?

Автор, в любом случае, молодец.

Однозначно.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

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

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

James_Holden ★★★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от hobbit

Не

Living on a lighted stage approaches the unreal For those who think and feel In touch with some reality Beyond the gilded cage

:)

PcheloBiaka
()

Крутая и ценная вещь) А что не Flatpak)?

REDDERa
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.