LINUX.ORG.RU

Прошу покритиковать моё приложение

 ,


0

2

Это мой первый опыт использования C++ и Qt, так что кто может, покритикуйте.

Репозиторий

Эта программа — графическая запускалка для другой моей программы w2midi. Она распознает ноты в звуковом сигнале и преобразует его в MIDI.

w2midi_qt взаимодействует с w2midi с помощью CLI.

Заранее спасибо!

Ответ на: комментарий от aiqu6Ait

комменты на русском не нужны

Русские комменты это нормально.

ox55ff ★★★★★
()

раз тут принято докапываться к кодестилю :

если коменты только про копирайт, то ну их в топку вообще. Пониманию нетленки они не способствуют.

а вот прочие коментарии обязательно надо писать. Так чтобы спустя год и с похмелья можно было понять где чего.

язык коментов = язык основного разработчика. Себя любимого. С вероятностью 99.99% проект кроме тебя и близкого круга общения никому не нужен.

длинные простынки как у вас App::App разбивать если не на функции то хотя-бы на различимые по назначениям блоки. С GUI вообще удобно : 1) предварительные настройки 2) видимые юзеру виджеты 3) органайзеры,vbox,hbox etc 4) раскладка виджетов 5) сигналы/слоты/биндинги ; но это само-собой сформируется, когда пару раз поменяете внешний вид

а больше критиковать и нечего. Проект небольшой и наверное работает (а главное мерило это работает/нет).

MKuznetsov ★★★★★
()

cli.cpp
W2MidiCli::W2MidiCli(QObject *parent) :

Где вызов конструктора родителя (QObject)?

setParent(parent);

Это произойдёт в конструкторе, который ты забыл вызвать.

void W2MidiCli::setClientName(QString name)

const QString& name

ox55ff ★★★★★
()

cli.cpp
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(processFinished(int, QProcess::ExitStatus)));

Использовал старый стиль соединения, потому что новый не компилировался? 😏 А ведь в документации есть разъяснение как сделать, чтобы работало.

connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
    [=](int exitCode, QProcess::ExitStatus exitStatus){ /* ... */ });

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

Нет, просто старый стиль использовал, сделаб в новом, спасибо!

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

А где я вообще говорил о каких-то своих заслугах? Я говорил, что начиная с Qt4, работа с большим диапазоном версий это вполне реально.

Нет, больные вопросы есть, конечно (QtWebkit - QtWebEngine, например). Но я очень сомневаюсь, что тот же FLTK в такие области вообще залазит.

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

Но получилось короче с новым вариантом, потому что я переиспользую getProcessState

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

А обязательно прям все размеры в png устанавилвать?

Вроде нет.

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

Да сам фреймворк жирноват. Qt это не совсем про окошки фреймворк. Это и про строки и про сеть и про много чего ещё.

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

Ну и что? Тебе религия запрещает использовать то что больше 100Mb? Все равно библиотеки, от которых будет зависеть твое приложение, суммарно будут весить в зависимости от того, какие именно из них ты используешь.

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

Потому что STL даже с BOOST-ом вместе не могут во всё то, во что может Qt фреймворк.

Хахаха. Boost.Spirit мой тебе ответ. Такого чуда в Qt нету :-)

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

FLTK

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

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

Нифига подобного: 21 мебибайт неразделенной памяти! А разделенной 230 мибибайт.

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

Слушай бро, ты наверное спец по звуку? Подскажи пожалуйста, какие есть продвинутые способы для распознавания речи, которая записана с плохим качеством и на заднем фоне?

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

Частота распознаеься с помощью преобразования Фурье, а нота равняется 12*log2 Частота/Опорная частота. Опорная частота берется по вкусу, я беру 440 герц, нота ля первой октавы

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

Я не спец, я восьмиклассник, которому стало интересно как устроен гармонический ряд нот и преобразование Фурье.

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

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

12*log2 берется из такого интересного свойства: если увеличить звук НА 12 полутонов, то частота увеличится В два раза. Получается чтобы получить значение во сколько раз увеличится частота, надо возвести корень двенадцатой степени из двух в номер полутона. А мне нужна обратная операция.

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

Ты уверен? Я читал где то что нота это просто диапазон частот, которая идет от опорного значения /2

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

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

Вообще, я не теоретик, немного играю на гитаре, нот даже не знаю, но я заметил что качество звука от нот очень слабо зависит. Это от манеры звукоизвлечения зависит. Если бьешь по струнам резко и четко, почти любой негармоничный аккорд можно заставить звучать прилично. От скорости и мощности гармония очень сильно зависит. Хз почему так. Любой дворовый гитарист который промахивается по струнам по пьяни, но молотит от души, звучит хорошо:)

no2700
()

Прошу покритиковать моё приложение

Все говно, но ты старайсо :)

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

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

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

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

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

Да, это вы меняете обертона и тембр меняется

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

Вообще, я не теоретик, немного играю на гитаре,..

это обогащение гармониками. чистая синусоида звучит скучно и противно, да и вообще редко встречается в природе.

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

Нет, о чистой синусоиде тут в любом случае речи нет. Берешь например аккорд и бьешь вяло или чешешь, и берешь тот же аккорд и бьешь резко и отрывисто, звук становится намного лучше просто волшебный. Это как раз причина по которой советуют бить по струнам не сверзу вниз, а горизонтально, типа «восьмеркой».

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

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

О свойствах звука музыкальных инструментов можно говорить вечно!

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

С QString читабельнее код, чем с auto. В этом зло auto и вообще автовывода. Код превращается в какой-то php - хрен пойми что на входе, хрен пойми что на выходе, но что-то делается. А рефакторить конечно удобно, это не отнять

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

Как раз читабельнее с auto. Потому что запись становится короче (особенно когда из функции возвращается что-то вроде std::unordered_multimap<std::string, std::tuple<int, long, float, double>>). Читабельность зависит не столько от того, что ты видишь сразу тип, а от того, что ты видишь сразу назначение, т.е. от хорошего имени переменной. Разумеется все ИМХО.

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

Ну тут уже идет вопрос стиля. Либо ты везде используешь auto (кроме случаев, когда вывод типа с auto оказывается нет тот, который ты хочешь) либо везде явно указанные типы. А то если одновременно и auto и явные типы, то это какой-то винегрет.

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

std::unordered_multimap<std::string, std::tuple<int, long, float, double>>

а вот переименовать эту длинную техническую бурду в прекрасное MapOfShit, через typedef или using, некошерно что-ли?

alysnix ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.