Newbie questions - feel free to be polite

Hi,

I’m new to juce, but i really want to get in it.
But i’ve got some problems:

  1. Topic: JuceDemoPlugin

I am tryin to build the JuceDemoPlugin as a VST Plugin (I deactivated RTAS and AU).

I compiled the JuceDemoPlugin without (except of some Warnings…) correctly:
in the Debug Folder i can see now files like those:

JuceDemoPlugin.dpm.rsr
juce_RTAS_WinUtilities.obj

JuceDemoPlugin.dpm.embed.manifest
JuceDemoPlugin.dpm.embed.manifest.res
juce_VST_Wrapper.obj

JuceDemoPlugin.dpm.intermediate.manifest
JuceDemoPlugin.dpm
JuceDemoPlugin.pdb

maybe this is a stupid question but: Where can i find the JuceDemoPlugin.dll which I can inlcude as VST?

  1. Topic: Building my One Plug-in

I am doing the tutorial atm - do you have any other hints where to start?
If I want to create a Filter - do I have to make a FFT of the input signal (Or a make use of a FIR?),
or is there already a way in juce implemented to get my input signal in the frequency domain?

Thanks for your answers,

greetz equinox

Which version of juce are you using?
1.50? 1.51?
First, I suggest to download the last revision of juce from the git repository, go to the downloads section of this site and follow the git link.
If you don’t want to install the git, just click on the first “snapshot” link you find on the git’s page.

Then:

Topic one: you built the juce demo plugin correctly. The vst plugin is the .dpm file, just rename it as .dll and it will be fine.
The .dpm extension is for rtas (protools) plugins.
I believe that the git versions of juce build plugins as .dll now.

ah ok thx! the plugin worked when I renamed it into a .dll.
I used 1.50, actually i wasn’t aware of the fact that there is a new version of juce - I build the new version today,
and JUCE is now building a .dll by itself.

Why can I use the demplugin only as a filter? The Plugin does not appear in Cubase at the list “VST-Instruments” (hitting f11).

OK my next problem is:

I want to create an “audio Plugin” out of the demo file by haydxn (which dooesn’t do anything) - I just want to learn how to implement a .dll by myself…

I declared my MainAppWindow as a AudioProcessor subclass (in MainAppWindow.h).

In my ApplicationStartup.cpp i wrote this:

// This creates new instances of the plugin…
AudioProcessor* JUCE_CALLTYPE createPluginFilter()
{
return new MainAppWindow();
}

compiling is no problem, but when I want to build the .dll file there are coming errors like this :

applicationstartup.cpp(100) : error C2259: ‘MainAppWindow’: Instanz von abstrakter Klasse kann nicht erstellt werden
1> aufgrund folgender Member:
1> “const juce::String juce::AudioProcessor::getName(void) const”: ist abstrakt
1> f:\juce und co libarys\juce\juce_amalgamated.h(17797): Siehe Deklaration von 'juce::AudioProcessor::getName’
1> “void juce::AudioProcessor::prepareToPlay(double,int)”: ist abstrakt

what I am doing wrong?

greetz Manuel

I’d seriously recommend trying the new jucer and letting its wizard create the new plugin project for you - setting up plugins is a total faff, and it’s much better to automate the process. I certainly don’t intend to ever create a plugin project by hand again!

Yeah the experimental Jucer is great, thx for the Tip.

I am now able to create “hello world” vst-plugins, oh yeah 8) 8)

OK, my next goal is to create an easy Highpass Filter Plugin -
where do I have to start at?
I discovered the IIRFilter Class -

So at first I have to set the Filter to a Highpass [void makeHighPass (double sampleRate, double frequency) throw ()]
next I have to “perform the filter” [void IIRFilter::processSamples ( float * samples, int numSamples )]

Am I right?
So now we come to my lack of VST-Knowledge - where do I get the samples from?
This question sounds easy, but I really don’t understand where a Plugin gets its “stuff to work on” becomes from.
Is there a simple Array, (a pointer on an array) where the samples are stored?
what does “numSamples” stand for?

Thanks in anticipation for your help!

The samples are stored in arrays of floats, the AudioSampleBuffer class offers various ways to access them: http://www.rawmaterialsoftware.com/api/classAudioSampleBuffer.html,

The numSamples thing is explained pretty well at http://www.rawmaterialsoftware.com/api/classAudioIODeviceCallback.html. In a plugin you’re not dealing with this class directly, but most of the hints in that doc are also valid in a plugin context.

Hope this helps.

OK my filter is working,

what do I have to do if i want to manipulate my filterfrequency with a slider?
I already created a slider (called slider…) and add it to my PluginEditor.cpp.

What code do I have to add here (PluginEditor.cpp):

void TpluginAudioProcessorEditor::sliderValueChanged (Slider* sliderThatWasMoved)
{

if (sliderThatWasMoved == slider)
{

// here :slight_smile:

}

}

and what code in the PluginProcessor.cpp?

So my problem is to link the Editor and the processor, and how do I tell the slider that its range is from 0 to 20khz?

Greetz saudick

One way to connect them could look like this: in the jucer-generated PluginEditor.cpp, a pointer to the PluginProcessor is passed to the constructor. Store this in a private field, so that later in your #sliderValueChanged(…) method you can call a setter like #setFrequency(double freq) on your PluginProcessor. Within this method, store the frequency in a private double field of the AudioProcessor, than the audio-thread can read that value from within your filter-method.

For the slider: The class is huge, but well documented at http://www.rawmaterialsoftware.com/api/classSlider.html. Have a look at the #setRange and #setSkewFactor methods, I think that’s what you’re looking for.

aahhh now it comes to this error when i want to create the vst:

1>f:\juce und co libarys\juce\amalgamation…/src/native/juce_win32_NativeCode.cpp(93) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: “windows/juce_win32_Files.cpp”: No such file or directory

whats that???

Grenze is a private double variable in The Editor Class.
In the PluginEditor Constructor i wrote ownerFilter->setFrequency(Grenze);
(the ownerFilter is a Pointer to the PluginProcessor i think?)
In my SliderValueChanged Function i wrote slider->setValue(Grenze);
and in the Processor.cpp in the preparetoplay function i wrote

    Hochpass1.makeHighPass (sampleRate, fg);
 Hochpass2.makeHighPass (sampleRate, fg);

(fg ist Grenze, set in the setFrequency function).

I cant test this… but am i on the right way?

Thanks a lot,

equinox

No idea how you’d manage to get that error, unless you’ve screwed up your files somehow, or moved some stuff around in the juce directory.

As for the slider stuff, why not look at the way the demo plugin’s slider controls its volume.