| 154 | } |
| 155 | |
| 156 | void ClientReverbApplet::buildUI() |
| 157 | { |
| 158 | setStyleSheet("QWidget { background: transparent; }"); |
| 159 | |
| 160 | auto* outer = new QVBoxLayout(this); |
| 161 | outer->setContentsMargins(4, 4, 4, 4); |
| 162 | outer->setSpacing(4); |
| 163 | |
| 164 | // Live visualisation — same algorithm as the strip's larger |
| 165 | // GridBox. Sits above the knob row so the user sees the dry |
| 166 | // packet, reflections, and tail update as knobs move. |
| 167 | auto* viz = new ReverbVizBox; |
| 168 | m_viz = viz; |
| 169 | outer->addWidget(viz); |
| 170 | |
| 171 | auto* row = new QHBoxLayout; |
| 172 | row->setSpacing(4); |
| 173 | row->addStretch(); |
| 174 | |
| 175 | auto makeKnob = [](const QString& label) { |
| 176 | auto* k = new ClientCompKnob; |
| 177 | k->setLabel(label); |
| 178 | k->setCenterLabelMode(true); |
| 179 | k->setInlineEditEnabled(false); |
| 180 | k->setFixedSize(38, 48); |
| 181 | return k; |
| 182 | }; |
| 183 | |
| 184 | m_size = makeKnob("Size"); |
| 185 | m_size->setRange(0.0f, 1.0f); |
| 186 | m_size->setDefault(0.5f); |
| 187 | m_size->setValueFromNorm([](float n) { return n; }); |
| 188 | m_size->setNormFromValue([](float v) { return v; }); |
| 189 | m_size->setLabelFormat([](float v) { |
| 190 | return QString::number(static_cast<int>(v * 100.0f + 0.5f)) + " %"; |
| 191 | }); |
| 192 | row->addWidget(m_size); |
| 193 | |
| 194 | m_decay = makeKnob("Decay"); |
| 195 | m_decay->setRange(0.3f, 5.0f); |
| 196 | m_decay->setDefault(1.2f); |
| 197 | m_decay->setValueFromNorm([](float n) { |
| 198 | // Exponential 0.3 → 5.0 (~16.7x) |
| 199 | return 0.3f * std::pow(5.0f / 0.3f, n); |
| 200 | }); |
| 201 | m_decay->setNormFromValue([](float v) { |
| 202 | if (v <= 0.3f) return 0.0f; |
| 203 | return std::log(v / 0.3f) / std::log(5.0f / 0.3f); |
| 204 | }); |
| 205 | m_decay->setLabelFormat([](float v) { |
| 206 | return QString::number(v, 'f', 2) + " s"; |
| 207 | }); |
| 208 | row->addWidget(m_decay); |
| 209 | |
| 210 | m_damping = makeKnob("Damp"); |
| 211 | m_damping->setRange(0.0f, 1.0f); |
| 212 | m_damping->setDefault(0.5f); |
| 213 | m_damping->setValueFromNorm([](float n) { return n; }); |
nothing calls this directly
no test coverage detected