diff --git a/simulator/main.cpp b/simulator/main.cpp index c5ae767..ad3248b 100644 --- a/simulator/main.cpp +++ b/simulator/main.cpp @@ -1115,6 +1115,20 @@ int main(int argc, char* argv[]) { engine.setVolume(knob_vol_val); engine.setGate(false); // Start with silence + + // Define shortcuts for quick placement + const std::vector> shortcuts = { + {SDL_SCANCODE_1, SynthEngine::GridCell::WIRE}, + {SDL_SCANCODE_2, SynthEngine::GridCell::FIXED_OSCILLATOR}, + {SDL_SCANCODE_3, SynthEngine::GridCell::INPUT_OSCILLATOR}, + {SDL_SCANCODE_4, SynthEngine::GridCell::GATE_INPUT}, + {SDL_SCANCODE_5, SynthEngine::GridCell::ADSR_ATTACK}, + {SDL_SCANCODE_6, SynthEngine::GridCell::VCA}, + {SDL_SCANCODE_7, SynthEngine::GridCell::LPF}, + {SDL_SCANCODE_8, SynthEngine::GridCell::DELAY}, + {SDL_SCANCODE_9, SynthEngine::GridCell::REVERB}, + {SDL_SCANCODE_0, SynthEngine::GridCell::EMPTY} + }; // --- Main Loop --- const SynthEngine::GridCell::Type cellTypes[] = { @@ -1397,6 +1411,29 @@ int main(int argc, char* argv[]) { } } } + + // Shortcuts for grid placement + for (const auto& shortcut : shortcuts) { + if (e.key.keysym.scancode == shortcut.first) { + int mx, my; + SDL_GetMouseState(&mx, &my); + if (mx < GRID_PANEL_WIDTH) { + int gx = mx / CELL_SIZE; + int gy = my / CELL_SIZE; + if (gx >= 0 && gx < SynthEngine::GRID_W && gy >= 0 && gy < SynthEngine::GRID_H) { + SynthLockGuard lock(engine.gridMutex); + if (engine.grid[gx][gy].type != SynthEngine::GridCell::SINK) { + engine.grid[gx][gy].type = shortcut.second; + engine.grid[gx][gy].param = 16384; + engine.grid[gx][gy].rotation = 0; + engine.grid[gx][gy].value = 0; + engine.grid[gx][gy].phase = 0; + } + } + engine.rebuildProcessingOrder(); + } + } + } } } else if (e.type == SDL_MOUSEBUTTONUP) { if (exportButtonPressed) { @@ -1604,8 +1641,27 @@ int main(int argc, char* argv[]) { // Buffer Preview drawString(renderer, 50, 560, 12, "BUFFER"); drawGridCell(renderer, 50, 580, CELL_SIZE, clipboardCell); - drawString(renderer, 50, 580 + CELL_SIZE + 10, 12, "C-COPY"); - drawString(renderer, 50, 580 + CELL_SIZE + 30, 12, "V-PASTE"); + drawString(renderer, 120, 590, 12, "C-COPY"); + drawString(renderer, 120, 610, 12, "V-PASTE"); + + // Shortcuts Hint + int sx = 50; + int sy = 660; + int sSize = 45; + for (const auto& shortcut : shortcuts) { + SynthEngine::GridCell dummy; + dummy.type = shortcut.second; + dummy.param = 16384; + dummy.rotation = 0; + dummy.value = 0; + dummy.phase = 0; + drawGridCell(renderer, sx, sy, sSize, dummy); + char keyName[2] = {0, 0}; + if (shortcut.first == SDL_SCANCODE_0) keyName[0] = '0'; + else keyName[0] = '1' + (shortcut.first - SDL_SCANCODE_1); + drawString(renderer, sx + 10, sy - 15, 12, keyName); + sx += sSize + 10; + } drawButton(renderer, 270, 535, 80, 30, "SAVE", saveButtonPressed); drawButton(renderer, 450, 535, 80, 30, "LOAD", loadButtonPressed);