diff --git a/README.md b/README.md index d0f9c31..e94f1cd 100644 --- a/README.md +++ b/README.md @@ -14,24 +14,24 @@ The optical stage provides smooth, program-dependent compression with a natural ## Download -**[Latest Release: v1.0](https://github.com/hariel1985/InstaShadow/releases/tag/v1.0)** +**[Latest Release: v1.1](https://github.com/hariel1985/InstaShadow/releases/tag/v1.1)** ### Windows | File | Description | |------|-------------| -| [InstaShadow-VST3-Win64.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.0/InstaShadow-VST3-Win64.zip) | VST3 plugin — copy to `C:\Program Files\Common Files\VST3\` | +| [InstaShadow-VST3-Win64.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.1/InstaShadow-VST3-Win64.zip) | VST3 plugin — copy to `C:\Program Files\Common Files\VST3\` | ### macOS (Universal Binary: Apple Silicon + Intel) | File | Description | |------|-------------| -| [InstaShadow-VST3-macOS.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.0/InstaShadow-VST3-macOS.zip) | VST3 plugin — copy to `~/Library/Audio/Plug-Ins/VST3/` | -| [InstaShadow-AU-macOS.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.0/InstaShadow-AU-macOS.zip) | Audio Unit — copy to `~/Library/Audio/Plug-Ins/Components/` | +| [InstaShadow-VST3-macOS.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.1/InstaShadow-VST3-macOS.zip) | VST3 plugin — copy to `~/Library/Audio/Plug-Ins/VST3/` | +| [InstaShadow-AU-macOS.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.1/InstaShadow-AU-macOS.zip) | Audio Unit — copy to `~/Library/Audio/Plug-Ins/Components/` | ### Linux (x64, built on Ubuntu 22.04) | File | Description | |------|-------------| -| [InstaShadow-VST3-Linux-x64.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.0/InstaShadow-VST3-Linux-x64.zip) | VST3 plugin — copy to `~/.vst3/` | -| [InstaShadow-LV2-Linux-x64.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.0/InstaShadow-LV2-Linux-x64.zip) | LV2 plugin — copy to `~/.lv2/` | +| [InstaShadow-VST3-Linux-x64.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.1/InstaShadow-VST3-Linux-x64.zip) | VST3 plugin — copy to `~/.vst3/` | +| [InstaShadow-LV2-Linux-x64.zip](https://github.com/hariel1985/InstaShadow/releases/download/v1.1/InstaShadow-LV2-Linux-x64.zip) | LV2 plugin — copy to `~/.lv2/` | > **macOS note:** Builds are Universal Binary (Apple Silicon + Intel). Not code-signed — after copying the plugin, remove the quarantine flag in Terminal: > ```bash diff --git a/Source/NeedleVuMeter.h b/Source/NeedleVuMeter.h index 1b7b4a3..22652bf 100644 --- a/Source/NeedleVuMeter.h +++ b/Source/NeedleVuMeter.h @@ -64,19 +64,49 @@ public: // Always use VU scale — in GR mode the needle just starts at 0 and goes left drawVuScale (g, cx, cy, radius, startAngle, endAngle); - // Needle + // Needle with leaf-shaped arrowhead { float angle = startAngle + needlePos * (endAngle - startAngle); float cosA = std::cos (angle); float sinA = std::sin (angle); - g.setColour (juce::Colours::black.withAlpha (0.3f)); - g.drawLine (cx + 1, cy + 1, - cx + cosA * radius * 0.88f + 1, cy + sinA * radius * 0.88f + 1, 2.0f); + float tipX = cx + cosA * radius * 0.88f; + float tipY = cy + sinA * radius * 0.88f; + // Needle shadow + g.setColour (juce::Colours::black.withAlpha (0.25f)); + g.drawLine (cx + 1, cy + 1, tipX + 1, tipY + 1, 1.5f); + + // Needle shaft (thin line from pivot to base of arrowhead) + float shaftEnd = radius * 0.65f; + float shaftX = cx + cosA * shaftEnd; + float shaftY = cy + sinA * shaftEnd; g.setColour (juce::Colour (0xff222222)); - g.drawLine (cx, cy, cx + cosA * radius * 0.88f, cy + sinA * radius * 0.88f, 1.5f); + g.drawLine (cx, cy, shaftX, shaftY, 1.2f); + // Leaf-shaped arrowhead (elongated diamond from shaft end to tip) + float leafW = radius * 0.035f; // half-width of leaf + float perpX = -sinA; // perpendicular to needle direction + float perpY = cosA; + + juce::Path leaf; + leaf.startNewSubPath (shaftX, shaftY); // base (narrow) + leaf.lineTo (cx + cosA * radius * 0.76f + perpX * leafW, + cy + sinA * radius * 0.76f + perpY * leafW); // left bulge + leaf.lineTo (tipX, tipY); // tip (narrow) + leaf.lineTo (cx + cosA * radius * 0.76f - perpX * leafW, + cy + sinA * radius * 0.76f - perpY * leafW); // right bulge + leaf.closeSubPath(); + + // Shadow + g.setColour (juce::Colours::black.withAlpha (0.2f)); + g.fillPath (leaf, juce::AffineTransform::translation (0.5f, 0.5f)); + + // Fill + g.setColour (juce::Colour (0xff111111)); + g.fillPath (leaf); + + // Pivot dot g.setColour (juce::Colour (0xff333333)); g.fillEllipse (cx - 3, cy - 3, 6, 6); } @@ -99,8 +129,10 @@ private: void applyNeedlePhysics (float target) { - constexpr float spring = 0.35f; - constexpr float damping = 0.55f; + // VU mode: heavier needle, more damping (lazy, smooth movement) + // GR mode: lighter needle, less damping (responsive to compression changes) + float spring = (mode == VU) ? 0.12f : 0.35f; + float damping = (mode == VU) ? 0.70f : 0.55f; float force = spring * (target - needlePos); needleVelocity = needleVelocity * (1.0f - damping) + force;