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'
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)
- name: Compile .ISS to .EXE Installer
if: matrix.os == 'windows-latest'
uses: Minionguyjpro/Inno-Setup-Action@v1.2.2
uses: Minionguyjpro/Inno-Setup-Action@v1.2.7
with:
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) {
// 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();
listBox.updateContent();
// Ensure layout updates after visibility changes
resized();
repaint();
}

Wyświetl plik

@ -12,7 +12,7 @@
#include "audio/BitCrushEffect.h"
#include "audio/BulgeEffect.h"
#include "audio/TwistEffect.h"
#include "audio/PolygonBitCrushEffect.h"
#include "audio/PolygonizerEffect.h"
#include "audio/SpiralBitCrushEffect.h"
#include "audio/DistortEffect.h"
#include "audio/UnfoldEffect.h"
@ -63,7 +63,7 @@ OscirenderAudioProcessor::OscirenderAudioProcessor() : CommonAudioProcessor(Buse
toggleableEffects.push_back(BounceEffect().build());
toggleableEffects.push_back(TwistEffect().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(VortexEffect().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>(
[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.
frequency = values[0].load() + 0.00001;
frequency = values[0].load() + 0.000001;
return input;
},
new osci::EffectParameter(
"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.",
"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>();

Wyświetl plik

@ -3,7 +3,7 @@
#include "../MathUtil.h"
// Inspired by xenontesla122
class PolygonBitCrushEffect : public osci::EffectApplication {
class PolygonizerEffect : public osci::EffectApplication {
public:
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;
@ -40,23 +40,23 @@ public:
std::shared_ptr<osci::Effect> build() const override {
auto eff = std::make_shared<osci::SimpleEffect>(
std::make_shared<PolygonBitCrushEffect>(),
std::make_shared<PolygonizerEffect>(),
std::vector<osci::EffectParameter*>{
new osci::EffectParameter("Polygon Bit Crush",
new osci::EffectParameter("Polygonizer",
"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.",
"polygonBitCrushSides", VERSION_HINT, 5.0, 3.0, 8.0),
"polygonizerSides", VERSION_HINT, 5.0, 3.0, 8.0),
new osci::EffectParameter("Stripe Size",
"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.",
"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.",
"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;
}
};

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);
}
}
clearDropIndicator();

Wyświetl plik

@ -107,28 +107,15 @@ public:
{
const int count = modelData.getNumItems();
if (count <= 0) return;
insertIndex = 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;
}
int toIndex = juce::jlimit(0, count, insertIndex);
// 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;
int toIndex = insertIndex;
if (toIndex > fromIndex)
toIndex -= 1; // account for removal shifting indices when moving down
if (toIndex <= 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
else
modelData.moveBefore(fromIndex, toIndex);

Wyświetl plik

@ -40,8 +40,9 @@ void OsciMainMenuBarModel::resetMenuItems() {
"\n\n"
"A huge thank you to:\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"
"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!",
std::any_cast<int>(audioProcessor.getProperty("objectServerPort")));
options.content.setOwned(about);

Wyświetl plik

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

Wyświetl plik

@ -4,7 +4,7 @@
addUsingNamespaceToJuceHeader="0" jucerFormatVersion="1" pluginCharacteristicsValue="pluginWantsMidiIn"
pluginManufacturer="jameshball" aaxIdentifier="sh.ball.oscirender"
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"
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">
@ -127,8 +127,7 @@
<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="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="Resources/svg/polygon_bitcrush.svg"/>
<FILE id="iHiXPh" name="polygonizer.svg" compile="0" resource="1" file="Resources/svg/polygonizer.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="PFc2q2" name="random.svg" compile="0" resource="1" file="Resources/svg/random.svg"/>
@ -174,6 +173,8 @@
</GROUP>
<GROUP id="{75439074-E50C-362F-1EDF-8B4BE9011259}" name="Source">
<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="Source/audio/KaleidoscopeEffect.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="yxWOsR" name="DuplicatorEffect.h" compile="0" resource="0"
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="Source/audio/SpiralBitCrushEffect.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
[Files]
Source: "..\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: "..\External\spout\SpoutLibrary.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\External\spout\SpoutLibrary.dll"; DestDir: "{sys}"; Flags: ignoreversion
Source: "{#SourcePath}\..\Builds\osci-render\VisualStudio2022\x64\Release\Standalone Plugin\{#MyAppExeName}"; DestDir: "{app}"; 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: "{#SourcePath}\..\External\spout\SpoutLibrary.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#SourcePath}\..\External\spout\SpoutLibrary.dll"; DestDir: "{sys}"; Flags: ignoreversion
[InstallDelete]
Type: files; Name: {userappdata}\osci-render\osci-render.settings; Tasks: deletefiles
@ -68,3 +68,4 @@ Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: de
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent