pull/332/head
James H Ball 2025-09-20 18:32:46 +01:00
commit a32634424c
12 zmienionych plików z 68 dodań i 42 usunięć

Wyświetl plik

@ -137,10 +137,14 @@ jobs:
if: matrix.os == 'macos-latest' if: matrix.os == 'macos-latest'
run: spctl -a -vvv -t install "bin/${{ matrix.project }}-${{ matrix.version }}.pkg" run: spctl -a -vvv -t install "bin/${{ matrix.project }}-${{ matrix.version }}.pkg"
- name: List files
run: Get-ChildItem -Recurse ${{ github.workspace }}
shell: pwsh
# Windows packaging (Inno Setup) # Windows packaging (Inno Setup)
- name: Compile .ISS to .EXE Installer - name: Compile .ISS to .EXE Installer
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
uses: Minionguyjpro/Inno-Setup-Action@v1.2.2 uses: Minionguyjpro/Inno-Setup-Action@v1.2.7
with: with:
path: "packaging/${{ matrix.project }}.iss" path: "packaging/${{ matrix.project }}.iss"

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 222 B

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 222 B

Wyświetl plik

@ -143,6 +143,36 @@ void EffectsComponent::resized() {
} }
void EffectsComponent::changeListenerCallback(juce::ChangeBroadcaster* source) { void EffectsComponent::changeListenerCallback(juce::ChangeBroadcaster* source) {
// Recompute whether any effects are currently selected in the new project
bool anySelected = false;
{
juce::SpinLock::ScopedLockType lock(audioProcessor.effectsLock);
for (const auto& eff : audioProcessor.toggleableEffects) {
const bool isSelected = (eff->selected == nullptr) ? true : eff->selected->getBoolValue();
if (isSelected) { anySelected = true; break; }
}
}
// Show the grid only when there are no selected effects in the project
showingGrid = ! anySelected;
if (showingGrid) {
grid.setVisible(true);
listBox.setVisible(false);
} else {
grid.setVisible(false);
listBox.setVisible(true);
}
// Always refresh disabled states so opened projects immediately reflect which
// effects are already in use, and so the Cancel button visibility is correct.
grid.refreshDisabledStates();
// Refresh list contents to reflect newly loaded project data
itemData.resetData(); itemData.resetData();
listBox.updateContent(); listBox.updateContent();
// Ensure layout updates after visibility changes
resized();
repaint();
} }

Wyświetl plik

@ -12,7 +12,7 @@
#include "audio/BitCrushEffect.h" #include "audio/BitCrushEffect.h"
#include "audio/BulgeEffect.h" #include "audio/BulgeEffect.h"
#include "audio/TwistEffect.h" #include "audio/TwistEffect.h"
#include "audio/PolygonBitCrushEffect.h" #include "audio/PolygonizerEffect.h"
#include "audio/SpiralBitCrushEffect.h" #include "audio/SpiralBitCrushEffect.h"
#include "audio/DistortEffect.h" #include "audio/DistortEffect.h"
#include "audio/UnfoldEffect.h" #include "audio/UnfoldEffect.h"
@ -63,7 +63,7 @@ OscirenderAudioProcessor::OscirenderAudioProcessor() : CommonAudioProcessor(Buse
toggleableEffects.push_back(BounceEffect().build()); toggleableEffects.push_back(BounceEffect().build());
toggleableEffects.push_back(TwistEffect().build()); toggleableEffects.push_back(TwistEffect().build());
toggleableEffects.push_back(SkewEffect().build()); toggleableEffects.push_back(SkewEffect().build());
toggleableEffects.push_back(PolygonBitCrushEffect().build()); toggleableEffects.push_back(PolygonizerEffect().build());
toggleableEffects.push_back(KaleidoscopeEffect(*this).build()); toggleableEffects.push_back(KaleidoscopeEffect(*this).build());
toggleableEffects.push_back(VortexEffect().build()); toggleableEffects.push_back(VortexEffect().build());
toggleableEffects.push_back(GodRayEffect().build()); toggleableEffects.push_back(GodRayEffect().build());

Wyświetl plik

@ -64,14 +64,16 @@ public:
std::shared_ptr<osci::Effect> frequencyEffect = std::make_shared<osci::SimpleEffect>( std::shared_ptr<osci::Effect> frequencyEffect = std::make_shared<osci::SimpleEffect>(
[this](int index, osci::Point input, const std::vector<std::atomic<float>>& values, float sampleRate) { [this](int index, osci::Point input, const std::vector<std::atomic<float>>& values, float sampleRate) {
// TODO: Root cause why the epsilon is needed. This prevents a weird bug on mac. // TODO: Root cause why the epsilon is needed. This prevents a weird bug on mac.
frequency = values[0].load() + 0.00001; frequency = values[0].load() + 0.000001;
return input; return input;
}, },
new osci::EffectParameter( new osci::EffectParameter(
"Frequency", "Frequency",
"Controls how many times per second the image is drawn, thereby controlling the pitch of the sound. Lower frequencies result in more-accurately drawn images, but more flickering, and vice versa.", "Controls how many times per second the image is drawn, thereby controlling the pitch of the sound. Lower frequencies result in more-accurately drawn images, but more flickering, and vice versa.",
"frequency", "frequency",
VERSION_HINT, 220.0, 0.0, 4200.0)); VERSION_HINT, 220.0, 0.0, 4200.0
)
);
std::shared_ptr<DelayEffect> delayEffect = std::make_shared<DelayEffect>(); std::shared_ptr<DelayEffect> delayEffect = std::make_shared<DelayEffect>();

Wyświetl plik

@ -3,7 +3,7 @@
#include "../MathUtil.h" #include "../MathUtil.h"
// Inspired by xenontesla122 // Inspired by xenontesla122
class PolygonBitCrushEffect : public osci::EffectApplication { class PolygonizerEffect : public osci::EffectApplication {
public: public:
osci::Point apply(int index, osci::Point input, osci::Point externalInput, const std::vector<std::atomic<float>>&values, float sampleRate) override { osci::Point apply(int index, osci::Point input, osci::Point externalInput, const std::vector<std::atomic<float>>&values, float sampleRate) override {
const double pi = juce::MathConstants<double>::pi; const double pi = juce::MathConstants<double>::pi;
@ -40,23 +40,23 @@ public:
std::shared_ptr<osci::Effect> build() const override { std::shared_ptr<osci::Effect> build() const override {
auto eff = std::make_shared<osci::SimpleEffect>( auto eff = std::make_shared<osci::SimpleEffect>(
std::make_shared<PolygonBitCrushEffect>(), std::make_shared<PolygonizerEffect>(),
std::vector<osci::EffectParameter*>{ std::vector<osci::EffectParameter*>{
new osci::EffectParameter("Polygon Bit Crush", new osci::EffectParameter("Polygonizer",
"Constrains points to a polygon pattern.", "Constrains points to a polygon pattern.",
"polygonBitCrush", VERSION_HINT, 1.0, 0.0, 1.0), "polygonizer", VERSION_HINT, 1.0, 0.0, 1.0),
new osci::EffectParameter("Sides", "Controls the number of sides of the polygon pattern.", new osci::EffectParameter("Sides", "Controls the number of sides of the polygon pattern.",
"polygonBitCrushSides", VERSION_HINT, 5.0, 3.0, 8.0), "polygonizerSides", VERSION_HINT, 5.0, 3.0, 8.0),
new osci::EffectParameter("Stripe Size", new osci::EffectParameter("Stripe Size",
"Controls the spacing between the stripes of the polygon pattern.", "Controls the spacing between the stripes of the polygon pattern.",
"polygonBCStripeSize", VERSION_HINT, 0.5, 0.0, 1.0), "polygonizerStripeSize", VERSION_HINT, 0.5, 0.0, 1.0),
new osci::EffectParameter("Rotation", "Rotates the polygon pattern.", new osci::EffectParameter("Rotation", "Rotates the polygon pattern.",
"polygonBCRotation", VERSION_HINT, 0.0, 0.0, 1.0, 0.0001, osci::LfoType::Sawtooth, 0.1), "polygonizerRotation", VERSION_HINT, 0.0, 0.0, 1.0, 0.0001, osci::LfoType::Sawtooth, 0.1),
new osci::EffectParameter("Stripe Phase", "Offsets the stripes of the polygon pattern.", new osci::EffectParameter("Stripe Phase", "Offsets the stripes of the polygon pattern.",
"polygonBCStripePhase", VERSION_HINT, 0.0, 0.0, 1.0, 0.0001, osci::LfoType::Sawtooth, 2.0) "polygonizerStripePhase", VERSION_HINT, 0.0, 0.0, 1.0, 0.0001, osci::LfoType::Sawtooth, 2.0)
} }
); );
eff->setIcon(BinaryData::polygon_bitcrush_svg); eff->setIcon(BinaryData::polygonizer_svg);
return eff; return eff;
} }
}; };

Wyświetl plik

@ -276,8 +276,9 @@ void DraggableListBox::itemDropped(const SourceDetails& details)
} }
} }
if (fromIndex >= 0 && insertIndex >= 0) if (fromIndex >= 0 && insertIndex >= 0) {
m->moveByInsertIndex(fromIndex, insertIndex); m->moveByInsertIndex(fromIndex, insertIndex);
}
} }
clearDropIndicator(); clearDropIndicator();

Wyświetl plik

@ -107,28 +107,15 @@ public:
{ {
const int count = modelData.getNumItems(); const int count = modelData.getNumItems();
if (count <= 0) return; if (count <= 0) return;
insertIndex = juce::jlimit(0, count, insertIndex); int toIndex = juce::jlimit(0, count, insertIndex);
// Dropping at the very end (after last item) should move the item to the end.
if (insertIndex == count)
{
if (fromIndex != count - 1 && count > 1)
modelData.moveAfter(fromIndex, count - 1);
// Nothing to do if already last.
listBox.updateContent();
return;
}
// No-op if user drops item back in place (before itself) or immediately after itself. // No-op if user drops item back in place (before itself) or immediately after itself.
if (insertIndex == fromIndex || insertIndex == fromIndex + 1) if (toIndex == fromIndex || toIndex == fromIndex + 1)
return; return;
int toIndex = insertIndex;
if (toIndex > fromIndex)
toIndex -= 1; // account for removal shifting indices when moving down
if (toIndex <= 0) if (toIndex <= 0)
modelData.moveBefore(fromIndex, 0); modelData.moveBefore(fromIndex, 0);
else if (toIndex >= count - 1) else if (toIndex >= count)
modelData.moveAfter(fromIndex, count - 1); // treat anything past last valid index as end modelData.moveAfter(fromIndex, count - 1); // treat anything past last valid index as end
else else
modelData.moveBefore(fromIndex, toIndex); modelData.moveBefore(fromIndex, toIndex);

Wyświetl plik

@ -40,8 +40,9 @@ void OsciMainMenuBarModel::resetMenuItems() {
"\n\n" "\n\n"
"A huge thank you to:\n" "A huge thank you to:\n"
"DJ_Level_3, for contributing several features to osci-render\n" "DJ_Level_3, for contributing several features to osci-render\n"
"Anthony Hall, for adding many new effects, and improving existing ones\n"
"BUS ERROR Collective, for providing the source code for the Hilligoss encoder\n" "BUS ERROR Collective, for providing the source code for the Hilligoss encoder\n"
"Jean Perbet (@jeanprbt) for the osci-render macOS icon\n" "TheDumbDude, for contributing several example Lua files\n"
"All the community, for suggesting features and reporting issues!", "All the community, for suggesting features and reporting issues!",
std::any_cast<int>(audioProcessor.getProperty("objectServerPort"))); std::any_cast<int>(audioProcessor.getProperty("objectServerPort")));
options.content.setOwned(about); options.content.setOwned(about);

Wyświetl plik

@ -166,7 +166,7 @@ public:
setWantsKeyboardFocus (false); setWantsKeyboardFocus (false);
auto content = new juce::Component(); auto content = new juce::Component();
setViewedComponent(content, false); setViewedComponent(content, true);
content->setWantsKeyboardFocus (false); content->setWantsKeyboardFocus (false);
// Enable scroll fades for list views by default // Enable scroll fades for list views by default
@ -1076,3 +1076,4 @@ juce::MouseCursor VListBoxModel::getMouseCursorForRow (int)
{ {
return juce::MouseCursor::NormalCursor; return juce::MouseCursor::NormalCursor;
} }

Wyświetl plik

@ -4,7 +4,7 @@
addUsingNamespaceToJuceHeader="0" jucerFormatVersion="1" pluginCharacteristicsValue="pluginWantsMidiIn" addUsingNamespaceToJuceHeader="0" jucerFormatVersion="1" pluginCharacteristicsValue="pluginWantsMidiIn"
pluginManufacturer="jameshball" aaxIdentifier="sh.ball.oscirender" pluginManufacturer="jameshball" aaxIdentifier="sh.ball.oscirender"
cppLanguageStandard="20" projectLineFeed="&#10;" headerPath="./include" cppLanguageStandard="20" projectLineFeed="&#10;" headerPath="./include"
version="2.6.2.0" companyName="James H Ball" companyWebsite="https://osci-render.com" version="2.6.2.2" companyName="James H Ball" companyWebsite="https://osci-render.com"
companyEmail="james@ball.sh" defines="NOMINMAX=1&#10;INTERNET_FLAG_NO_AUTO_REDIRECT=0&#10;OSCI_PREMIUM=1&#10;JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1&#10;JUCE_MODAL_LOOPS_PERMITTED=1" companyEmail="james@ball.sh" defines="NOMINMAX=1&#10;INTERNET_FLAG_NO_AUTO_REDIRECT=0&#10;OSCI_PREMIUM=1&#10;JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1&#10;JUCE_MODAL_LOOPS_PERMITTED=1"
pluginAUMainType="'aumf'" postExportShellCommandPosix="echo &quot;Building LuaJIT for $OSTYPE...&quot; &amp;&amp; DIR=%%1%% %%1%%/luajit_linux_macos.sh "> pluginAUMainType="'aumf'" postExportShellCommandPosix="echo &quot;Building LuaJIT for $OSTYPE...&quot; &amp;&amp; DIR=%%1%% %%1%%/luajit_linux_macos.sh ">
<MAINGROUP id="j5Ge2T" name="osci-render"> <MAINGROUP id="j5Ge2T" name="osci-render">
@ -127,8 +127,7 @@
<FILE id="zFdUYi" name="planet.svg" compile="0" resource="1" file="Resources/svg/planet.svg"/> <FILE id="zFdUYi" name="planet.svg" compile="0" resource="1" file="Resources/svg/planet.svg"/>
<FILE id="sfWuFd" name="play.svg" compile="0" resource="1" file="Resources/svg/play.svg"/> <FILE id="sfWuFd" name="play.svg" compile="0" resource="1" file="Resources/svg/play.svg"/>
<FILE id="FJG3Ht" name="plus.svg" compile="0" resource="1" file="Resources/svg/plus.svg"/> <FILE id="FJG3Ht" name="plus.svg" compile="0" resource="1" file="Resources/svg/plus.svg"/>
<FILE id="NVf72g" name="polygon_bitcrush.svg" compile="0" resource="1" <FILE id="iHiXPh" name="polygonizer.svg" compile="0" resource="1" file="Resources/svg/polygonizer.svg"/>
file="Resources/svg/polygon_bitcrush.svg"/>
<FILE id="f0yiwT" name="puzzle.svg" compile="0" resource="1" file="Resources/svg/puzzle.svg"/> <FILE id="f0yiwT" name="puzzle.svg" compile="0" resource="1" file="Resources/svg/puzzle.svg"/>
<FILE id="ElMcEN" name="pyramid.svg" compile="0" resource="1" file="Resources/svg/pyramid.svg"/> <FILE id="ElMcEN" name="pyramid.svg" compile="0" resource="1" file="Resources/svg/pyramid.svg"/>
<FILE id="PFc2q2" name="random.svg" compile="0" resource="1" file="Resources/svg/random.svg"/> <FILE id="PFc2q2" name="random.svg" compile="0" resource="1" file="Resources/svg/random.svg"/>
@ -174,6 +173,8 @@
</GROUP> </GROUP>
<GROUP id="{75439074-E50C-362F-1EDF-8B4BE9011259}" name="Source"> <GROUP id="{75439074-E50C-362F-1EDF-8B4BE9011259}" name="Source">
<GROUP id="{85A33213-D880-BD92-70D8-1901DA6D23F0}" name="audio"> <GROUP id="{85A33213-D880-BD92-70D8-1901DA6D23F0}" name="audio">
<FILE id="EjkbRe" name="PolygonizerEffect.h" compile="0" resource="0"
file="Source/audio/PolygonizerEffect.h"/>
<FILE id="XSUjDz" name="KaleidoscopeEffect.h" compile="0" resource="0" <FILE id="XSUjDz" name="KaleidoscopeEffect.h" compile="0" resource="0"
file="Source/audio/KaleidoscopeEffect.h"/> file="Source/audio/KaleidoscopeEffect.h"/>
<FILE id="mREEpc" name="UnfoldEffect.h" compile="0" resource="0" file="Source/audio/UnfoldEffect.h"/> <FILE id="mREEpc" name="UnfoldEffect.h" compile="0" resource="0" file="Source/audio/UnfoldEffect.h"/>
@ -182,8 +183,6 @@
<FILE id="tU2pQl" name="SkewEffect.h" compile="0" resource="0" file="Source/audio/SkewEffect.h"/> <FILE id="tU2pQl" name="SkewEffect.h" compile="0" resource="0" file="Source/audio/SkewEffect.h"/>
<FILE id="yxWOsR" name="DuplicatorEffect.h" compile="0" resource="0" <FILE id="yxWOsR" name="DuplicatorEffect.h" compile="0" resource="0"
file="Source/audio/DuplicatorEffect.h"/> file="Source/audio/DuplicatorEffect.h"/>
<FILE id="GJoA2i" name="PolygonBitCrushEffect.h" compile="0" resource="0"
file="Source/audio/PolygonBitCrushEffect.h"/>
<FILE id="GbAmhn" name="SpiralBitCrushEffect.h" compile="0" resource="0" <FILE id="GbAmhn" name="SpiralBitCrushEffect.h" compile="0" resource="0"
file="Source/audio/SpiralBitCrushEffect.h"/> file="Source/audio/SpiralBitCrushEffect.h"/>
<FILE id="HE3dFE" name="AudioRecorder.h" compile="0" resource="0" file="Source/audio/AudioRecorder.h"/> <FILE id="HE3dFE" name="AudioRecorder.h" compile="0" resource="0" file="Source/audio/AudioRecorder.h"/>

Wyświetl plik

@ -46,10 +46,10 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
Name: "deletefiles"; Description: "Remove any existing settings (Clean installation)"; Flags: unchecked Name: "deletefiles"; Description: "Remove any existing settings (Clean installation)"; Flags: unchecked
[Files] [Files]
Source: "..\Builds\osci-render\VisualStudio2022\x64\Release\Standalone Plugin\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion Source: "{#SourcePath}\..\Builds\osci-render\VisualStudio2022\x64\Release\Standalone Plugin\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\Builds\osci-render\VisualStudio2022\x64\Release\VST3\osci-render.vst3\Contents\x86_64-win\{#MyAppVstName}"; DestDir: "{cf}\VST3"; Flags: ignoreversion Source: "{#SourcePath}\..\Builds\osci-render\VisualStudio2022\x64\Release\VST3\osci-render.vst3\Contents\x86_64-win\{#MyAppVstName}"; DestDir: "{cf}\VST3"; Flags: ignoreversion
Source: "..\External\spout\SpoutLibrary.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#SourcePath}\..\External\spout\SpoutLibrary.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\External\spout\SpoutLibrary.dll"; DestDir: "{sys}"; Flags: ignoreversion Source: "{#SourcePath}\..\External\spout\SpoutLibrary.dll"; DestDir: "{sys}"; Flags: ignoreversion
[InstallDelete] [InstallDelete]
Type: files; Name: {userappdata}\osci-render\osci-render.settings; Tasks: deletefiles Type: files; Name: {userappdata}\osci-render\osci-render.settings; Tasks: deletefiles
@ -68,3 +68,4 @@ Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: de
[Run] [Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent