I'm sure you guys know the situation... creating software for different platforms requires multiple computers. Not only do you need a Mac and PC, but you need multiple versions to test different operating systems and software updates. A few years back, I got tired of switching between multiple computers to get the job done, so I created triple boot PC/Hack/Linux machine. It works well. No complaints. Then I decided to upgrade my GPU to an RTX3090 for faster 3D rendering. It's quite a beast! The issue is MacOS does not work with Nvidia chips, so every time I wanted to boot up macos, I had to unplug my GPU. I also started to get annoyed by not being able to use multiple OS at one time. Powering down MacOS to use Windows can quickly get old.
Since I'm relying heavily on virtualization to run my mini datacenter, I took a shot at creating a virtualized workstation. The result?
One computer that simultaneously runs Monterey, BigSur, Win10, Win11, Linux desktop and Ubuntu server!
I'm still in the testing stages, but it's working wonderfully. I've successfully exported plugins from HISE on each platform.
The system is running on Proxmox. Not to be confused with things like VirtualBox or Parallels (which are type 2 hypervisors that run on top of an existing OS), Proxmox is a type 1 hypervisor. That means that your computer's actual hardware is divided up and given to each virtual machine.
Since the allocation of hardware is sectioned off and given to a Virtual Machine, that means you need a computer with a bit of horsepower to use multiple operating systems at the same time, but you may already have what you need. Or worst case, You only run 1 OS at a time with full resources.
By using some utilities like VirtualHere (share usb over ethernet) and Barriers (use one mouse/keyboard to control multiple computers) I'm able to use one set of hardware resources (usb sound card, dongles, etc) and share them with each computer. Each system sees the devices as if they are actually attached to the computer. No layer in between. The only downfall is since it's "directly attached", you can't share your sound card with multiple machines simultaneously.... I'm mean, that sounds like a nightmare anyway! hahahh
Right now, the Mac virtual machines feel like they have a little bit of lag, so I'm going to have to install a GPU for those machines to use.
If you guys are interested, I can post some details on building a machine like this.

Best posts made by Dan Korneff
-
The ultimate multi-platform workstation
-
RE: vu meter
It looks like you're trying to hook up a gain reduction meter to a dynamics module.
here ya go! in 13 easy steps
I'm using "right click" auto complete as much as possible.#1 - Add Dynamics module
#2 - Create a reference to the module
#3 - Create a slider and add reference
#4 - create a timer
#5 - Create function for timer
#6 - create variable to hold a reference of gain reduction
#7 - convert reduction to dB
#8 - set value of slider to gain reduction
#9 - set slider mode to decibel
#10 - Start Timer
#11 - test that reduction meter is working
#12 - set slider image to your strip
#13 - test that strip is working
-
RE: The definitive feature request & bug fix roadmap
I would love to have SideChain inputs available in the bus routing.
-
RE: Linking parameters to SNEX
Finally had a second to make a quick video. I apologize for the poor quality and zero planning... but you get the idea
-
RE: Simple ML neural network
@Christoph-Hart oh shit! There goes my weekend plans. R.I.P my marriage
-
RE: Still getting heap space problems
I just ran into this when opening older projects on my new rig. Images and binary are way below 50mb.
Did a little searching and found that this may happen if Visual Studio doesn't use the 64 bit toolset. I think it's some kind of global change between VS2017 and 2019.
Manually setting the architecture in Environmental Variables fixed the problem for me.
https://phoenixnap.com/kb/windows-set-environment-variable -
RE: Happy New Year Everyone!
:person_cartwheeling_medium-light_skin_tone: :person_cartwheeling_light_skin_tone:
Latest posts made by Dan Korneff
-
RE: HISE Meet Up
@Simon I just saw that a recorder is part of the High Performance Backend. Time for more server tinkering.
-
RE: Settings.setZoomLevel()?
Are you referring to the plug-in preview in HISE? If so, I have to close the window and reopen to see the updated size here.
-
RE: Cable broadcaster and callback not updating above 1.0
I haven't messed with the global cable much. It might be capped at a 1?
Are your meters running on a gain factor of 0-1? If so, you'll need to convert Gain to dB. Then, you need to map the dBFS range to the analog VU meter scale, so that -18 dBFS (or -20 dBFS) aligns with 0 VU on your meter.EDIT: if your meter is actually PPM, 0 would be referenced to -9 dBFS or -12 dBFS.
-
RE: Anybody understand what Sine Shaping Distortion does / how to make it?
Maybe I've been living under a rock, but I haven't heard of a sine shaper before, so this piqued my interest. It's a type of non-linear waveshaper that folds the input signal back onto itself in a sinusoidal pattern. Apparently, it produces a smooth and natural-sounding harmonic generation.
There's some analysis here:
http://www.openmusiclabs.com/files/otasine.pdfThe formula seems to be pretty simple:
output = sin(foldAmount * asin(input)); // foldAmount controls how much the wave folds.
I threw together a quick Octave script to see what's going on.
Here's the Octave script if you want to play around with it:
% Korneff - Sinusoidal Wavefolder Variations clear; clc; close all; Fs = 48e3; % Sampling frequency 48 kHz %% Choose Input Type: 'sine', 'impulse', or 'dc_sweep' inputType = 'sine'; % <-- Change to 'sine', 'impulse', or 'dc_sweep' %% Input Signal Setup switch inputType case 'sine' f = 2; % Frequency of sine wave (2 Hz) duration = 2/f; % Duration = 2 cycles (2 periods) T = 0:1/Fs:duration; Vin = sin(2*pi*f*T)'; % Column vector for Vin case 'impulse' N = 2048; Vin = [1; zeros(N-1, 1)]; T = (0:N-1)/Fs; case 'dc_sweep' N = 500; % Number of sweep points Vin = linspace(-1, 1, N)'; % DC sweep from -1 to 1 V T = Vin; % Use sweep voltage as x-axis otherwise error('Invalid inputType selected. Choose ''sine'', ''impulse'', or ''dc_sweep''.'); end %% Sinusoidal Wavefolder Functions % (1) Standard Sinusoidal Wavefolder function y = standard_sinusoidal_wavefolder(x, foldAmount) y = sin(foldAmount * asin(x)); end % (2) Phase-Inverted Sinusoidal Wavefolder function y = inverted_sinusoidal_wavefolder(x, foldAmount) y = -sin((pi/2) * asin(x)); % The phase-inverted version end %% Single Processing Loop Vout1 = zeros(size(Vin)); % Standard Sinusoidal Wavefolder Vout2 = zeros(size(Vin)); % Phase-Inverted Sinusoidal Wavefolder foldAmount = 2; % Controls how much the wave folds (adjustable) for n = 1:length(Vin) Vout1(n) = standard_sinusoidal_wavefolder(Vin(n), foldAmount); Vout2(n) = inverted_sinusoidal_wavefolder(Vin(n), foldAmount); end %% Plotting if strcmp(inputType, 'sine') figure; subplot(2,1,1); plot(T, Vin, 'b-', 'LineWidth', 1); hold on; plot(T, Vout1, 'r-', 'LineWidth', 1); legend('Vin', 'Standard Wavefolder Vout'); title('Standard Sinusoidal Wavefolder Output'); xlabel('Time (s)'); ylabel('Amplitude'); grid on; subplot(2,1,2); plot(T, Vin, 'b-', 'LineWidth', 1); hold on; plot(T, Vout2, 'g-', 'LineWidth', 1); legend('Vin', 'Inverted Wavefolder Vout'); title('Inverted Sinusoidal Wavefolder Output (-sin(ฯ/2 x))'); xlabel('Time (s)'); ylabel('Amplitude'); grid on; elseif strcmp(inputType, 'dc_sweep') figure; subplot(2,1,1); plot(T, Vout1, 'r-', 'LineWidth', 1); title('DC Sweep: Standard Sinusoidal Wavefolder'); xlabel('Vin (V)'); ylabel('Vout (V)'); grid on; xlim([-1, 1]); ylim([-1, 1]); subplot(2,1,2); plot(T, Vout2, 'g-', 'LineWidth', 1); title('DC Sweep: Inverted Sinusoidal Wavefolder'); xlabel('Vin (V)'); ylabel('Vout (V)'); grid on; xlim([-1, 1]); ylim([-1, 1]); else % impulse figure; subplot(2,1,1); stem(T, Vout1, 'filled'); title('Impulse Response - Standard Wavefolder'); xlabel('Time (s)'); ylabel('Amplitude'); grid on; subplot(2,1,2); stem(T, Vout2, 'filled'); title('Impulse Response - Inverted Wavefolder'); xlabel('Time (s)'); ylabel('Amplitude'); grid on; % Frequency response [H1, W1] = freqz(Vout1, 1, 2048, Fs); [H2, W2] = freqz(Vout2, 1, 2048, Fs); figure; subplot(2,1,1); semilogx(W1, 20*log10(abs(H1)), 'LineWidth', 1); title('Frequency Response: Standard Sinusoidal Wavefolder'); xlabel('Frequency (Hz)'); ylabel('Magnitude (dB)'); grid on; subplot(2,1,2); semilogx(W2, 20*log10(abs(H2)), 'LineWidth', 1); title('Frequency Response: Inverted Sinusoidal Wavefolder'); xlabel('Frequency (Hz)'); ylabel('Magnitude (dB)'); grid on; end
EDIT: script link fixed
-
RE: PKG notarisation issue
my command line prompt looks like:
codesign --deep --force --timestamp --options runtime --sign
-
RE: PKG notarisation issue
I had this happen to me a couple months back. I think it ended up being an issue with a file that was part of the package. I haven't tried the new export feature yet, but I think you can get the log file to see the exact issue with:
xcrun notarytool log <submission-id>
-
RE: How to get CPU serial number using HISE?
@Christoph-Hart @ustk Confirmed working:
finalize UniqueID: Use stable SMBIOS fields to generate ID on Windows (70837bae) ยท Commits ยท Dan Korneff / HISE ยท GitLab
The open source framework for sample based instruments
GitLab (gitlab.korneff.co)
It requires 2 new files:
juce_Span.h
juce_EnumHelpers.hand edits to:
juce_core.h
juce_win32_SystemStats.cpp
juce_SystemStats.cpp
juce_OnlineUnlockStatus.cpp -
RE: How to get CPU serial number using HISE?
@ustk Got it sorted. Sending to beta for testing now.