Compare commits

...

12 Commits

Author SHA1 Message Date
cb069089c0 some ui for #13 2025-12-05 18:37:20 -05:00
234e0d3e8a closes #14 2025-12-05 16:56:59 -05:00
005b924917 closes #12 2025-12-05 16:05:27 -05:00
31e5b1370a closes #11
weak pull to real pitch markers, don't care otherwise
2025-12-04 18:02:24 -05:00
34f565a96c closes #5 - rounding vs truncation error 2025-12-03 18:25:13 -05:00
f637509dbc sends update on load, fixes paramters not showing up 2025-11-11 19:35:31 -05:00
202a73141b closes #10 2025-11-11 19:28:13 -05:00
65f74cd725 primary color and shadows 2025-11-11 18:33:30 -05:00
b3429f03cb closes #8
some ui work
2025-11-11 17:28:45 -05:00
3c6616d1ec closes #6
closes #9
pitch detection runs on known schedule
fixed erratic pitch detection on launch
2025-11-09 11:16:59 -05:00
e89620df27 closes #3
Added freeze pitch and volume controls
2025-11-05 19:17:34 -05:00
f4a0b995ba basic freeze 2025-11-05 18:55:38 -05:00
35 changed files with 4376 additions and 2293 deletions

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@
"@fontsource/roboto": "^5.0.3",
"@mui/icons-material": "^5.13.7",
"@mui/material": "^5.13.7",
"@tailwindcss/postcss": "^4.1.17",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
@ -44,9 +45,12 @@
]
},
"devDependencies": {
"autoprefixer": "^10.4.21",
"eslint": "^8.43.0",
"eslint-plugin-react": "^7.32.2",
"npm-build-zip": "^1.0.4",
"prettier": "^3.6.2"
"postcss": "^8.5.6",
"prettier": "^3.6.2",
"tailwindcss": "^3.4.18"
}
}

View File

@ -31,6 +31,7 @@ import * as Juce from "juce-framework-frontend";
import JuceSlider from "./Components/JuceSlider.js";
import JuceCheckbox from "./Components/JuceCheckbox.js";
import MidiNoteInfo from "./Components/MidiNoteInfo.js";
import AutoTuneInfo from "./Components/AutoTuneInfo.js";
import { controlParameterIndexAnnotation } from "./types/JuceTypes.js";
import { React } from "react";
@ -47,16 +48,79 @@ function App() {
});
return (
<div>
<Container>
<JuceSlider identifier="harmonyMix" title="Mix" />
<JuceSlider identifier="formantPreserve" title="Formant" />
<JuceCheckbox identifier="autoTuneEnabled" />
<JuceSlider identifier="autoTuneSpeed" title="Auto Tune Speed" />
<JuceSlider identifier="autoTuneDepth" title="Auto Tune Depth" />
<JuceSlider identifier="portTime" title="Portamento Speed" />
</Container>
<MidiNoteInfo />
<div className="min-h-screen bg-[#0f0f0f] p-4 relative overflow-hidden">
{/* Controls Grid */}
<div className="grid grid-cols-3 gap-2 items-start">
{/* Left Column */}
<div className="border border-[#2a2a2a] rounded-lg p-4">
<div className="flex flex-col gap-4">
<div className="flex items-center justify-center">
<div>
<JuceSlider identifier="harmonyMix" title="Mix" />
</div>
<div>
<JuceSlider identifier="formantPreserve" title="Formant" />
</div>
</div>
<div className="flex items-center justify-center mt-[45px]">
<div>
<JuceSlider identifier="portTime" title="Portamento Speed" />
</div>
<div>
<JuceSlider identifier="panWidth" title="Pan Width" />
</div>
</div>
</div>
</div>
<div className="border border-[#2a2a2a] rounded-lg p-4">
<div className="flex flex-col gap-4">
<div className="flex flex-col gap-2 items-center">
<div className="self-center justify-center items-center flex">
<JuceCheckbox identifier="autoTuneEnabled" />
</div>
<div className="mt-0 w-full">
<AutoTuneInfo />
</div>
</div>
<div className="grid grid-cols-2 grid-rows-1 gap-4">
<div>
<JuceSlider
identifier="autoTuneSpeed"
title="Auto Tune Speed"
/>
</div>
<div>
<JuceSlider
identifier="autoTuneDepth"
title="Auto Tune Depth"
/>
</div>
</div>
</div>
</div>
<div className="border border-[#2a2a2a] rounded-lg p-4">
<div className="flex flex-col gap-4 items-center justify-center">
<div className="mt-0 pt-0 flex items-center justify-center ">
<JuceCheckbox identifier="freezeEnabled" />
</div>
<div className="flex items-center justify-center mt-[100px]">
<div>
<JuceSlider identifier="freezePitch" title="Freeze Pitch" />
</div>
<div>
<JuceSlider identifier="freezeVolume" title="Freeze Volume" />
</div>
</div>
</div>
</div>
</div>
<Container></Container>
<div className="rounded-lg">
<MidiNoteInfo />
</div>
</div>
);
}

1
Assets/web/src/Colors.js Normal file
View File

@ -0,0 +1 @@
export const HIGHLIGHT_COLOR = "#5242cdff";

View File

@ -0,0 +1,133 @@
/* eslint-disable no-unused-vars */
import React, { useState, useEffect, useRef } from "react";
import CenterGrowSlider from "./CenterGrowSlider.js";
import AutoTuneDataReceiver from "../DataRecievers/AutoTuneDataReceiver.js";
import PianoKeyboard from "./PianoKeyboard.js";
// import { Slider } from "@mui/material";
// import { styled } from "@mui/material/styles";
// eslint-disable-next-line react/prop-types
export default function AutoTuneInfo() {
const [inputCents, setInputCents] = useState(0);
const [outputCents, setOutputCents] = useState(0);
const [autotuneNote, setAutotuneNote] = useState(0);
const [showPopup, setShowPopup] = useState(false);
const [autoTuneKey, setAutoTuneKey] = useState("");
const dataReceiverRef = useRef(null);
const isActiveRef = useRef(true);
function getCharfromNoteIndex(index) {
if (index === -1) return "-";
const NOTE_NAMES = [
"C",
"C♯",
"D",
"D♯",
"E",
"F",
"F♯",
"G",
"G♯",
"A",
"A♯",
"B",
];
if (typeof index !== "number" || isNaN(index)) return "";
return NOTE_NAMES[index % NOTE_NAMES.length];
}
useEffect(() => {
dataReceiverRef.current = new AutoTuneDataReceiver();
isActiveRef.current = true;
function render() {
if (!isActiveRef.current) return;
if (dataReceiverRef.current) {
setInputCents(dataReceiverRef.current.getInputCents());
setOutputCents(dataReceiverRef.current.getOutputCents());
setAutotuneNote(dataReceiverRef.current.getAutotuneNote());
}
window.requestAnimationFrame(render);
}
window.requestAnimationFrame(render);
return function cleanup() {
isActiveRef.current = false;
if (dataReceiverRef.current) dataReceiverRef.current.unregister();
};
}, []);
return (
<div className="p-0 flex flex-col gap-1">
<div className="flex">
<h1
className="w-8 flex-initial py-2 px-1 text-xl"
style={{ color: "#666" }}
>
{getCharfromNoteIndex(autotuneNote)}
</h1>
<div className=" py-2 px-1 flex-1">
<div className="py-1">
<CenterGrowSlider value={inputCents} />
</div>
<div className="py-1">
<CenterGrowSlider value={outputCents} />
</div>
</div>
</div>
<div className="flex justify-start items-center">
<select
value={autoTuneKey}
className="select-none w-10 h-10 rounded px-2 bg-[#262626] text-[#eee]"
onChange={(e) => {
//send stuff to plugin here
setAutoTuneKey("");
}}
aria-label="Select note"
style={{
appearance: "none",
WebkitAppearance: "none",
textAlign: "center",
border: "none",
outline: "none",
}}
>
<option value="" disabled hidden style={{ textAlign: "center" }}>
...
</option>
{[
"C",
"C♯",
"D",
"D♯",
"E",
"F",
"F♯",
"G",
"G♯",
"A",
"A♯",
"B",
].map((key, idx) => (
<option
key={key}
value={idx}
style={{ textAlign: "start", border: "none", outline: "none" }}
>
{key}
</option>
))}
</select>
<div className="h-[40px] w-[85%] self-end px-1">
<PianoKeyboard
heldNotes={[]}
LOWEST_MIDI={0}
HIGHEST_MIDI={11}
showNoteNames={false}
/>
</div>
</div>
</div>
);
}

View File

@ -1,12 +1,9 @@
/* eslint-disable react/prop-types */
import React from "react";
export default function CenterGrowSlider({
value,
min = -50,
max = 50,
positiveColor = "#4caf50",
negativeColor = "#f44336",
backgroundColor = "rgba(150,150,150,0.3)",
height = 8,
}) {
@ -39,21 +36,21 @@ export default function CenterGrowSlider({
>
{/* Negative (left) bar */}
<div
className="bg-primary shadow-primary/40 shadow-[0_0_16px,inset_0_1px_2px_rgba(255,255,255,0.3)]"
style={{
...baseStyle,
right: "50%", // anchored to the center
width: `${negativeWidth}%`,
backgroundColor: negativeColor,
}}
/>
{/* Positive (right) bar */}
<div
className="bg-primary shadow-primary/40 shadow-[0_0_16px,inset_0_1px_2px_rgba(255,255,255,0.3)]"
style={{
...baseStyle,
left: "50%", // anchored to the center
width: `${positiveWidth}%`,
backgroundColor: positiveColor,
}}
/>
</div>

View File

@ -0,0 +1,89 @@
/* eslint-disable react/prop-types */
import React, { useState, useRef, useEffect } from "react";
import { HIGHLIGHT_COLOR } from "../Colors.js";
export function HorizontalSlider({
value = 50,
onChange,
min = 0,
max = 100,
showFill = false,
}) {
// const [localValue, setLocalValue] = useState(value);
const [percentage, setPercentage] = useState(
((value - min) / (max - min)) * 100
);
const sliderRef = useRef(null);
const isDragging = useRef(false);
useEffect(() => {
setPercentage(((value - min) / (max - min)) * 100);
}, [value, min, max]);
const handleMouseDown = (e) => {
isDragging.current = true;
updateValue(e.clientX);
e.preventDefault();
};
const updateValue = (clientX) => {
if (!sliderRef.current) return;
const rect = sliderRef.current.getBoundingClientRect();
const percentage = Math.max(
0,
Math.min(100, ((clientX - rect.left) / rect.width) * 100)
);
const newValue = min + (percentage / 100) * (max - min);
// setLocalValue(newValue);
onChange?.(newValue);
};
useEffect(() => {
const handleMouseMove = (e) => {
if (!isDragging.current) return;
updateValue(e.clientX);
};
const handleMouseUp = () => {
isDragging.current = false;
};
document.addEventListener("mousemove", handleMouseMove);
document.addEventListener("mouseup", handleMouseUp);
return () => {
document.removeEventListener("mousemove", handleMouseMove);
document.removeEventListener("mouseup", handleMouseUp);
};
}, []);
return (
<div className="relative w-64 h-10">
<div
ref={sliderRef}
className="absolute top-1/2 -translate-y-1/2 w-full h-8 bg-[#1a1a1a] border-2 border-[#2a2a2a] rounded-full cursor-pointer select-none shadow-[inset_0_2px_8px_rgba(0,0,0,0.5),inset_0_-1px_3px_rgba(255,255,255,0.03)] overflow-hidden"
onMouseDown={handleMouseDown}
>
{/* Diffused top highlight for track */}
<div className="absolute -top-1 left-0 right-0 h-3/4 bg-gradient-to-b from-white/[0.06] via-white/[0.015] to-transparent rounded-full pointer-events-none blur-[2px]" />
{showFill && (
<div
className={`absolute left-0 top-0 h-full bg-primary rounded-full shadow-primary/40 shadow-[0_0_8px]`}
style={{ width: `${percentage}%` }}
/>
)}
</div>
{/* Thumb outside the track container */}
<div
className="absolute top-1/2 -translate-y-1/2 w-10 h-10 bg-[#2a2a2a] border-2 border-[#3a3a3a] rounded-full shadow-[0_4px_8px_rgba(0,0,0,0.4),inset_0_-1px_4px_rgba(255,255,255,0.05),inset_0_2px_4px_rgba(0,0,0,0.3)] overflow-hidden pointer-events-none"
style={{ left: `calc(${percentage}% - 20px)` }}
>
<div className="absolute -top-1 left-0 right-0 h-3/4 bg-gradient-to-b from-white/[0.08] via-white/[0.02] to-transparent rounded-full pointer-events-none blur-[2px]" />
</div>
</div>
);
}

View File

@ -2,10 +2,11 @@ import React, { useState, useEffect } from "react";
import PropTypes from "prop-types";
import Box from "@mui/material/Box";
import * as Juce from "juce-framework-frontend";
import Checkbox from "@mui/material/Checkbox";
import FormGroup from "@mui/material/FormGroup";
import FormControlLabel from "@mui/material/FormControlLabel";
// import Checkbox from "@mui/material/Checkbox";
// import FormGroup from "@mui/material/FormGroup";
// import FormControlLabel from "@mui/material/FormControlLabel";
import { controlParameterIndexAnnotation } from "../types/JuceTypes.js";
// import { ToggleSwitch } from "./ToggleSwitch.js";
export default function JuceCheckbox({ identifier }) {
JuceCheckbox.propTypes = {
@ -15,11 +16,16 @@ export default function JuceCheckbox({ identifier }) {
const checkboxState = Juce.getToggleState(identifier);
const [value, setValue] = useState(checkboxState.getValue());
// eslint-disable-next-line no-unused-vars
const [properties, setProperties] = useState(checkboxState.properties);
const handleChange = (event) => {
checkboxState.setValue(event.target.checked);
setValue(event.target.checked);
// const handleChange = (event) => {
// checkboxState.setValue(event.target.checked);
// setValue(event.target.checked);
// };
const handleChange = (value) => {
checkboxState.setValue(value);
setValue(value);
};
useEffect(() => {
@ -37,18 +43,49 @@ export default function JuceCheckbox({ identifier }) {
};
});
const cb = <Checkbox checked={value} onChange={handleChange} />;
// const cb = <Checkbox checked={value} onChange={handleChange} />;
// const cb = <ToggleSwitch value={value} onChange={handleChange} />;
return (
<Box
margin={0}
padding={0}
{...{
[controlParameterIndexAnnotation]:
checkboxState.properties.parameterIndex,
}}
>
<FormGroup>
<FormControlLabel control={cb} label={properties.name} />
</FormGroup>
<div className="flex gap-2">
<button
onClick={() => handleChange(true)}
className={`px-8 py-3 rounded transition-colors transition-shadow relative overflow-hidden ${
value
? `bg-primary text-[#1a1a1a] shadow-primary/40 shadow-[0_0_16px,inset_0_1px_2px_rgba(255,255,255,0.3)]`
: `bg-[#1a1a1a] text-primary border-2 border-[#2a2a2a] shadow-[inset_0_2px_4px_rgba(0,0,0,0.3)]`
}`}
>
{!value && (
<div className="absolute -top-1/4 left-0 right-0 h-3/4 bg-gradient-to-b from-white/[0.08] via-white/[0.02] to-transparent pointer-events-none blur-[2px]" />
)}
<span className="relative z-10">ON</span>
</button>
<button
onClick={() => handleChange(false)}
className={`px-8 py-3 rounded transition-colors transition-shadow relative overflow-hidden ${
!value
? `bg-primary text-[#1a1a1a] shadow-primary/40 shadow-[0_0_16px,inset_0_1px_2px_rgba(255,255,255,0.3)]`
: `bg-[#1a1a1a] text-primary border-2 border-[#2a2a2a] shadow-[inset_0_2px_4px_rgba(0,0,0,0.3)]`
}`}
>
{value && (
<div className="absolute -top-1/4 left-0 right-0 h-3/4 bg-gradient-to-b from-white/[0.08] via-white/[0.02] to-transparent pointer-events-none blur-[2px]" />
)}
<span className="relative z-10">OFF</span>
</button>
</div>
{/* <ToggleSwitch value={value} onChange={handleChange} /> */}
{/* <FormGroup>
<FormControlLabel control={cb} />
</FormGroup> */}
</Box>
);
}

View File

@ -2,15 +2,16 @@ import PropTypes from "prop-types";
import Box from "@mui/material/Container";
import Typography from "@mui/material/Typography";
import Slider from "@mui/material/Slider";
// import Slider from "@mui/material/Slider";
import * as Juce from "juce-framework-frontend";
import { React, useState, useEffect } from "react";
import { controlParameterIndexAnnotation } from "../types/JuceTypes.js";
import { Knob } from "./knob.js";
// import { HorizontalSlider } from "./HorizontalSlider.js";
export default function JuceSlider({ identifier, title }) {
export default function JuceSlider({ identifier }) {
JuceSlider.propTypes = {
identifier: PropTypes.string,
title: PropTypes.string,
};
const sliderState = Juce.getSliderState(identifier);
@ -18,19 +19,19 @@ export default function JuceSlider({ identifier, title }) {
const [value, setValue] = useState(sliderState.getNormalisedValue());
const [properties, setProperties] = useState(sliderState.properties);
const handleChange = (event, newValue) => {
const handleChange = (newValue) => {
sliderState.setNormalisedValue(newValue);
setValue(newValue);
};
const mouseDown = () => {
sliderState.sliderDragStarted();
};
// const mouseDown = () => {
// sliderState.sliderDragStarted();
// };
const changeCommitted = (event, newValue) => {
sliderState.setNormalisedValue(newValue);
sliderState.sliderDragEnded();
};
// const changeCommitted = (event, newValue) => {
// sliderState.setNormalisedValue(newValue);
// sliderState.sliderDragEnded();
// };
useEffect(() => {
const valueListenerId = sliderState.valueChangedEvent.addListener(() => {
@ -46,9 +47,9 @@ export default function JuceSlider({ identifier, title }) {
};
});
function calculateValue() {
return sliderState.getScaledValue();
}
// function calculateValue() {
// return sliderState.getScaledValue();
// }
return (
<Box
@ -57,20 +58,36 @@ export default function JuceSlider({ identifier, title }) {
sliderState.properties.parameterIndex,
}}
>
<Typography sx={{ mt: 1.5 }}>
{properties.name}: {sliderState.getScaledValue()} {properties.label}
</Typography>
<Slider
aria-label={title}
value={value}
scale={calculateValue}
onChange={handleChange}
min={0}
max={1}
step={1 / (properties.numSteps - 1)}
onChangeCommitted={changeCommitted}
onMouseDown={mouseDown}
/>
<div className="justify-items-center">
<Typography
m={0}
p={0}
fontSize={14}
className="text-[#666666] text-center"
>
{properties.name}
{properties.label}
</Typography>
<Knob value={value} onChange={handleChange} min={0} max={1} size="sm" />
{/* <HorizontalSlider
value={value}
onChange={handleChange}
min={0}
max={1}
showFill
/>
<Slider
aria-label={title}
value={value}
scale={calculateValue}
// onChange={handleChange}
min={0}
max={1}
step={1 / (properties.numSteps - 1)}
onChangeCommitted={changeCommitted}
onMouseDown={mouseDown}
/> */}
</div>
</Box>
);
}

View File

@ -1,7 +1,6 @@
import React, { useState, useEffect, useRef } from "react";
import PianoKeyboard from "./PianoKeyboard";
import MidNoteDataReceiver from "../DataRecievers/MidiNoteDataReceiver.js";
import CenterGrowSlider from "./CenterGrowSlider.js";
// import { Slider } from "@mui/material";
// import { styled } from "@mui/material/styles";
@ -9,31 +8,9 @@ import CenterGrowSlider from "./CenterGrowSlider.js";
export default function MidiNoteInfo() {
const [notes, setNotes] = useState([]);
const [inputCents, setInputCents] = useState(0);
const [outputCents, setOutputCents] = useState(0);
const [autotuneNote, setAutotuneNote] = useState(0);
const dataReceiverRef = useRef(null);
const isActiveRef = useRef(true);
function getCharfromNoteIndex(index) {
const NOTE_NAMES = [
"C",
"C♯",
"D",
"D♯",
"E",
"F",
"F♯",
"G",
"G♯",
"A",
"A♯",
"B",
];
if (typeof index !== "number" || isNaN(index)) return "";
return NOTE_NAMES[index % NOTE_NAMES.length];
}
useEffect(() => {
dataReceiverRef.current = new MidNoteDataReceiver();
isActiveRef.current = true;
@ -42,9 +19,6 @@ export default function MidiNoteInfo() {
if (!isActiveRef.current) return;
if (dataReceiverRef.current) {
setNotes(dataReceiverRef.current.getNotes());
setInputCents(dataReceiverRef.current.getInputCents());
setOutputCents(dataReceiverRef.current.getOutputCents());
setAutotuneNote(dataReceiverRef.current.getAutotuneNote());
}
window.requestAnimationFrame(render);
}
@ -57,13 +31,8 @@ export default function MidiNoteInfo() {
}, []);
return (
<div style={{ padding: "1rem" }}>
<PianoKeyboard heldNotes={notes} />
<h1>Autotune Note: {getCharfromNoteIndex(autotuneNote)}</h1>
<label>Input cents</label>
<CenterGrowSlider value={inputCents} />
<label>Output cents</label>
<CenterGrowSlider value={outputCents} />
<div className="rounded-lg h-[80px]" style={{ marginTop: "1rem" }}>
<PianoKeyboard heldNotes={notes} LOWEST_MIDI={24} HIGHEST_MIDI={84} />
</div>
);
}

View File

@ -1,6 +1,5 @@
/* eslint-disable react/prop-types */
import React /*, { useRef, useEffect, useState }*/ from "react";
const NOTE_NAMES = [
"C",
"C♯",
@ -18,8 +17,8 @@ const NOTE_NAMES = [
const WHITE_KEYS = [0, 2, 4, 5, 7, 9, 11];
// C2 = 36, C5 = 72
const LOWEST_MIDI = 36;
const HIGHEST_MIDI = 72;
// const LOWEST_MIDI = 24;
// const HIGHEST_MIDI = 84;
function getNoteName(midi) {
const octave = Math.floor(midi / 12) - 1;
@ -31,7 +30,12 @@ function isWhiteKey(midi) {
return WHITE_KEYS.includes(midi % 12);
}
export default function PianoKeyboard({ heldNotes }) {
export default function PianoKeyboard({
heldNotes,
LOWEST_MIDI,
HIGHEST_MIDI,
showNoteNames = true,
}) {
const heldMap = {};
heldNotes.forEach((n) => (heldMap[n.midi] = n.voice));
@ -72,18 +76,16 @@ export default function PianoKeyboard({ heldNotes }) {
const idx = midiToWhiteIndex[prevWhite];
if (idx === undefined) return 0;
// Offset: (idx + 0.65) / numWhite * 100%
return ((idx + 0.65) / numWhite) * 100;
return ((idx + 1) / numWhite) * 100;
}
return (
<div
style={{
position: "relative",
height: 80,
height: "100%",
userSelect: "none",
width: "100%",
minWidth: 200,
maxWidth: 900,
margin: "0 auto",
}}
>
@ -96,14 +98,18 @@ export default function PianoKeyboard({ heldNotes }) {
height: "100%",
}}
>
{whiteKeys.map((k) => (
{whiteKeys.map((k, i) => (
<div
key={k.midi}
className={
k.held
? "bg-primary shadow-primary/30 shadow-[0_0_16px,inset_0_1px_2px_rgba(255,255,255,0.2)]"
: "bg-[#222]"
}
style={{
flex: "1 1 0",
height: "100%",
border: "1px solid #888",
background: k.held ? "#2a82caff" : "#fff",
border: "1px solid #2a2a2a",
position: "relative",
boxSizing: "border-box",
marginRight: -1,
@ -114,30 +120,36 @@ export default function PianoKeyboard({ heldNotes }) {
fontSize: 10,
fontFamily: "monospace",
overflow: "hidden",
borderTopLeftRadius: i === 0 ? 6 : 0, // round left edge of first key
borderBottomLeftRadius: i === 0 ? 6 : 0,
borderTopRightRadius: i === whiteKeys.length - 1 ? 6 : 0, // round right edge of last key
borderBottomRightRadius: i === whiteKeys.length - 1 ? 6 : 0,
}}
>
<div
style={{
display: "flex",
flexDirection: "column-reverse",
alignItems: "center",
}}
>
<span style={{ opacity: 0.5 }}>{k.noteName}</span>
{k.held && (
<span
style={{
color: "#fff",
fontWeight: "bold",
fontSize: 14,
lineHeight: "14px",
marginBottom: 2,
}}
>
{k.voice}
</span>
)}
</div>
{showNoteNames && (
<div
style={{
display: "flex",
flexDirection: "column-reverse",
alignItems: "center",
}}
>
<span style={{ color: "#555" }}>{k.noteName}</span>
{k.held && (
<span
style={{
color: "#666666",
fontWeight: "bold",
fontSize: 14,
lineHeight: "14px",
marginBottom: 2,
}}
>
{k.voice}
</span>
)}
</div>
)}
</div>
))}
</div>
@ -156,13 +168,17 @@ export default function PianoKeyboard({ heldNotes }) {
{blackKeys.map((k) => (
<div
key={k.midi}
className={
k.held
? "bg-primary shadow-primary/30 shadow-[0_0_16px,inset_0_1px_2px_rgba(255,255,255,0.2)]"
: "bg-[#111]"
}
style={{
position: "absolute",
left: `${getBlackKeyPercent(k.midi)}%`,
width: `${(100 / numWhite) * 0.65}%`,
height: "100%",
background: k.held ? "#2a82caff" : "#222",
border: "1px solid #444",
border: "1px solid #333",
borderRadius: 3,
display: "flex",
flexDirection: "column-reverse",
@ -184,7 +200,7 @@ export default function PianoKeyboard({ heldNotes }) {
{k.held && (
<span
style={{
color: "#fff",
color: "#666666",
fontWeight: "bold",
fontSize: 14,
lineHeight: "14px",

View File

@ -0,0 +1,94 @@
/* eslint-disable react/prop-types */
import React, { useState, useRef, useEffect } from "react";
// interface KnobProps {
// value?: number;
// onChange?: (value: number) => void;
// min?: number;
// max?: number;
// size?: 'sm' | 'md' | 'lg';
// }
export function Knob({ value = 0, onChange, min = 0, max = 100, size = "md" }) {
// const [localValue, setLocalValue] = useState(value);
const isDragging = useRef(false);
const startX = useRef(0);
const startY = useRef(0);
const startValue = useRef(0);
const sizeClasses = {
sm: "w-16 h-16",
md: "w-24 h-24",
lg: "w-32 h-32",
};
const dotSize = {
sm: "w-2 h-2",
md: "w-2.5 h-2.5",
lg: "w-3 h-3",
};
const [rotation, setRotation] = useState(
((value - min) / (max - min)) * 270 - 135
);
const handleMouseDown = (e) => {
isDragging.current = true;
startX.current = e.clientX;
startY.current = e.clientY;
startValue.current = value;
e.preventDefault();
};
useEffect(() => {
const handleMouseMove = (e) => {
if (!isDragging.current) return;
const deltaX = e.clientX - startX.current;
const deltaY = startY.current - e.clientY;
const combinedDelta = deltaX + deltaY;
const sensitivity = 0.01;
const newValue = Math.max(
min,
Math.min(max, startValue.current + combinedDelta * sensitivity)
);
setRotation(((newValue - min) / (max - min)) * 270 - 135);
onChange?.(newValue);
};
const handleMouseUp = () => {
isDragging.current = false;
};
document.addEventListener("mousemove", handleMouseMove);
document.addEventListener("mouseup", handleMouseUp);
return () => {
document.removeEventListener("mousemove", handleMouseMove);
document.removeEventListener("mouseup", handleMouseUp);
};
}, [min, max, onChange]);
useEffect(() => {
setRotation(((value - min) / (max - min)) * 270 - 135);
}, [value, min, max]);
return (
<div
className={`${sizeClasses[size]} rounded-full bg-[#1a1a1a] border-2 border-[#2a2a2a] relative cursor-pointer select-none shadow-[inset_0_2px_8px_rgba(0,0,0,0.5),inset_0_-2px_6px_rgba(255,255,255,0.03),0_4px_12px_rgba(0,0,0,0.4)] overflow-hidden`}
onMouseDown={handleMouseDown}
>
{/* Diffused top highlight */}
<div className="absolute -top-1/4 left-0 right-0 h-3/4 bg-gradient-to-b from-white/[0.08] via-white/[0.02] to-transparent rounded-full pointer-events-none blur-sm" />
<div
className="absolute inset-0 flex items-start justify-center pt-2"
style={{ transform: `rotate(${rotation}deg)` }}
>
<div
className={`${dotSize[size]} rounded-full bg-primary shadow-primary/90 shadow-[0_0_12px]`}
/>
</div>
</div>
);
}

View File

@ -0,0 +1,42 @@
// import * as Juce from "juce-framework-frontend";
// import reportWebVitals from "../reportWebVitals";
const AutoTuneDataReceiver_eventId = "autoTuneData";
export default class AutoTuneDataReceiver {
constructor() {
this.input_pitch = 0;
this.output_pitch = 0;
let self = this;
this.autoTuneDataRegistrationId = window.__JUCE__.backend.addEventListener(
AutoTuneDataReceiver_eventId,
(event) => {
self.input_pitch = event.input_pitch;
self.output_pitch = event.output_pitch;
}
);
}
frequencytoMidi(frequency) {
return 69 + 12 * Math.log2(frequency / 440);
}
getAutotuneNote() {
if (this.output_pitch <= 0) return -1;
const midi = this.frequencytoMidi(this.output_pitch);
return Math.round(midi % 12);
}
getInputCents() {
const midi = this.frequencytoMidi(this.input_pitch);
return Math.round((midi - Math.round(midi)) * 100);
}
getOutputCents() {
const midi = this.frequencytoMidi(this.output_pitch);
return Math.round((midi - Math.round(midi)) * 100);
}
unregister() {
window.__JUCE__.backend.removeEventListener(
this.autoTuneDataRegistrationId
);
}
}

View File

@ -12,17 +12,6 @@ export default class MidNoteDataReceiver {
MidNoteDataReceiver_eventId,
(event) => {
self.notes = event.notes;
self.input_pitch = event.input_pitch;
self.output_pitch = event.output_pitch;
console.log("in: " + self.input_pitch);
console.log("out: " + self.output_pitch);
// reportWebVitals(console.log(event));
// fetch(Juce.getBackendResourceAddress("midNoteData.json"))
// .then((response) => response.text())
// .then((text) => {
// const data = JSON.parse(text);
// self.notes = data.notes;
// });
}
);
}
@ -31,23 +20,6 @@ export default class MidNoteDataReceiver {
return this.notes;
}
frequencytoMidi(frequency) {
return 69 + 12 * Math.log2(frequency / 440);
}
getAutotuneNote() {
const midi = this.frequencytoMidi(this.output_pitch);
return Math.round(midi % 12);
}
getInputCents() {
const midi = this.frequencytoMidi(this.input_pitch);
return Math.round((midi - Math.round(midi)) * 100);
}
getOutputCents() {
const midi = this.frequencytoMidi(this.output_pitch);
return Math.round((midi - Math.round(midi)) * 100);
}
unregister() {
window.__JUCE__.backend.removeEventListener(this.midNoteDataRegistrationId);
}

View File

@ -1,3 +1,7 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
@ -12,3 +16,201 @@ code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}
@custom-variant dark (&:is(.dark *));
:root {
--font-size: 16px;
--background: #ffffff;
--foreground: oklch(0.145 0 0);
--card: #ffffff;
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: #030213;
--primary-foreground: oklch(1 0 0);
--secondary: oklch(0.95 0.0058 264.53);
--secondary-foreground: #030213;
--muted: #ececf0;
--muted-foreground: #717182;
--accent: #e9ebef;
--accent-foreground: #030213;
--destructive: #d4183d;
--destructive-foreground: #ffffff;
--border: rgba(0, 0, 0, 0.1);
--input: transparent;
--input-background: #f3f3f5;
--switch-background: #cbced4;
--font-weight-medium: 500;
--font-weight-normal: 400;
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--radius: 0.625rem;
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: #030213;
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.145 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.145 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.985 0 0);
--primary-foreground: oklch(0.205 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.396 0.141 25.723);
--destructive-foreground: oklch(0.637 0.237 25.331);
--border: oklch(0.269 0 0);
--input: oklch(0.269 0 0);
--ring: oklch(0.439 0 0);
--font-weight-medium: 500;
--font-weight-normal: 400;
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(0.269 0 0);
--sidebar-ring: oklch(0.439 0 0);
--color-primary-rgb: 127,255,127;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-input-background: var(--input-background);
--color-switch-background: var(--switch-background);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
}
@layer base {
/* * {
@apply border-border outline-ring/50;
} */
/* body {
@apply bg-background text-foreground;
} */
}
/**
* Base typography. This is not applied to elements which have an ancestor with a Tailwind text class.
*/
@layer base {
:where(:not(:has([class*=' text-']), :not(:has([class^='text-'])))) {
h1 {
font-size: var(--text-2xl);
font-weight: var(--font-weight-medium);
line-height: 1.5;
}
h2 {
font-size: var(--text-xl);
font-weight: var(--font-weight-medium);
line-height: 1.5;
}
h3 {
font-size: var(--text-lg);
font-weight: var(--font-weight-medium);
line-height: 1.5;
}
h4 {
font-size: var(--text-base);
font-weight: var(--font-weight-medium);
line-height: 1.5;
}
p {
font-size: var(--text-base);
font-weight: var(--font-weight-normal);
line-height: 1.5;
}
label {
font-size: var(--text-base);
font-weight: var(--font-weight-medium);
line-height: 1.5;
}
button {
font-size: var(--text-base);
font-weight: var(--font-weight-medium);
line-height: 1.5;
}
input {
font-size: var(--text-base);
font-weight: var(--font-weight-normal);
line-height: 1.5;
}
}
}
html {
font-size: var(--font-size);
}
@layer utilities {
.bg-gradient-radial {
background-image: radial-gradient(circle, var(--tw-gradient-stops));
}
}

View File

@ -0,0 +1,13 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ["./src/*.{js,jsx,ts,tsx}", "./src/**/*.{js,jsx,ts,tsx}"],
theme: {
extend: {
colors: {
//primary: "#7FFF7F",
primary: "#2ccaffff",
},
},
},
plugins: [],
};

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<Project ToolsVersion="17.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Harmonizer\Assets">
@ -843,6 +844,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_basics\juce_audio_basics.cpp">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_basics\juce_audio_basics.mm">
<Filter>JUCE Modules\juce_audio_basics</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_devices\audio_io\juce_AudioDeviceManager.cpp">
<Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>
</ClCompile>
@ -1068,6 +1072,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_devices\native\juce_CoreAudio_mac.cpp">
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_devices\native\juce_CoreMidi_mac.mm">
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_devices\native\juce_DirectSound_windows.cpp">
<Filter>JUCE Modules\juce_audio_devices\native</Filter>
</ClCompile>
@ -1101,6 +1108,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_devices\juce_audio_devices.cpp">
<Filter>JUCE Modules\juce_audio_devices</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_devices\juce_audio_devices.mm">
<Filter>JUCE Modules\juce_audio_devices</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_formats\codecs\flac\libFLAC\deduplication\bitreader_read_rice_signed_block.c">
<Filter>JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\deduplication</Filter>
</ClCompile>
@ -1287,6 +1297,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_formats\juce_audio_formats.cpp">
<Filter>JUCE Modules\juce_audio_formats</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_formats\juce_audio_formats.mm">
<Filter>JUCE Modules\juce_audio_formats</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_plugin_client\juce_audio_plugin_client_ARA.cpp">
<Filter>JUCE Modules\juce_audio_plugin_client</Filter>
</ClCompile>
@ -1470,6 +1483,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\module_linux.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\module_mac.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting\module_win32.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting</Filter>
</ClCompile>
@ -1515,6 +1531,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1635,6 +1654,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\juce_audio_processors.cpp">
<Filter>JUCE Modules\juce_audio_processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\juce_audio_processors.mm">
<Filter>JUCE Modules\juce_audio_processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\juce_audio_processors_ara.cpp">
<Filter>JUCE Modules\juce_audio_processors</Filter>
</ClCompile>
@ -1668,21 +1690,33 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">
<Filter>JUCE Modules\juce_audio_utils\gui</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_AudioCDBurner_mac.mm">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_AudioCDBurner_windows.cpp">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_AudioCDReader_linux.cpp">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_AudioCDReader_mac.mm">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_AudioCDReader_windows.cpp">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_BluetoothMidiDevicePairingDialogue_android.cpp">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_BluetoothMidiDevicePairingDialogue_ios.mm">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_BluetoothMidiDevicePairingDialogue_linux.cpp">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_BluetoothMidiDevicePairingDialogue_mac.mm">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\native\juce_BluetoothMidiDevicePairingDialogue_windows.cpp">
<Filter>JUCE Modules\juce_audio_utils\native</Filter>
</ClCompile>
@ -1695,6 +1729,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\juce_audio_utils.cpp">
<Filter>JUCE Modules\juce_audio_utils</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_utils\juce_audio_utils.mm">
<Filter>JUCE Modules\juce_audio_utils</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\containers\juce_AbstractFifo.cpp">
<Filter>JUCE Modules\juce_core\containers</Filter>
</ClCompile>
@ -1833,6 +1870,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Files_linux.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Files_mac.mm">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Files_windows.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
@ -1854,27 +1894,42 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Network_linux.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Network_mac.mm">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Network_windows.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_ObjCHelpers_mac_test.mm">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_PlatformTimer_generic.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_PlatformTimer_windows.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Process_mac.mm">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Registry_windows.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_RuntimePermissions_android.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Strings_mac.mm">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_SystemStats_android.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_SystemStats_linux.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_SystemStats_mac.mm">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_SystemStats_wasm.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
@ -1887,6 +1942,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Threads_linux.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Threads_mac.mm">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\native\juce_Threads_windows.cpp">
<Filter>JUCE Modules\juce_core\native</Filter>
</ClCompile>
@ -2055,6 +2113,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\juce_core.cpp">
<Filter>JUCE Modules\juce_core</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\juce_core.mm">
<Filter>JUCE Modules\juce_core</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_core\juce_core_CompilationTime.cpp">
<Filter>JUCE Modules\juce_core</Filter>
</ClCompile>
@ -2088,6 +2149,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_data_structures\juce_data_structures.cpp">
<Filter>JUCE Modules\juce_data_structures</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_data_structures\juce_data_structures.mm">
<Filter>JUCE Modules\juce_data_structures</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_dsp\containers\juce_AudioBlock_test.cpp">
<Filter>JUCE Modules\juce_dsp\containers</Filter>
</ClCompile>
@ -2193,6 +2257,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_dsp\juce_dsp.cpp">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_dsp\juce_dsp.mm">
<Filter>JUCE Modules\juce_dsp</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_events\broadcasters\juce_ActionBroadcaster.cpp">
<Filter>JUCE Modules\juce_events\broadcasters</Filter>
</ClCompile>
@ -2232,6 +2299,12 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_events\messages\juce_MessageManager.cpp">
<Filter>JUCE Modules\juce_events\messages</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_events\native\juce_MessageManager_ios.mm">
<Filter>JUCE Modules\juce_events\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_events\native\juce_MessageManager_mac.mm">
<Filter>JUCE Modules\juce_events\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_events\native\juce_Messaging_android.cpp">
<Filter>JUCE Modules\juce_events\native</Filter>
</ClCompile>
@ -2256,6 +2329,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_events\juce_events.cpp">
<Filter>JUCE Modules\juce_events</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_events\juce_events.mm">
<Filter>JUCE Modules\juce_events</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\colour\juce_Colour.cpp">
<Filter>JUCE Modules\juce_graphics\colour</Filter>
</ClCompile>
@ -2778,6 +2854,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\images\juce_ImageFileFormat.cpp">
<Filter>JUCE Modules\juce_graphics\images</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\native\juce_CoreGraphicsContext_mac.mm">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\native\juce_Direct2DGraphicsContext_windows.cpp">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClCompile>
@ -2808,6 +2887,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\native\juce_Fonts_linux.cpp">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\native\juce_Fonts_mac.mm">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\native\juce_GraphicsContext_android.cpp">
<Filter>JUCE Modules\juce_graphics\native</Filter>
</ClCompile>
@ -2907,6 +2989,9 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\juce_graphics.cpp">
<Filter>JUCE Modules\juce_graphics</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\juce_graphics.mm">
<Filter>JUCE Modules\juce_graphics</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\juce_graphics_Harfbuzz.cpp">
<Filter>JUCE Modules\juce_graphics</Filter>
</ClCompile>
@ -3183,12 +3268,21 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\accessibility\juce_Accessibility_android.cpp">
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\accessibility\juce_Accessibility_ios.mm">
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\accessibility\juce_Accessibility_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\accessibility\juce_Accessibility_windows.cpp">
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\accessibility\juce_AccessibilityElement_windows.cpp">
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\accessibility\juce_AccessibilitySharedCode_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers_test.cpp">
<Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>
</ClCompile>
@ -3210,33 +3304,63 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_FileChooser_android.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_FileChooser_ios.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_FileChooser_linux.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_FileChooser_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_FileChooser_windows.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_MainMenu_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_MouseCursor_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_NativeMessageBox_android.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_NativeMessageBox_ios.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_NativeMessageBox_linux.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_NativeMessageBox_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_NativeMessageBox_windows.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_NSViewComponentPeer_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_ScopedDPIAwarenessDisabler.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_UIViewComponentPeer_ios.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_VBlank_windows.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_Windowing_android.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_Windowing_ios.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_Windowing_linux.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_Windowing_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_Windowing_windows.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
@ -3246,9 +3370,15 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_WindowUtils_android.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_WindowUtils_ios.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_WindowUtils_linux.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_WindowUtils_mac.mm">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\native\juce_WindowUtils_windows.cpp">
<Filter>JUCE Modules\juce_gui_basics\native</Filter>
</ClCompile>
@ -3390,100 +3520,118 @@
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\juce_gui_basics.cpp">
<Filter>JUCE Modules\juce_gui_basics</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CodeDocument.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\juce_gui_basics.mm">
<Filter>JUCE Modules\juce_gui_basics</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CodeDocument.cpp">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.cpp">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.cpp">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.cpp">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.cpp">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\documents\juce_FileBasedDocument.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\documents\juce_FileBasedDocument.cpp">
<Filter>JUCE Modules\juce_gui_extra\documents</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_ColourSelector.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_ColourSelector.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_LiveConstantEditor.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_LiveConstantEditor.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_PreferencesPanel.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_PreferencesPanel.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_PushNotifications.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_PushNotifications.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_SplashScreen.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_SplashScreen.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_WebControlRelays.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_WebControlRelays.cpp">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_ActiveXComponent_windows.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_ActiveXComponent_windows.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_AndroidViewComponent.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_AndroidViewComponent.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_HWNDComponent_windows.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_AppleRemote_mac.mm">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_PushNotifications_android.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_HWNDComponent_windows.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_PushNotifications_ios.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_NSViewComponent_mac.mm">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_PushNotifications_mac.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_PushNotifications_android.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_SystemTrayIcon_linux.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_PushNotifications_ios.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_SystemTrayIcon_mac.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_PushNotifications_mac.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_SystemTrayIcon_windows.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_SystemTrayIcon_linux.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_WebBrowserComponent_android.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_SystemTrayIcon_mac.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_WebBrowserComponent_linux.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_SystemTrayIcon_windows.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_WebBrowserComponent_windows.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_UIViewComponent_ios.mm">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_XEmbedComponent_linux.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_WebBrowserComponent_android.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\juce_gui_extra.cpp">
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_WebBrowserComponent_linux.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_WebBrowserComponent_mac.mm">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_WebBrowserComponent_windows.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_XEmbedComponent_linux.cpp">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\juce_gui_extra.cpp">
<Filter>JUCE Modules\juce_gui_extra</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\juce_gui_extra.mm">
<Filter>JUCE Modules\juce_gui_extra</Filter>
</ClCompile>
<ClCompile Include="..\..\JuceLibraryCode\BinaryData.cpp">
@ -7535,94 +7683,94 @@
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_basics\juce_gui_basics.h">
<Filter>JUCE Modules\juce_gui_basics</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CodeDocument.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CodeDocument.h">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CodeEditorComponent.h">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CodeTokeniser.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CodeTokeniser.h">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniser.h">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniserFunctions.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_CPlusPlusCodeTokeniserFunctions.h">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_LuaCodeTokeniser.h">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\code_editor\juce_XMLCodeTokeniser.h">
<Filter>JUCE Modules\juce_gui_extra\code_editor</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\detail\juce_WebControlRelayEvents.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\detail\juce_WebControlRelayEvents.h">
<Filter>JUCE Modules\juce_gui_extra\detail</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\documents\juce_FileBasedDocument.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\documents\juce_FileBasedDocument.h">
<Filter>JUCE Modules\juce_gui_extra\documents</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\embedding\juce_ActiveXControlComponent.h">
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\embedding\juce_AndroidViewComponent.h">
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\embedding\juce_HWNDComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\embedding\juce_HWNDComponent.h">
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\embedding\juce_NSViewComponent.h">
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\embedding\juce_UIViewComponent.h">
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\embedding\juce_XEmbedComponent.h">
<Filter>JUCE Modules\juce_gui_extra\embedding</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_AnimatedAppComponent.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_AppleRemote.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_AppleRemote.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_BubbleMessageComponent.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_ColourSelector.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_ColourSelector.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_KeyMappingEditorComponent.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_LiveConstantEditor.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_LiveConstantEditor.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_PreferencesPanel.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_PreferencesPanel.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_PushNotifications.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_PushNotifications.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_RecentlyOpenedFilesList.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_SplashScreen.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_SplashScreen.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_WebControlParameterIndexReceiver.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_WebControlParameterIndexReceiver.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\misc\juce_WebControlRelays.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\misc\juce_WebControlRelays.h">
<Filter>JUCE Modules\juce_gui_extra\misc</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\juce-8.0.4-windows\JUCE\modules\juce_gui_extra\native\juce_NSViewFrameWatcher_mac.h">
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\native\juce_NSViewFrameWatcher_mac.h">
<Filter>JUCE Modules\juce_gui_extra\native</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\Downloads\JUCE\modules\juce_gui_extra\juce_gui_extra.h">
@ -7714,6 +7862,6 @@
<None Include="..\..\..\..\..\Downloads\JUCE\modules\juce_graphics\unicode\sheenbidi\JUCE_CHANGES.txt">
<Filter>JUCE Modules\juce_graphics\unicode\sheenbidi</Filter>
</None>
<None Include="packages.config" />
<None Include="packages.config"/>
</ItemGroup>
</Project>
</Project>

View File

@ -69,7 +69,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=&quot;Harmonizer&quot;;JucePlugin_Desc=&quot;Harmonizer&quot;;JucePlugin_Manufacturer=&quot;yourcompany&quot;;JucePlugin_ManufacturerWebsite=&quot;www.yourcompany.com&quot;;JucePlugin_ManufacturerEmail=&quot;&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=&quot;1.0.0&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=&quot;Fx&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=&quot;HarmonizerAU&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=&quot;yourcompany: Harmonizer&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=&quot;com.yourcompany.Harmonizer.factory&quot;;JucePlugin_ARADocumentArchiveID=&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0&quot;;JucePlugin_ARACompatibleArchiveIDs=&quot;&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
@ -83,7 +83,7 @@
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\&quot;Harmonizer\&quot;;JucePlugin_Desc=\&quot;Harmonizer\&quot;;JucePlugin_Manufacturer=\&quot;yourcompany\&quot;;JucePlugin_ManufacturerWebsite=\&quot;www.yourcompany.com\&quot;;JucePlugin_ManufacturerEmail=\&quot;\&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\&quot;1.0.0\&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\&quot;Fx\&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\&quot;HarmonizerAU\&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\&quot;yourcompany: Harmonizer\&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\&quot;com.yourcompany.Harmonizer.factory\&quot;;JucePlugin_ARADocumentArchiveID=\&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\&quot;;JucePlugin_ARACompatibleArchiveIDs=\&quot;\&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
@ -103,6 +103,10 @@
<Lib>
<AdditionalDependencies>Harmonizer.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Lib>
<PostBuildEvent>
<Command>xcopy &quot;..\..\Builds\VisualStudio2022\x64\Debug\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Midl>
@ -115,7 +119,7 @@
<ClCompile>
<Optimization>Full</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=&quot;Harmonizer&quot;;JucePlugin_Desc=&quot;Harmonizer&quot;;JucePlugin_Manufacturer=&quot;yourcompany&quot;;JucePlugin_ManufacturerWebsite=&quot;www.yourcompany.com&quot;;JucePlugin_ManufacturerEmail=&quot;&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=&quot;1.0.0&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=&quot;Fx&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=&quot;HarmonizerAU&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=&quot;yourcompany: Harmonizer&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=&quot;com.yourcompany.Harmonizer.factory&quot;;JucePlugin_ARADocumentArchiveID=&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0&quot;;JucePlugin_ARACompatibleArchiveIDs=&quot;&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
@ -129,7 +133,7 @@
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\&quot;Harmonizer\&quot;;JucePlugin_Desc=\&quot;Harmonizer\&quot;;JucePlugin_Manufacturer=\&quot;yourcompany\&quot;;JucePlugin_ManufacturerWebsite=\&quot;www.yourcompany.com\&quot;;JucePlugin_ManufacturerEmail=\&quot;\&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\&quot;1.0.0\&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\&quot;Fx\&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\&quot;HarmonizerAU\&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\&quot;yourcompany: Harmonizer\&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\&quot;com.yourcompany.Harmonizer.factory\&quot;;JucePlugin_ARADocumentArchiveID=\&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\&quot;;JucePlugin_ARACompatibleArchiveIDs=\&quot;\&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
@ -152,6 +156,14 @@
<Lib>
<AdditionalDependencies>Harmonizer.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Lib>
<PreBuildEvent>
<Command>cmd /c &quot;(cd /d ..\..\Assets\web &amp;&amp; npm run build &amp;&amp; npm run zip)&quot;
</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>xcopy &quot;..\..\Builds\VisualStudio2022\x64\Release\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_plugin_client\juce_audio_plugin_client_Standalone.cpp">

View File

@ -69,7 +69,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=&quot;Harmonizer&quot;;JucePlugin_Desc=&quot;Harmonizer&quot;;JucePlugin_Manufacturer=&quot;yourcompany&quot;;JucePlugin_ManufacturerWebsite=&quot;www.yourcompany.com&quot;;JucePlugin_ManufacturerEmail=&quot;&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=&quot;1.0.0&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=&quot;Fx&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=&quot;HarmonizerAU&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=&quot;yourcompany: Harmonizer&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=&quot;com.yourcompany.Harmonizer.factory&quot;;JucePlugin_ARADocumentArchiveID=&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0&quot;;JucePlugin_ARACompatibleArchiveIDs=&quot;&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
@ -83,7 +83,7 @@
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\&quot;Harmonizer\&quot;;JucePlugin_Desc=\&quot;Harmonizer\&quot;;JucePlugin_Manufacturer=\&quot;yourcompany\&quot;;JucePlugin_ManufacturerWebsite=\&quot;www.yourcompany.com\&quot;;JucePlugin_ManufacturerEmail=\&quot;\&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\&quot;1.0.0\&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\&quot;Fx\&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\&quot;HarmonizerAU\&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\&quot;yourcompany: Harmonizer\&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\&quot;com.yourcompany.Harmonizer.factory\&quot;;JucePlugin_ARADocumentArchiveID=\&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\&quot;;JucePlugin_ARACompatibleArchiveIDs=\&quot;\&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
@ -122,7 +122,8 @@ if not exist &quot;$(OutDir)\\Harmonizer.vst3\Contents\x86_64-win\&quot; (
</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>copy /Y &quot;$(OutDir)\Harmonizer.dll&quot; &quot;$(OutDir)\Harmonizer.vst3\Contents\x86_64-win\Harmonizer.vst3&quot;
<Command>xcopy &quot;..\..\Builds\VisualStudio2022\x64\Debug\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I
copy /Y &quot;$(OutDir)\Harmonizer.dll&quot; &quot;$(OutDir)\Harmonizer.vst3\Contents\x86_64-win\Harmonizer.vst3&quot;
set manifest_generated=0
if &quot;$(PROCESSOR_ARCHITECTURE)&quot; == &quot;ARM64&quot; if &quot;$(Platform)&quot; == &quot;x64&quot; (
call :_generate_manifest
@ -168,7 +169,7 @@ echo : Info: VST3 manifest generation is disabled for Harmonizer because a AMD64
<ClCompile>
<Optimization>Full</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=&quot;Harmonizer&quot;;JucePlugin_Desc=&quot;Harmonizer&quot;;JucePlugin_Manufacturer=&quot;yourcompany&quot;;JucePlugin_ManufacturerWebsite=&quot;www.yourcompany.com&quot;;JucePlugin_ManufacturerEmail=&quot;&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=&quot;1.0.0&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=&quot;Fx&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=&quot;HarmonizerAU&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=&quot;yourcompany: Harmonizer&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=&quot;com.yourcompany.Harmonizer.factory&quot;;JucePlugin_ARADocumentArchiveID=&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0&quot;;JucePlugin_ARACompatibleArchiveIDs=&quot;&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
@ -182,7 +183,7 @@ echo : Info: VST3 manifest generation is disabled for Harmonizer because a AMD64
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\&quot;Harmonizer\&quot;;JucePlugin_Desc=\&quot;Harmonizer\&quot;;JucePlugin_Manufacturer=\&quot;yourcompany\&quot;;JucePlugin_ManufacturerWebsite=\&quot;www.yourcompany.com\&quot;;JucePlugin_ManufacturerEmail=\&quot;\&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\&quot;1.0.0\&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\&quot;Fx\&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\&quot;HarmonizerAU\&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\&quot;yourcompany: Harmonizer\&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\&quot;com.yourcompany.Harmonizer.factory\&quot;;JucePlugin_ARADocumentArchiveID=\&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\&quot;;JucePlugin_ARACompatibleArchiveIDs=\&quot;\&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
@ -206,7 +207,8 @@ echo : Info: VST3 manifest generation is disabled for Harmonizer because a AMD64
<AdditionalDependencies>Harmonizer.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Lib>
<PreBuildEvent>
<Command>if &quot;$(PROCESSOR_ARCHITECTURE)&quot; == &quot;x86&quot; if defined PROCESSOR_ARCHITEW6432 (
<Command>cmd /c &quot;(cd /d ..\..\Assets\web &amp;&amp; npm run build &amp;&amp; npm run zip)&quot;
if &quot;$(PROCESSOR_ARCHITECTURE)&quot; == &quot;x86&quot; if defined PROCESSOR_ARCHITEW6432 (
echo : Warning: Toolchain configuration issue! You are using a 32-bit toolchain to compile a 64-bit target on a 64-bit system. This may cause problems with the build system. To resolve this, use the x64 version of MSBuild. You can invoke it directly at: &quot;&lt;VisualStudioPathHere&gt;/MSBuild/Current/Bin/amd64/MSBuild.exe&quot; Or, use the &quot;x64 Native Tools Command Prompt&quot; script.
)
if not exist &quot;$(OutDir)\\Harmonizer.vst3\&quot; (
@ -224,7 +226,8 @@ if not exist &quot;$(OutDir)\\Harmonizer.vst3\Contents\x86_64-win\&quot; (
</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>copy /Y &quot;$(OutDir)\Harmonizer.dll&quot; &quot;$(OutDir)\Harmonizer.vst3\Contents\x86_64-win\Harmonizer.vst3&quot;
<Command>xcopy &quot;..\..\Builds\VisualStudio2022\x64\Release\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I
copy /Y &quot;$(OutDir)\Harmonizer.dll&quot; &quot;$(OutDir)\Harmonizer.vst3\Contents\x86_64-win\Harmonizer.vst3&quot;
set manifest_generated=0
if &quot;$(PROCESSOR_ARCHITECTURE)&quot; == &quot;ARM64&quot; if &quot;$(Platform)&quot; == &quot;x64&quot; (
call :_generate_manifest

View File

@ -67,7 +67,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=&quot;Harmonizer&quot;;JucePlugin_Desc=&quot;Harmonizer&quot;;JucePlugin_Manufacturer=&quot;yourcompany&quot;;JucePlugin_ManufacturerWebsite=&quot;www.yourcompany.com&quot;;JucePlugin_ManufacturerEmail=&quot;&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=&quot;1.0.0&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=&quot;Fx&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=&quot;HarmonizerAU&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=&quot;yourcompany: Harmonizer&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=&quot;com.yourcompany.Harmonizer.factory&quot;;JucePlugin_ARADocumentArchiveID=&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0&quot;;JucePlugin_ARACompatibleArchiveIDs=&quot;&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
@ -81,7 +81,7 @@
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\&quot;Harmonizer\&quot;;JucePlugin_Desc=\&quot;Harmonizer\&quot;;JucePlugin_Manufacturer=\&quot;yourcompany\&quot;;JucePlugin_ManufacturerWebsite=\&quot;www.yourcompany.com\&quot;;JucePlugin_ManufacturerEmail=\&quot;\&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\&quot;1.0.0\&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\&quot;Fx\&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\&quot;HarmonizerAU\&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\&quot;yourcompany: Harmonizer\&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\&quot;com.yourcompany.Harmonizer.factory\&quot;;JucePlugin_ARADocumentArchiveID=\&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\&quot;;JucePlugin_ARACompatibleArchiveIDs=\&quot;\&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
@ -100,6 +100,10 @@
<Manifest>
<AdditionalManifestFiles/>
</Manifest>
<PostBuildEvent>
<Command>xcopy &quot;..\..\Builds\VisualStudio2022\x64\Debug\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Midl>
@ -112,7 +116,7 @@
<ClCompile>
<Optimization>Full</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=&quot;Harmonizer&quot;;JucePlugin_Desc=&quot;Harmonizer&quot;;JucePlugin_Manufacturer=&quot;yourcompany&quot;;JucePlugin_ManufacturerWebsite=&quot;www.yourcompany.com&quot;;JucePlugin_ManufacturerEmail=&quot;&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=&quot;1.0.0&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=&quot;Fx&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=&quot;HarmonizerAU&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=&quot;yourcompany: Harmonizer&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=&quot;com.yourcompany.Harmonizer.factory&quot;;JucePlugin_ARADocumentArchiveID=&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0&quot;;JucePlugin_ARACompatibleArchiveIDs=&quot;&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
@ -126,7 +130,7 @@
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\JUCE\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\&quot;Harmonizer\&quot;;JucePlugin_Desc=\&quot;Harmonizer\&quot;;JucePlugin_Manufacturer=\&quot;yourcompany\&quot;;JucePlugin_ManufacturerWebsite=\&quot;www.yourcompany.com\&quot;;JucePlugin_ManufacturerEmail=\&quot;\&quot;;JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\&quot;1.0.0\&quot;;JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\&quot;Fx\&quot;;JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\&quot;HarmonizerAU\&quot;;JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\&quot;yourcompany: Harmonizer\&quot;;JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\&quot;com.yourcompany.Harmonizer.factory\&quot;;JucePlugin_ARADocumentArchiveID=\&quot;com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\&quot;;JucePlugin_ARACompatibleArchiveIDs=\&quot;\&quot;;JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
@ -148,6 +152,14 @@
<Manifest>
<AdditionalManifestFiles/>
</Manifest>
<PreBuildEvent>
<Command>cmd /c &quot;(cd /d ..\..\Assets\web &amp;&amp; npm run build &amp;&amp; npm run zip)&quot;
</Command>
</PreBuildEvent>
<PostBuildEvent>
<Command>xcopy &quot;..\..\Builds\VisualStudio2022\x64\Release\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I
</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\..\..\..\Downloads\JUCE\modules\juce_audio_plugin_client\VST3\juce_VST3ManifestHelper.cpp"/>

View File

@ -58,8 +58,9 @@
<EXPORTFORMATS>
<VS2022 targetFolder="Builds/VisualStudio2022">
<CONFIGURATIONS>
<CONFIGURATION isDebug="1" name="Debug" targetName="Harmonizer"/>
<CONFIGURATION isDebug="0" name="Release" targetName="Harmonizer"/>
<CONFIGURATION isDebug="1" name="Debug" targetName="Harmonizer" postbuildCommand="xcopy &quot;..\..\Builds\VisualStudio2022\x64\Debug\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I"/>
<CONFIGURATION isDebug="0" name="Release" targetName="Harmonizer" prebuildCommand="cmd /c &quot;(cd /d ..\..\Assets\web &amp;&amp; npm run build &amp;&amp; npm run zip)&quot;"
postbuildCommand="xcopy &quot;..\..\Builds\VisualStudio2022\x64\Release\VST3\Harmonizer.vst3\&quot; &quot;C:\Users\mickl\Documents\VstPlugins\Harmonizer.vst3&quot; /Y /E /I&#10;&#10;"/>
</CONFIGURATIONS>
<MODULEPATHS>
<MODULEPATH id="juce_audio_basics" path="../../../Downloads/JUCE/modules"/>

View File

@ -45,11 +45,13 @@ void Helmholtz::iosamples(const t_float* in, t_float* out, int size)
int mask = framesize - 1;
int outindex = 0;
// call analysis function when it is time
if (!(timeindex & (framesize / overlap - 1))) analyzeframe();
while (size--)
{
// call analysis function when it is time
if (!(timeindex & (framesize / overlap - 1))) analyzeframe();
inputbuf[timeindex++] = *in++;
//out[outindex++] = processbuf[timeindex++];
timeindex &= mask;

View File

@ -50,8 +50,8 @@ against another DSP framework, you need to define t_float, and you need to
include Ron Mayer's fft or similar functionality. */
#include "mayer_fft.h"
#define REALFFT mayer_realfft
#define REALIFFT mayer_realifft
#define REALFFT fft.realfft
#define REALIFFT fft.realifft
/***********************************************************************/
@ -104,6 +104,7 @@ private:
t_float fidelity;
t_float biasfactor;
t_float minrms;
MayerFFT fft;
};
#endif // #ifndef Helmholtz_H

View File

@ -174,12 +174,33 @@ WebViewPluginAudioProcessorEditor::WebViewPluginAudioProcessorEditor(WebViewPlug
webComponent = new SinglePageBrowser(options);
addAndMakeVisible(*webComponent);
webComponent->goToURL(localDevServerAddress);
//webComponent.goToURL (WebBrowserComponent::getResourceProviderRoot());
#if DEBUG
setSize(500, 500);
webComponent->goToURL(localDevServerAddress);
#else
webComponent->goToURL (WebBrowserComponent::getResourceProviderRoot());
#endif
setSize(800, 436);
startTimerHz(60);
/*for (int i = 0; i < processorRef.parameters.sliderIds.size(); ++i) {
slider_attatchments.push_back(new
WebSliderParameterAttachment(
*processorRef.state.getParameter(processorRef.parameters.sliderIds[i]),
*slider_relays.back(),
processorRef.state.undoManager));
}
for (int i = 0; i < processorRef.parameters.toggleIds.size(); ++i) {
toggle_attatchments.push_back(new
WebToggleButtonParameterAttachment(
*processorRef.state.getParameter(processorRef.parameters.toggleIds[i]),
*toggle_relays.back(),
processorRef.state.undoManager));
}*/
}
void WebViewPluginAudioProcessorEditor::paint(Graphics& g)

View File

@ -23,6 +23,10 @@ public:
// Prevent page loads from navigating away from our single page web app
bool pageAboutToLoad(const String& newURL) override;
bool pageisLoaded = false;
void pageFinishedLoading(const String& newURL) override {
pageisLoaded = true;
}
};
//==============================================================================
@ -60,6 +64,37 @@ public:
void timerCallback() override
{
if(webComponent->pageisLoaded){
webComponent->pageisLoaded = false;
reload_count = 5;
}
if (reload_count) {
if (--reload_count == 0) {
for (auto* slider : slider_attatchments) {
slider->sendInitialUpdate();
}
for (auto* toggle : toggle_attatchments) {
toggle->sendInitialUpdate();
}
/*for (int i = 0; i < processorRef.parameters.sliderIds.size(); ++i) {
slider_attatchments.push_back(new
WebSliderParameterAttachment(
*processorRef.state.getParameter(processorRef.parameters.sliderIds[i]),
*slider_relays.back(),
processorRef.state.undoManager));
}
for (int i = 0; i < processorRef.parameters.toggleIds.size(); ++i) {
toggle_attatchments.push_back(new
WebToggleButtonParameterAttachment(
*processorRef.state.getParameter(processorRef.parameters.toggleIds[i]),
*toggle_relays.back(),
processorRef.state.undoManager));
}*/
}
}
static constexpr size_t numFramesBuffered = 5;
SpinLock::ScopedLockType lock{ processorRef.midiLock };
@ -80,9 +115,19 @@ public:
DynamicObject::Ptr d(new DynamicObject());
d->setProperty("notes", notes);
d->setProperty("input_pitch", processorRef.shifter.getInputPitch());
d->setProperty("output_pitch", processorRef.shifter.getOutputPitch());
webComponent->emitEventIfBrowserIsVisible("midNoteData", d.get());
d->clear();
if (processorRef.shifter.GetAutoTuneEnable()) {
d->setProperty("input_pitch", processorRef.shifter.getInputPitch());
d->setProperty("output_pitch", processorRef.shifter.getOutputPitch());
}
else {
d->setProperty("input_pitch", -1);
d->setProperty("output_pitch", -1);
}
webComponent->emitEventIfBrowserIsVisible("autoTuneData", d.get());
}
private:
@ -98,6 +143,7 @@ private:
SinglePageBrowser* webComponent = nullptr;
std::deque<Array<var>> spectrumDataFrames;
int reload_count = 0;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WebViewPluginAudioProcessorEditor)
};

View File

@ -68,6 +68,12 @@ void WebViewPluginAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer,
shifter.SetPortamentoTime(state.getParameterAsValue("portTime").getValue());
shifter.SetHarmonyMix(state.getParameterAsValue("harmonyMix").getValue());
shifter.SetAutoTuneEnable(state.getParameterAsValue("autoTuneEnabled").getValue());
shifter.SetFreeze(state.getParameterAsValue("freezeEnabled").getValue());
shifter.SetFreezePitchAdjust(state.getParameterAsValue("freezePitch").getValue());
shifter.SetFreezeVolume(state.getParameterAsValue("freezeVolume").getValue());
shifter.SetPanWidth(state.getParameterAsValue("panWidth").getValue());
juce::AudioBuffer<float> const_buff;
const_buff.makeCopyOf(buffer);
shifter.Process(const_buff.getArrayOfReadPointers(), (float**)buffer.getArrayOfWritePointers(), buffer.getNumSamples());
@ -89,10 +95,15 @@ void WebViewPluginAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer,
//==============================================================================
void WebViewPluginAudioProcessor::getStateInformation(juce::MemoryBlock& destData)
{
juce::ignoreUnused(destData);
auto out_state = state.copyState();
std::unique_ptr<juce::XmlElement> xml(out_state.createXml());
copyXmlToBinary(*xml, destData);
}
void WebViewPluginAudioProcessor::setStateInformation(const void* data, int sizeInBytes)
{
juce::ignoreUnused(data, sizeInBytes);
std::unique_ptr<juce::XmlElement> xmlState(getXmlFromBinary(data, sizeInBytes));
if (xmlState.get() != nullptr && xmlState->hasTagName(state.state.getType()))
state.replaceState(juce::ValueTree::fromXml(*xmlState));
}

View File

@ -86,6 +86,27 @@ public:
"Portamento Speed",
NormalisableRange<float> {0.001f, 0.2f, .001f},
.01f);
sliderIds.push_back("freezePitch");
addToLayout<AudioParameterFloat>(layout,
ParameterID("freezePitch"),
"Freeze pitch",
NormalisableRange<float> {-12.0f, 12.0f, 1.00f},
0.0f);
sliderIds.push_back("freezeVolume");
addToLayout<AudioParameterFloat>(layout,
ParameterID("freezeVolume"),
"Freeze Volume",
NormalisableRange<float> {0.0f, 1.0f, .01f},
0.5f);
sliderIds.push_back("panWidth");
addToLayout<AudioParameterFloat>(layout,
ParameterID("panWidth"),
"Pan Width",
NormalisableRange<float> {0.0f, 1.0f, .01f},
0.5f);
toggleIds.push_back("autoTuneEnabled");
@ -93,6 +114,12 @@ public:
ParameterID("autoTuneEnabled"),
"AutoTune Enabled",
false);
toggleIds.push_back("freezeEnabled");
addToLayout<AudioParameterBool>(layout,
ParameterID("freezeEnabled"),
"Freeze Enabled",
false);
}

View File

@ -28,13 +28,14 @@ void Shifter::Init(float samplerate, int samplesPerBlock)
{
sample_rate_ = samplerate;
blocksize = samplesPerBlock;
out_midi_smoother.SetFrameTime((float)samplesPerBlock / samplerate);
out_midi_smoother.SetFrameTime((float)256 / samplerate);
volume = 1;
helm.setframesize(1024);
helm.setoverlap(1);
helm.setoverlap(2);
for (int i = 0; i < MAX_VOICES; ++i)
{
voices[i].Init(samplerate);
freeze_voices[i].Init(samplerate);
}
for (int i = 0; i < BUFFER_SIZE; ++i)
{
@ -45,18 +46,21 @@ void Shifter::Init(float samplerate, int samplesPerBlock)
for (int i = 0; i < 8192; ++i) {
cos_lookup[i] = cos(2 * PI_F * i / 8192.0);
}
in_period = 0;
}
void Shifter::Process(const float* const* in,
float** out,
size_t size)
{
DetectPitch(in, out, size);
SetRates();
// for (size_t i = 0; i < size; ++i) {
// out[0][i] = 0;
// }
GetSamples(out, in[0], size);
for (size_t i = 0; i < size; i += 256) {
size_t offset = i;
size_t lefover_size = std::min((size_t)256, size - i);
DetectPitch(in, out, lefover_size, offset);
SetRates();
GetSamples(out, in[0], lefover_size, offset);
}
//for (size_t i = 0; i < size; ++i)
//{
// // out[0][i] = osc.Process();
@ -77,7 +81,7 @@ float findMedian(float a, float b, float c) {
}
void Shifter::DetectPitch(const float* const* in, float** out, size_t size)
void Shifter::DetectPitch(const float* const* in, float** out, size_t size, size_t offset)
{
// detect current pitch
// pitch_detect.update(in[0], size);
@ -96,16 +100,16 @@ void Shifter::DetectPitch(const float* const* in, float** out, size_t size)
// current_pitch = findMedian(last_freqs[0], last_freqs[1], last_freqs[2]);
// in_period = 1.0 / current_pitch * 48000;
helm.iosamples(in[0], out[0], size);
helm.iosamples(in[0]+offset, out[0]+offset, size);
float period = helm.getperiod();
float fidel = helm.getfidelity();
//DBG("frequency: " << 48000 / period << " fidel: " << fidel);
// Adjustable filter amount (0.0f = no filtering, 1.0f = max filtering)
static float in_period_filter_amount = 0.5f; // You can expose this as a parameter
const float in_period_filter_amount = 0.5f; // You can expose this as a parameter
if (fidel > 0.95) {
// Smoothly filter in_period changes
// Smoothly filter in_`period changes
in_period = in_period * in_period_filter_amount + period * (1.0f - in_period_filter_amount);
}
float in_freq = sample_rate_ / in_period;
@ -127,7 +131,45 @@ float Shifter::GetOutputEnvelopePeriod(int out_voice) {
return in_period * formant_preserve + voices[out_voice].CurrentPeriod() * (1.0 - formant_preserve);
}
float Shifter::GetOutputEnvelopePeriodFreeze(int freeze_voice) {
//TODO add something so that low pitch ratios end up reducing formant_preservation
return freeze_period * formant_preserve + freeze_voices[freeze_voice].CurrentPeriod() * (1.0 - formant_preserve);
}
int Shifter::GetPeakIndex() {
static float current_index = 0;
float smooth = 1 / 200.0f;
int diff = in_playhead - current_index;
if (diff < 0)
diff += BUFFER_SIZE;
if (diff < in_period * 2) {
diff = last_max_index - current_index;
if (diff < -(BUFFER_SIZE / 2))
diff += BUFFER_SIZE;
if (diff > BUFFER_SIZE / 2)
diff -= BUFFER_SIZE;
float adjust = (float)diff * smooth;
if (adjust > 1 || adjust < -1) {
int dummy = 0;
}
current_index += adjust;
if ((int)current_index > BUFFER_SIZE) {
current_index -= BUFFER_SIZE;
}
if((int)current_index < 0) {
current_index += BUFFER_SIZE;
}
return (int)current_index;
}
else {
current_index += in_period;
if (current_index > BUFFER_SIZE) {
current_index -= BUFFER_SIZE;
}
}
float threshold = .0075f;
int index = in_playhead - in_period * 2;
if (index < 0)
index += BUFFER_SIZE;
@ -139,8 +181,17 @@ int Shifter::GetPeakIndex() {
{
//float val = fabs(in_buffer[index]);
float val = in_buffer[index];
int period_difference = index - last_max_index;
if (period_difference < 0)
period_difference += BUFFER_SIZE;
//prefer peaks near last peak or near next peak
/*if(!((period_difference > in_period * (0-threshold) && period_difference < in_period* (0+threshold)) || (period_difference > in_period * (1-threshold) && period_difference < in_period * (1+threshold)))) {
val *= 0.75f;
}*/
if (val > max_value)
{
max_index = index;
max_value = val;
}
@ -149,42 +200,10 @@ int Shifter::GetPeakIndex() {
index -= BUFFER_SIZE;
}
}
return max_index;
last_max_index = max_index;
return (int)current_index;
}
//void Shifter::AddInterpolatedFrame(int voice, int max_index, float resampling_period) {
// float period_ratio = resampling_period / out_periods[voice];
// float f_index;
// f_index = max_index - resampling_period;
// if (f_index < 0)
// {
// f_index += BUFFER_SIZE;
// }
// float mult = 0;
// int out_index = out_playhead;
// for (int j = 0; j < resampling_period * 2; ++j)
// {
// // mult = .5
// // * (1 - cosf(2 * PI_F * j / (period_to_use * 2 - 1)));
// float interp = f_index - (int)f_index;
// mult = .5
// * (1 - cos_lookup[(int)((float)j / (resampling_period * 2.0) * 8191.0)]);
// float value = ((1 - interp) * in_buffer[(int)f_index] + (interp)*in_buffer[(int)(f_index + 1) % 8192]) * mult;
// out_buffer[0][out_index] += value * (1 - out_panning[voice]);
// out_buffer[1][out_index] += value * out_panning[voice];
//
//
// f_index += period_ratio;
// if (f_index >= BUFFER_SIZE)
// {
// f_index -= BUFFER_SIZE;
// }
// if (++out_index >= BUFFER_SIZE)
// {
// out_index -= BUFFER_SIZE;
// }
// }
//}
void Shifter::AddInterpolatedFrame(int voice, int max_index, float resampling_period) {
float period_ratio = in_period / resampling_period;
@ -228,8 +247,24 @@ void Shifter::AddInterpolatedFrame(int voice, int max_index, float resampling_pe
}
}
void Shifter::GetSamples(float** output, const float* input, size_t size)
void Shifter::GetSamples(float** output, const float* input, size_t size, size_t offset)
{
if (freeze_needs_copy) {
freeze_needs_copy = false;
//copy current buffer to freeze buffer
int index = GetPeakIndex();
memset(freeze_buffer, 0, sizeof(freeze_buffer));
CopyInputToFreezeBuffer(index);
//init freeze voices
for (int i = 0; i < MAX_VOICES; ++i) {
//freeze_voices[i].Init(sample_rate_);
if (voices[i].IsActive()) {
freeze_voices[i].Trigger(voices[i].GetMidiNote());
freeze_voices[i].panning = voices[i].panning;
freeze_voices[i].SetPortamentoTime(0.05f);
}
}
}
for (int i = 0; i < size; ++i)
{
@ -251,6 +286,20 @@ void Shifter::GetSamples(float** output, const float* input, size_t size)
}
}
//add freeze samples if necessary
for (int out_p = 0; out_p < MAX_VOICES; ++out_p)
{
freeze_voices[out_p].Process();
if (!freeze_voices[out_p].IsActive()) continue;
if (freeze_voices[out_p].PeriodOverflow())
{
float resampling_period = GetOutputEnvelopePeriodFreeze(out_p);
//add samples centered on that max
AddFreezeToOutput(out_p, resampling_period);
}
}
if (out_period_counter > out_period)
{
out_period_counter -= out_period;
@ -270,13 +319,13 @@ void Shifter::GetSamples(float** output, const float* input, size_t size)
//add input samples
in_buffer[in_playhead] = input[i];
in_buffer[in_playhead] = input[i+offset];
//output samples, set to 0
for (int ch = 0; ch < 2; ++ch) {
output[ch][i] = out_buffer[ch][out_playhead];
output[ch][i+offset] = out_buffer[ch][out_playhead];
if (!enable_autotune) {
output[ch][i] += input[i] * melody_mix;
output[ch][i+offset] += input[i+offset] * melody_mix;
}
out_buffer[ch][out_playhead] = 0;
}
@ -328,4 +377,88 @@ void Shifter::SetHarmonyMix(float mix) {
harmony_mix = 1.0f;
melody_mix = (1.0f - mix) * 2.0f;
}
}
void Shifter::CopyInputToFreezeBuffer(int max_index) {
freeze_period = in_period;
float period_ratio = 1;
float f_index;
f_index = max_index - in_period;
if (f_index < 0)
{
f_index += BUFFER_SIZE;
}
float mult = 0;
for (int j = 0; j < in_period * 2; ++j)
{
mult = .5 * (1 - cos_lookup[(int)((float)j / (in_period * 2.0) * 8191.0)]);
float value = in_buffer[(int)f_index] * mult;
freeze_buffer[j] = value;
f_index += 1;
if (f_index >= BUFFER_SIZE)
{
f_index -= BUFFER_SIZE;
}
}
}
void Shifter::AddFreezeToOutput(int voice, float resampling_period) {
float period_ratio = freeze_period / resampling_period;
float f_index;
f_index = 0;
if (f_index < 0)
{
f_index += BUFFER_SIZE;
}
float mult = 0;
int out_index = out_playhead;
for (int j = 0; j < resampling_period * 2; ++j)
{
// mult = .5
// * (1 - cosf(2 * PI_F * j / (period_to_use * 2 - 1)));
float interp = f_index - (int)f_index;
//mult = .5 * (1 - cos_lookup[(int)((float)j / (resampling_period * 2.0) * 8191.0)]);
float value = ((1 - interp) * freeze_buffer[(int)f_index] + (interp)*freeze_buffer[(int)(f_index + 1) % 8192]);
value *= freeze_voices[voice].CurrentAmplitude();
out_buffer[0][out_index] += value * freeze_voices[voice].GetPanning(0) * freeze_volume;
out_buffer[1][out_index] += value * freeze_voices[voice].GetPanning(1) * freeze_volume;
f_index += period_ratio;
if (f_index >= BUFFER_SIZE)
{
f_index -= BUFFER_SIZE;
}
if (++out_index >= BUFFER_SIZE)
{
out_index -= BUFFER_SIZE;
}
}
}
void Shifter::SetFreeze(bool freeze) {
if (!freeze_mode && freeze) {
freeze_needs_copy = true;
}
else if (freeze_mode && !freeze) {
//release freeze voices
for (int i = 0; i < MAX_VOICES; ++i) {
freeze_voices[i].Release();
}
}
freeze_mode = freeze;
}
void Shifter::SetFreezePitchAdjust(float val) {
for(int i = 0; i < MAX_VOICES; ++i) {
freeze_voices[i].SetPitchAdjust(val);
}
}
void Shifter::SetPanWidth(float val) {
for (int i = 0; i < MAX_VOICES; ++i) {
freeze_voices[i].SetPanWidth(val);
voices[i].SetPanWidth(val);
}
}

View File

@ -10,67 +10,67 @@
template <typename T, size_t max_capacity>
class circ_queue {
public:
circ_queue() {
head = buffer;
tail = buffer;
size = 0;
capacity = max_capacity;
}
circ_queue() {
head = buffer;
tail = buffer;
size = 0;
capacity = max_capacity;
}
void push(T val) {
if (size == max_capacity) {
pop();
}
*tail = val;
if (++tail >= buffer + max_capacity) {
tail -= max_capacity;
}
size++;
//*head = val;
}
void push(T val) {
if (size == max_capacity) {
pop();
}
*tail = val;
if (++tail >= buffer + max_capacity) {
tail -= max_capacity;
}
size++;
//*head = val;
}
void clear() {
head = buffer;
tail = buffer;
size = 0;
}
void clear() {
head = buffer;
tail = buffer;
size = 0;
}
T pop() {
if (size > 0) {
T to_ret = *head;
if (++head >= buffer + max_capacity) {
head -= max_capacity;
}
--size;
return to_ret;
}
else {
return T();
}
}
T pop() {
if (size > 0) {
T to_ret = *head;
if (++head >= buffer + max_capacity) {
head -= max_capacity;
}
--size;
return to_ret;
}
else {
return T();
}
}
T& get(int indx) {
T* ret_ptr = head + indx;
if (ret_ptr >= buffer + max_capacity) {
ret_ptr -= max_capacity;
}
return *ret_ptr;
}
T& get(int indx) {
T* ret_ptr = head + indx;
if (ret_ptr >= buffer + max_capacity) {
ret_ptr -= max_capacity;
}
return *ret_ptr;
}
T& operator[](int indx) {
T* ret_ptr = head + indx;
if (ret_ptr >= buffer + max_capacity) {
ret_ptr -= max_capacity;
}
return *ret_ptr;
}
T& operator[](int indx) {
T* ret_ptr = head + indx;
if (ret_ptr >= buffer + max_capacity) {
ret_ptr -= max_capacity;
}
return *ret_ptr;
}
size_t capacity;
// int size() { return capacity; }
size_t size;
T buffer[max_capacity];
T* head;
T* tail;
size_t capacity;
// int size() { return capacity; }
size_t size;
T buffer[max_capacity];
T* head;
T* tail;
};
@ -78,149 +78,164 @@ public:
class MidiPitchSmoother {
public:
MidiPitchSmoother() {
tau = .1;
dt = 2048.0f / 48000.0f;
PcorrPrev = 60.0f;
PtargPrev = 60;
depth = 1.0f;
}
void SetFrameTime(float frame_time) {
dt = frame_time;
}
void SetDepth(float d) {
// clamp to [0,1]
if (d < 0.0f) d = 0.0f;
if (d > 1.0f) d = 1.0f;
depth = d;
}
MidiPitchSmoother() {
tau = .1;
dt = 2048.0f / 48000.0f;
PcorrPrev = 60.0f;
PtargPrev = 60;
depth = 1.0f;
inputPrev = 0;
}
void SetFrameTime(float frame_time) {
dt = frame_time;
}
void SetDepth(float d) {
// clamp to [0,1]
if (d < 0.0f) d = 0.0f;
if (d > 1.0f) d = 1.0f;
depth = d;
}
void SetTimeConstant(float t) {
tau = t;
}
float update(float Pdet, int Ptarget) {
// Detect large jump (new note)
float diff = Pdet - (int)Pdet;
if (Ptarget != PtargPrev) {
// Immediately reset to new note
PcorrPrev = diff;
PtargPrev = Ptarget;
inputPrev = Pdet;
return Ptarget+ PcorrPrev;
}
PtargPrev = Ptarget;
diff = Pdet - inputPrev;
void SetTimeConstant(float t) {
tau = t;
}
float update(float Pdet, int Ptarget) {
// Detect large jump (new note)
float diff = Pdet - (int)(Pdet+.5);
// Compute smoothing coefficient
float alpha = 1.0 - std::exp(-dt / tau);
if (Ptarget != PtargPrev) {
// Immediately reset to new note
PcorrPrev = diff;
PtargPrev = Ptarget;
inputPrev = Pdet;
return Ptarget + PcorrPrev;
}
PtargPrev = Ptarget;
diff = Pdet - inputPrev;
// Compute smoothed pitch toward target
float PcorrFull = PcorrPrev + alpha * (0 - PcorrPrev) * depth + (1 - depth) * diff;
// Compute smoothing coefficient
float alpha = 1.0 - std::exp(-dt / tau);
// Apply depth: scale the correction amount
inputPrev = Pdet;
PcorrPrev = PcorrFull;
return Ptarget + PcorrFull;
}
// Compute smoothed pitch toward target
float PcorrFull = PcorrPrev + alpha * (0 - PcorrPrev) * depth + (1 - depth) * diff;
// Apply depth: scale the correction amount
inputPrev = Pdet;
PcorrPrev = PcorrFull;
return Ptarget + PcorrFull;
}
private:
float tau; // Time constant (s)
float dt; // Frame time (s)
float PcorrPrev; // Previous corrected pitch (MIDI)
int PtargPrev; // Previous corrected pitch (MIDI)
float depth; // Amount of correction applied [0..1]
float inputPrev;
float tau; // Time constant (s)
float dt; // Frame time (s)
float PcorrPrev; // Previous corrected pitch (MIDI)
int PtargPrev; // Previous corrected pitch (MIDI)
float depth; // Amount of correction applied [0..1]
float inputPrev;
};
class Shifter {
public:
void Init(float samplerate, int samplesPerBlock);
void Process(const float* const* in,
float** out,
size_t size);
void Init(float samplerate, int samplesPerBlock);
void Process(const float* const* in,
float** out,
size_t size);
void AddMidiNote(int note);
void RemoveMidiNote(int note);
void AddMidiNote(int note);
void RemoveMidiNote(int note);
void SetFormantPreserve(float val) { formant_preserve = val; }
void SetAutoTuneSpeed(float val);
void SetAutoTuneDepth(float val);
void SetPortamentoTime(float time) {
for (int i = 0; i < MAX_VOICES; ++i) {
voices[i].SetPortamentoTime(time);
}
void SetAutoTuneSpeed(float val);
void SetAutoTuneDepth(float val);
void SetPortamentoTime(float time) {
for (int i = 0; i < MAX_VOICES; ++i) {
voices[i].SetPortamentoTime(time);
}
}
float getInputPitch() const { return sample_rate_ / in_period; }
float getOutputPitch() const { return sample_rate_ / out_period; }
void SetHarmonyMix(float mix);
void SetHarmonyMix(float mix);
void SetAutoTuneEnable(bool enable) { enable_autotune = enable; }
bool GetAutoTuneEnable() { return enable_autotune; }
void SetFreeze(bool);
void SetFreezePitchAdjust(float val);
void SetFreezeVolume(float val) { freeze_volume = val; }
void SetPanWidth(float val);
float out_midi = 40;
ShifterVoice voices[MAX_VOICES];
float out_midi = 40;
ShifterVoice voices[MAX_VOICES];
ShifterVoice freeze_voices[MAX_VOICES];
private:
void DetectPitch(const float* const* in, float** out, size_t size);
void SetRates();
void GetSamples(float** output, const float* input, size_t size);
float GetOutputEnvelopePeriod(int out_voice);
int GetPeakIndex();
void AddInterpolatedFrame(int voice, int max_index, float period_to_use);
void DetectPitch(const float* const* in, float** out, size_t size, size_t offset);
void SetRates();
void GetSamples(float** output, const float* input, size_t size, size_t offset);
float GetOutputEnvelopePeriod(int out_voice);
float GetOutputEnvelopePeriodFreeze(int freeze_voice);
int GetPeakIndex();
void AddInterpolatedFrame(int voice, int max_index, float period_to_use);
void AddFreezeToOutput(int voice, float resampling_period);
void CopyInputToFreezeBuffer(int);
Helmholtz helm;
// GranularSustain player;
Helmholtz helm;
// GranularSustain player;
int selected_sample;
bool playing;
bool looping;
bool loop_engaged;
float play_head;
float rate_factor;
float sample_freq = 440;
float freq_target = 440;
float last_freq = 440;
double current_pitch = 440;
double smear_thresh = .085;
double smear_step = 0.003;
bool onset_trigger = false;
bool pitch_trigger = false;
int selected_sample;
bool playing;
bool looping;
bool loop_engaged;
float play_head;
float rate_factor;
float sample_freq = 440;
float freq_target = 440;
float last_freq = 440;
double current_pitch = 440;
double smear_thresh = .085;
double smear_step = 0.003;
bool onset_trigger = false;
bool pitch_trigger = false;
float harmony_mix = 0.0f;
float melody_mix = 0.0f;
bool freeze_needs_copy;
int trigger_bank;
int trigger_bank;
circ_queue<float, 3> prev_freqs;
circ_queue<float, 3> prev_freqs;
float formant_preserve = 0;
float formant_preserve = 0;
float volume;
float pitch_adj;
bool last_record;
int record_playhead;
bool dry_wet = false;
bool is_pitched = true;
float last_freqs[3];
float in_buffer[BUFFER_SIZE];
float out_buffer[2][BUFFER_SIZE];
int out_playhead = 0;
int in_playhead = 0;
float volume;
float pitch_adj;
bool last_record;
int record_playhead;
bool dry_wet = false;
bool is_pitched = true;
float last_freqs[3];
float in_buffer[BUFFER_SIZE];
float out_buffer[2][BUFFER_SIZE];
float freeze_buffer[BUFFER_SIZE];
int out_playhead = 0;
int in_playhead = 0;
int last_autotune_midi = -1;
float out_period_filter_amount = 0.7f; // You can expose this as a parameter
float out_period = 0; //C3
float in_period = 366.936;
float out_period_counter = 0;
float cos_lookup[8192];
float sample_rate_;
int blocksize;
bool freeze_mode = false;
float out_period = 0; //C3
float in_period = 366.936;
float out_period_counter = 0;
float cos_lookup[8192];
float sample_rate_;
int blocksize;
bool enable_autotune = false;
MidiPitchSmoother out_midi_smoother;
float freeze_period;
float freeze_volume = 1;
int last_max_index = 0;
MidiPitchSmoother out_midi_smoother;
};
#endif

View File

@ -52,6 +52,8 @@ http://crca.ucsd.edu/~msp/software.html */
* of work. -msp
*/
#include "mayer_fft.h"
#define REAL float
#define GOOD_TRIG
@ -62,8 +64,7 @@ http://crca.ucsd.edu/~msp/software.html */
#if defined(GOOD_TRIG)
#define FHT_SWAP(a,b,t) {(t)=(a);(a)=(b);(b)=(t);}
#define TRIG_VARS \
int t_lam=0;
#define TRIG_INIT(k,c,s) \
{ \
int i; \
@ -92,133 +93,21 @@ http://crca.ucsd.edu/~msp/software.html */
#define TRIG_RESET(k,c,s)
#endif
#if defined(FAST_TRIG)
#define TRIG_VARS \
REAL t_c,t_s;
#define TRIG_INIT(k,c,s) \
{ \
t_c = costab[k]; \
t_s = sintab[k]; \
c = 1; \
s = 0; \
}
#define TRIG_NEXT(k,c,s) \
{ \
REAL t = c; \
c = t*t_c - s*t_s; \
s = t*t_s + s*t_c; \
}
#define TRIG_RESET(k,c,s)
#endif
static REAL halsec[20] =
{
0,
0,
.54119610014619698439972320536638942006107206337801,
.50979557910415916894193980398784391368261849190893,
.50241928618815570551167011928012092247859337193963,
.50060299823519630134550410676638239611758632599591,
.50015063602065098821477101271097658495974913010340,
.50003765191554772296778139077905492847503165398345,
.50000941253588775676512870469186533538523133757983,
.50000235310628608051401267171204408939326297376426,
.50000058827484117879868526730916804925780637276181,
.50000014706860214875463798283871198206179118093251,
.50000003676714377807315864400643020315103490883972,
.50000000919178552207366560348853455333939112569380,
.50000000229794635411562887767906868558991922348920,
.50000000057448658687873302235147272458812263401372
};
static REAL costab[20] =
{
.00000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768847,
.92387953251128675612818318939678828682241662586364,
.98078528040323044912618223613423903697393373089333,
.99518472667219688624483695310947992157547486872985,
.99879545620517239271477160475910069444320361470461,
.99969881869620422011576564966617219685006108125772,
.99992470183914454092164649119638322435060646880221,
.99998117528260114265699043772856771617391725094433,
.99999529380957617151158012570011989955298763362218,
.99999882345170190992902571017152601904826792288976,
.99999970586288221916022821773876567711626389934930,
.99999992646571785114473148070738785694820115568892,
.99999998161642929380834691540290971450507605124278,
.99999999540410731289097193313960614895889430318945,
.99999999885102682756267330779455410840053741619428
};
static REAL sintab[20] =
{
1.0000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768846,
.38268343236508977172845998403039886676134456248561,
.19509032201612826784828486847702224092769161775195,
.09801714032956060199419556388864184586113667316749,
.04906767432741801425495497694268265831474536302574,
.02454122852291228803173452945928292506546611923944,
.01227153828571992607940826195100321214037231959176,
.00613588464915447535964023459037258091705788631738,
.00306795676296597627014536549091984251894461021344,
.00153398018628476561230369715026407907995486457522,
.00076699031874270452693856835794857664314091945205,
.00038349518757139558907246168118138126339502603495,
.00019174759731070330743990956198900093346887403385,
.00009587379909597734587051721097647635118706561284,
.00004793689960306688454900399049465887274686668768
};
static REAL coswrk[20] =
{
.00000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768847,
.92387953251128675612818318939678828682241662586364,
.98078528040323044912618223613423903697393373089333,
.99518472667219688624483695310947992157547486872985,
.99879545620517239271477160475910069444320361470461,
.99969881869620422011576564966617219685006108125772,
.99992470183914454092164649119638322435060646880221,
.99998117528260114265699043772856771617391725094433,
.99999529380957617151158012570011989955298763362218,
.99999882345170190992902571017152601904826792288976,
.99999970586288221916022821773876567711626389934930,
.99999992646571785114473148070738785694820115568892,
.99999998161642929380834691540290971450507605124278,
.99999999540410731289097193313960614895889430318945,
.99999999885102682756267330779455410840053741619428
};
static REAL sinwrk[20] =
{
1.0000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768846,
.38268343236508977172845998403039886676134456248561,
.19509032201612826784828486847702224092769161775195,
.09801714032956060199419556388864184586113667316749,
.04906767432741801425495497694268265831474536302574,
.02454122852291228803173452945928292506546611923944,
.01227153828571992607940826195100321214037231959176,
.00613588464915447535964023459037258091705788631738,
.00306795676296597627014536549091984251894461021344,
.00153398018628476561230369715026407907995486457522,
.00076699031874270452693856835794857664314091945205,
.00038349518757139558907246168118138126339502603495,
.00019174759731070330743990956198900093346887403385,
.00009587379909597734587051721097647635118706561284,
.00004793689960306688454900399049465887274686668768
};
#define SQRT2_2 0.70710678118654752440084436210484
#define SQRT2 2*0.70710678118654752440084436210484
void mayer_fht(REAL* fz, int n)
void MayerFFT::fht(REAL* fz, int n)
{
/* REAL a,b;
REAL c1,s1,s2,c2,s3,c3,s4,c4;
REAL f0,g0,f1,g1,f2,g2,f3,g3; */
int k, k1, k2, k3, k4, kx;
REAL* fi, * fn, * gi;
TRIG_VARS;
int t_lam = 0;
for (k1 = 1, k2 = 0; k1 < n; k1++)
{
@ -360,42 +249,42 @@ void mayer_fht(REAL* fz, int n)
} while (k4 < n);
}
void mayer_fft(int n, REAL* real, REAL* imag)
{
REAL a, b, c, d;
REAL q, r, s, t;
int i, j, k;
for (i = 1, j = n - 1, k = n / 2; i < k; i++, j--) {
a = real[i]; b = real[j]; q = a + b; r = a - b;
c = imag[i]; d = imag[j]; s = c + d; t = c - d;
real[i] = (q + t) * .5; real[j] = (q - t) * .5;
imag[i] = (s - r) * .5; imag[j] = (s + r) * .5;
}
mayer_fht(real, n);
mayer_fht(imag, n);
}
//void mayer_fft(int n, REAL* real, REAL* imag)
//{
// REAL a, b, c, d;
// REAL q, r, s, t;
// int i, j, k;
// for (i = 1, j = n - 1, k = n / 2; i < k; i++, j--) {
// a = real[i]; b = real[j]; q = a + b; r = a - b;
// c = imag[i]; d = imag[j]; s = c + d; t = c - d;
// real[i] = (q + t) * .5; real[j] = (q - t) * .5;
// imag[i] = (s - r) * .5; imag[j] = (s + r) * .5;
// }
// mayer_fht(real, n);
// mayer_fht(imag, n);
//}
//
//void mayer_ifft(int n, REAL* real, REAL* imag)
//{
// REAL a, b, c, d;
// REAL q, r, s, t;
// int i, j, k;
// mayer_fht(real, n);
// mayer_fht(imag, n);
// for (i = 1, j = n - 1, k = n / 2; i < k; i++, j--) {
// a = real[i]; b = real[j]; q = a + b; r = a - b;
// c = imag[i]; d = imag[j]; s = c + d; t = c - d;
// imag[i] = (s + r) * 0.5; imag[j] = (s - r) * 0.5;
// real[i] = (q - t) * 0.5; real[j] = (q + t) * 0.5;
// }
//}
void mayer_ifft(int n, REAL* real, REAL* imag)
{
REAL a, b, c, d;
REAL q, r, s, t;
int i, j, k;
mayer_fht(real, n);
mayer_fht(imag, n);
for (i = 1, j = n - 1, k = n / 2; i < k; i++, j--) {
a = real[i]; b = real[j]; q = a + b; r = a - b;
c = imag[i]; d = imag[j]; s = c + d; t = c - d;
imag[i] = (s + r) * 0.5; imag[j] = (s - r) * 0.5;
real[i] = (q - t) * 0.5; real[j] = (q + t) * 0.5;
}
}
void mayer_realfft(int n, REAL* real)
void MayerFFT::realfft(int n, REAL* real)
{
REAL a, b;
int i, j, k;
mayer_fht(real, n);
fht(real, n);
for (i = 1, j = n - 1, k = n / 2; i < k; i++, j--) {
a = real[i];
b = real[j];
@ -404,7 +293,7 @@ void mayer_realfft(int n, REAL* real)
}
}
void mayer_realifft(int n, REAL* real)
void MayerFFT::realifft(int n, REAL* real)
{
REAL a, b;
int i, j, k;
@ -415,5 +304,5 @@ void mayer_realifft(int n, REAL* real)
real[j] = (a - b);
real[i] = (a + b);
}
mayer_fht(real, n);
fht(real, n);
}

View File

@ -3,7 +3,114 @@
#define REAL float
void mayer_realfft(int n, REAL* real);
void mayer_realifft(int n, REAL* real);
//void mayer_realfft(int n, REAL* real);
//void mayer_realifft(int n, REAL* real);
class MayerFFT {
public:
void realfft(int n, REAL* real);
void realifft(int n, REAL* real);
MayerFFT() :halsec{
0,
0,
.54119610014619698439972320536638942006107206337801,
.50979557910415916894193980398784391368261849190893,
.50241928618815570551167011928012092247859337193963,
.50060299823519630134550410676638239611758632599591,
.50015063602065098821477101271097658495974913010340,
.50003765191554772296778139077905492847503165398345,
.50000941253588775676512870469186533538523133757983,
.50000235310628608051401267171204408939326297376426,
.50000058827484117879868526730916804925780637276181,
.50000014706860214875463798283871198206179118093251,
.50000003676714377807315864400643020315103490883972,
.50000000919178552207366560348853455333939112569380,
.50000000229794635411562887767906868558991922348920,
.50000000057448658687873302235147272458812263401372
},
costab{
.00000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768847,
.92387953251128675612818318939678828682241662586364,
.98078528040323044912618223613423903697393373089333,
.99518472667219688624483695310947992157547486872985,
.99879545620517239271477160475910069444320361470461,
.99969881869620422011576564966617219685006108125772,
.99992470183914454092164649119638322435060646880221,
.99998117528260114265699043772856771617391725094433,
.99999529380957617151158012570011989955298763362218,
.99999882345170190992902571017152601904826792288976,
.99999970586288221916022821773876567711626389934930,
.99999992646571785114473148070738785694820115568892,
.99999998161642929380834691540290971450507605124278,
.99999999540410731289097193313960614895889430318945,
.99999999885102682756267330779455410840053741619428
},
sintab{
1.0000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768846,
.38268343236508977172845998403039886676134456248561,
.19509032201612826784828486847702224092769161775195,
.09801714032956060199419556388864184586113667316749,
.04906767432741801425495497694268265831474536302574,
.02454122852291228803173452945928292506546611923944,
.01227153828571992607940826195100321214037231959176,
.00613588464915447535964023459037258091705788631738,
.00306795676296597627014536549091984251894461021344,
.00153398018628476561230369715026407907995486457522,
.00076699031874270452693856835794857664314091945205,
.00038349518757139558907246168118138126339502603495,
.00019174759731070330743990956198900093346887403385,
.00009587379909597734587051721097647635118706561284,
.00004793689960306688454900399049465887274686668768
},
coswrk{
.00000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768847,
.92387953251128675612818318939678828682241662586364,
.98078528040323044912618223613423903697393373089333,
.99518472667219688624483695310947992157547486872985,
.99879545620517239271477160475910069444320361470461,
.99969881869620422011576564966617219685006108125772,
.99992470183914454092164649119638322435060646880221,
.99998117528260114265699043772856771617391725094433,
.99999529380957617151158012570011989955298763362218,
.99999882345170190992902571017152601904826792288976,
.99999970586288221916022821773876567711626389934930,
.99999992646571785114473148070738785694820115568892,
.99999998161642929380834691540290971450507605124278,
.99999999540410731289097193313960614895889430318945,
.99999999885102682756267330779455410840053741619428
},
sinwrk{
1.0000000000000000000000000000000000000000000000000,
.70710678118654752440084436210484903928483593768846,
.38268343236508977172845998403039886676134456248561,
.19509032201612826784828486847702224092769161775195,
.09801714032956060199419556388864184586113667316749,
.04906767432741801425495497694268265831474536302574,
.02454122852291228803173452945928292506546611923944,
.01227153828571992607940826195100321214037231959176,
.00613588464915447535964023459037258091705788631738,
.00306795676296597627014536549091984251894461021344,
.00153398018628476561230369715026407907995486457522,
.00076699031874270452693856835794857664314091945205,
.00038349518757139558907246168118138126339502603495,
.00019174759731070330743990956198900093346887403385,
.00009587379909597734587051721097647635118706561284,
.00004793689960306688454900399049465887274686668768
}
{
}
private:
void fht(REAL* fz, int n);
REAL halsec[20];
REAL costab[20];
REAL sintab[20];
REAL coswrk[20];
REAL sinwrk[20];
};
#endif

View File

@ -45,7 +45,24 @@ void ShifterVoice::Trigger(int midi_note) {
// Retrigger envelope
amplitude_envelope_.Retrigger(false);
onoff_ = true;
float pan_min = 0;
float pan_max = 1;
if(pan_width < .5f)
pan_max = .1 + (pan_width * 2 * .9f);
else
pan_min = (pan_width - .5f) * 2 * .9f;
bool pan_left = rand() % 2;
panning = rand() / (float)RAND_MAX;
panning = pan_min + (panning * (pan_max - pan_min));
if (pan_left) {
panning = .5 - panning * .5f;
}
else {
panning = .5 + panning * .5f;
}
}
void ShifterVoice::Release() {
@ -54,7 +71,7 @@ void ShifterVoice::Release() {
void ShifterVoice::Process() {
current_amplitude = amplitude_envelope_.Process(onoff_);
current_period_ = sample_rate_ / mtof(portamento_.Process((float)current_midi));
current_period_ = sample_rate_ / mtof(portamento_.Process((float)current_midi + pitch_adjust));
period_counter++;
overflow_ = period_counter >= current_period_;
if (overflow_) {
@ -93,4 +110,8 @@ float ShifterVoice::GetPanning(int channel) const {
case 1:
return panning > .5 ? 1.0 : panning * 2.0f;
}
}
void ShifterVoice::SetPitchAdjust(float adj) {
pitch_adjust = adj;
}

View File

@ -32,8 +32,12 @@ public:
void SetAdsrTimes(float attack, float decay, float release);
float GetPanning(int channel) const;
int GetMidiNote() const { return current_midi; }
void SetPitchAdjust(float);
void SetPanWidth(float val) { pan_width = val; }
bool onoff_;
float panning;
private:
Port portamento_;
Adsr amplitude_envelope_;
@ -44,5 +48,6 @@ private:
float current_period_;
float current_amplitude;
float period_counter;
float panning;
float pitch_adjust = 0.0f;
float pan_width = 0.0f;
};