Old 02-03-2018, 10:16 PM   #321
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

I'm still trying to construct sysex messages to send them via csurf plugin to the control surface.
I'm able to send predefined message with the following code:
Code:
const unsigned char sysexOnline[13] = { 0xF0, 0x00, 0x20, 0x29, 0x03, 0x03, 0x12, 0x00, 0x02, 0x00, 0x01, 0x01, 0xF7 };

void SendSysex()
{

    if (midi_out) {

        MIDI_event_t msg;
        msg.frame_offset = -1;
        msg.size = sizeof(sysexOnline);
        memcpy(msg.midi_message, sysexOnline, sizeof(sysexOnline));
        midi_out->SendMsg(&msg, -1);
    }
}
How do I concatenate different types of data into msg.midi_message?
oscii-bot uses string to construct sysex messages before sending them.
It what handy.
What method should I use to concatenate text strings, integers and hex arrays in free form for my csurf plugin, written in c++?

midi_message is an unsigned char array.
fundorin is offline   Reply With Quote
Old 02-09-2018, 04:07 AM   #322
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

I want two LEDs on the controller to light up in sync with metronome tempo/pattern, where LED 1 would light on a strong beat and LED 2 on a weak beat.
For now, I'm lighting them, so that odd beat would light LED 1 and even beat would light LED 2 with the following code:

function:
Code:
double MetronomeBeats()
{
    int measures = 1;
    int cur; 
    double fullbeats = 1;
    int cdenom;
    double mea; 
    mea = TimeMap2_timeToBeats(0, GetPlayPosition(), &measures, &cur, &fullbeats, &cdenom);

    return mea;
}
loop:
Code:
            if ((int)MetronomeBeats() % 2 == 0)
            {
                if (!D[6].led)
                {
                    D[6].led = !D[6].led;
                    midi_out->Send(0xBF, D[6].cc, D[6].led, -1);
                }
                if (D[7].led)
                {
                    D[7].led = !D[7].led;
                    midi_out->Send(0xBF, D[7].cc, D[7].led, -1);
                }
            }
            else if ((int)MetronomeBeats() % 2 == 1)
            {
                if (D[6].led)
                {
                    D[6].led = !D[6].led;
                    midi_out->Send(0xBF, D[6].cc, D[6].led, -1);
                }
                if (!D[7].led)
                {
                    D[7].led = !D[7].led;
                    midi_out->Send(0xBF, D[7].cc, D[7].led, -1);
                }
            }
        }
This means that every new beat would light up one LED and turn off the other LED. The exceptions would be 5/4, 3/4, 7/8 and other odd patterns.

How do I light up LED 1 on the beginning of the odd beat in the pattern and turn it off past half of the beat and do the same for LED, but with even beats?

P.S. I know that there's a TimeMap_GetMetronomePattern function available, but have no clue of how to properly use it for this task.
fundorin is offline   Reply With Quote
Old 02-09-2018, 06:41 AM   #323
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
Default

"What method should I use to concatenate text strings, integers and hex arrays in free form for my csurf plugin, written in c++?"

Happily, "fundorin" is on my mental ignore list. Otherwise I might be in danger to propose some C code and add to the confusion.
-Michael
mschnell is offline   Reply With Quote
Old 02-09-2018, 08:29 AM   #324
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

The following code successfully solves the first part of the task, i.e. "Light LED1 (D[6]) for strong beat and LED2 (D[7]) for weak beat".

Code:
            char pattern[512];
            int size = strlen(pattern);

            TimeMap_GetMetronomePattern(0, GetPlayPosition(), pattern, size);

            int mea = MetronomeBeats();

            if (pattern[mea] - 48 == 1)
            {
                if (!D[6].led)
                {
                    D[6].led = !D[6].led;
                    midi_out->Send(0xBF, D[6].cc, D[6].led, -1);
                }
                if (D[7].led)
                {
                    D[7].led = !D[7].led;
                    midi_out->Send(0xBF, D[7].cc, D[7].led, -1);
                }
            }
			else if (pattern[measure] - 48 == 2)
			{
				if (D[6].led)
				{
					D[6].led = !D[6].led;
					midi_out->Send(0xBF, D[6].cc, D[6].led, -1);
				}
				if (!D[7].led)
				{
					D[7].led = !D[7].led;
					midi_out->Send(0xBF, D[7].cc, D[7].led, -1);
				}
			}
Now I need to figure out of how to make LEDs turn off on a half beat, so that if the metronome pattern is "1222" (or "ABBB"), LED2 would blink in tempo on beats 2-3-4, instead of constantly being lit.
fundorin is offline   Reply With Quote
Old 02-09-2018, 09:04 AM   #325
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

This might be a dirty trick, but, who cares, if it works, anyway? 🤠

Working code:
Code:
double MetronomeBeats()
{
    int measures = 1;
    int cur; 
    double fullbeats = 1;
    int cdenom;
    double mea; 
    mea = TimeMap2_timeToBeats(0, GetPlayPosition(), &measures, &cur, &fullbeats, &cdenom);
    //mea = TimeMap2_timeToBeats(0, GetPlayPosition(), 0, 0, 0, 0);

    return mea;
}
Code:
            char pattern[512];
            int size = strlen(pattern);

            TimeMap_GetMetronomePattern(0, GetPlayPosition(), pattern, size);

            int measure = MetronomeBeats();
            int halfbeat = (int)(MetronomeBeats() * 10) % 10;

            if (pattern[measure] - 48 == 1 && halfbeat < 5)
            {
                if (!D[6].led)
                {
                    D[6].led = !D[6].led;
                    midi_out->Send(0xBF, D[6].cc, D[6].led, -1);
                }
            }
            else if (D[6].led)
            {
                D[6].led = !D[6].led;
                midi_out->Send(0xBF, D[6].cc, D[6].led, -1);
            }

            if (pattern[measure] - 48 == 2 && halfbeat < 5)
            {
                if (!D[7].led)
                {
                    D[7].led = !D[7].led;
                    midi_out->Send(0xBF, D[7].cc, D[7].led, -1);
                }
            }
            else if (D[7].led)
            {
                D[7].led = !D[7].led;
                midi_out->Send(0xBF, D[7].cc, D[7].led, -1);
            }
Demo:

fundorin is offline   Reply With Quote
Old 02-09-2018, 07:44 PM   #326
nofish
Human being with feelings
 
nofish's Avatar
 
Join Date: Oct 2007
Location: home is where the heart is
Posts: 12,096
Default

Nice. And kudos for posting your working code snippets. Could come in handy for others at some point.
nofish is offline   Reply With Quote
Old 02-11-2018, 06:03 PM   #327
sai'ke
Human being with feelings
 
sai'ke's Avatar
 
Join Date: Aug 2009
Location: NL
Posts: 1,453
Default

I am wondering about the track info value I_RECINPUT, is there a way to know which one is the virtual MIDI keyboard? Or are they always the same on different systems?

For me, 6080 was the virtual keyboard and 6112 was ALL channels, but I wonder if those identifiers change if you have more devices, and whether there is a way to determine where the virtual midi keyboard will be.
sai'ke is offline   Reply With Quote
Old 02-11-2018, 10:34 PM   #328
cfillion
Human being with feelings
 
cfillion's Avatar
 
Join Date: May 2015
Location: Québec, Canada
Posts: 4,937
Default

The API documentation says that:
  • The input is MIDI if 4096 is set
  • The first 5 bits are the channel
  • The next 5 bits are the device (62=VKB, 63=all). That's 6 bits though.
Code:
6080 =
1 0 111110 00000
|   |      0 (all channels)
|   62 (VKB)
MIDI input

Last edited by cfillion; 02-12-2018 at 05:36 AM.
cfillion is offline   Reply With Quote
Old 02-12-2018, 04:57 AM   #329
sai'ke
Human being with feelings
 
sai'ke's Avatar
 
Join Date: Aug 2009
Location: NL
Posts: 1,453
Default

Ah sorry, I can't believe I read over that. But thanks for the help!

Is there a way to store custom information with a track or project? Could I for example add my own tags to the track's statechunk via SetTrackStateChunk or is this very dangerous (as in, could it lead to project corruption)?
sai'ke is offline   Reply With Quote
Old 02-25-2018, 05:22 AM   #330
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

How do I adjust FX wet/dry level via Reaper API?
fundorin is offline   Reply With Quote
Old 02-25-2018, 10:02 AM   #331
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by fundorin View Post
How do I adjust FX wet/dry level via Reaper API?
The Reaper built-in wet/dry mix for fx is the last parameter of the plugin (the second last parameter is the bypass) :

Code:
local track = reaper.GetTrack(0,0)
local fxid = 0
local lastparam = reaper.TrackFX_GetNumParams(track, fxid)-1
local drywet = 0.5
reaper.TrackFX_SetParamNormalized(track, fxid, lastparam, drywet)
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
Xenakios is offline   Reply With Quote
Old 02-25-2018, 10:13 AM   #332
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

Great. Thanks for the help.

I also wonder, how to select FX in chain?
I can get selected FX from Reaper. I can move FX up and down inside the chain, even if FX chain window isn't open (with SWS action), but how do I select FX in chain by index?

Last edited by fundorin; 02-25-2018 at 10:43 AM.
fundorin is offline   Reply With Quote
Old 02-25-2018, 01:39 PM   #333
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

I'm also interested if it's possible to somehow mark the currently selected FX (in the FX chain) in mixer?

For now, I can only move them by trial and error, or by looking at the surface's screen, if the FX chain isn't visible.
fundorin is offline   Reply With Quote
Old 02-26-2018, 05:33 AM   #334
nofish
Human being with feelings
 
nofish's Avatar
 
Join Date: Oct 2007
Location: home is where the heart is
Posts: 12,096
Default

If you use SNM_MoveOrRemoveTrackFX() for moving your FX, note that there's currently a bug in SWS:

https://github.com/reaper-oss/sws/issues/802

Which afaik should only manifest if you rely on FX GUID's in your extension plugin though.
It's fixed for the next SWS release.
nofish is offline   Reply With Quote
Old 02-26-2018, 07:10 AM   #335
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

I have "_S&M_MOVE_FX_UP" and"_S&M_MOVE_FX_DOWN" assigned to an encoder.
They are using SNM_MoveOrRemoveTrackFX function, but, for now, I'm accessing FXs only by their index and not by ID.
This should not be an issue, cause when I'll finish the FX part of my plugin, SWS will, probably, get at least ten updates or more. 🤠
fundorin is offline   Reply With Quote
Old 03-05-2018, 10:29 AM   #336
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

What is the path to the active/executable folder, if my plugin is located in "Reaper/Userplugin/plugin.dll"?

There are two files inside "Reaper/Userplugin" folder: plugin.dll and test.txt.
I need to check if test.txt exists.

The following code doesn't output "yes" to the console and I don't understand why.

Code:
// Check if file exists (can be open)
bool fexists(const string& filename) {
    ifstream ifile(filename.c_str());
    return (bool)ifile;
}
Code:
                string filePath = "test.txt";
                if (fexists(filePath)) {
                    char str[512];
                    sprintf(str, "%c\n", i);
                    ShowConsoleMsg(str);
                }
UPD. Found out that Reaper considers "c:\users\%username%\Documents\%someplugindev% " as an active folder. How do I change it to the one where my DLL plugin is located?

Last edited by fundorin; 03-05-2018 at 11:34 AM.
fundorin is offline   Reply With Quote
Old 03-05-2018, 11:47 AM   #337
azslow3
Human being with feelings
 
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
Default

General Windows way:
* the first parameter of DllMain (dll entry point) is DLL instance
* GetModuleFileName() called with this instance will return complete DLL path

If you are looking for "UserPlugins", so for Reaper directory and not exact location of the DLL, you can use:
GetResourcePath() Reaper API call and concatenate what it returns with "\\UserPlugins"
azslow3 is offline   Reply With Quote
Old 03-05-2018, 11:55 AM   #338
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

Quote:
Originally Posted by azslow3 View Post
General Windows way:
* the first parameter of DllMain (dll entry point) is DLL instance
* GetModuleFileName() called with this instance will return complete DLL path

If you are looking for "UserPlugins", so for Reaper directory and not exact location of the DLL, you can use:
GetResourcePath() Reaper API call and concatenate what it returns with "\\UserPlugins"
Great. Thanks. I've already found a function to locate Reaper executable:
const char* GetExePath()

GetResourcePath was somewhere below it. Great, thanks again.
fundorin is offline   Reply With Quote
Old 03-05-2018, 02:24 PM   #339
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

How do I get the name of the first VST, which is loaded in the FX chain of the track?
I mean, the hardcoded factory name and not the one that can be changed in the FX browser or in the FX chain.

Let's say, ReaEQ vst.
It's factory name, which is "ReaEQ (Cockos)", can be changed to anything, by user.

Like this:


What I need is to get an original factory name of the VST (VSTi, JSFX, whatever) via Reaper API. Is it possible?

I know that if the FX was renamed in the FX browser, it's name will be saved in the reaper-vstplugins64.ini or reaper-vstplugins.ini.
How do I get this particular name for the FX, which was loaded into slot 1 of the selected track?

Last edited by fundorin; 03-05-2018 at 02:34 PM.
fundorin is offline   Reply With Quote
Old 03-12-2018, 09:30 AM   #340
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

How do I get the number of visible tracks in MCP. By "visible" I mean with an eye, and "visible in the track manager". Thanks.
fundorin is offline   Reply With Quote
Old 03-17-2018, 09:42 PM   #341
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

How do I increase/decrease time signature numerator or denominator for the current time signature marker?

Last edited by fundorin; 03-23-2018 at 02:26 AM.
fundorin is offline   Reply With Quote
Old 03-29-2018, 08:36 AM   #342
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

How do I properly import third party API functions into my extension's code?
I need to import these functions from Breeder:
PHP Code:
double(*BR_GetPrevGridDivision)(double position);
double(*BR_GetNextGridDivision)(double position); 
fundorin is offline   Reply With Quote
Old 03-29-2018, 09:33 AM   #343
azslow3
Human being with feelings
 
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
Default

Quote:
Originally Posted by fundorin View Post
How do I properly import third party API functions into my extension's code?
I need to import these functions from Breeder:
PHP Code:
double(*BR_GetPrevGridDivision)(double position);
double(*BR_GetNextGridDivision)(double position); 
I think the question should be not "how" (rec->GetFunc) but "when".
There is no promise when Reaper will load your extension, so it can load it before the extension you are going to use.

I will suggest (I can be wrong) to load it (with the check you do not have it) in the instantiation of the object.
azslow3 is offline   Reply With Quote
Old 03-29-2018, 09:49 AM   #344
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

Already tried adding GetFunc at line 35. Not working.
fundorin is offline   Reply With Quote
Old 03-29-2018, 10:29 AM   #345
cfillion
Human being with feelings
 
cfillion's Avatar
 
Join Date: May 2015
Location: Québec, Canada
Posts: 4,937
Default

REAPERAPI_LoadAPI doesn't know about SWS functions (unless you modify it so it does – but you'll loose these changes every time you update your reaper_plugin_functions.h).

Code:
BR_GetPrevGridDivision = reaper_plugin_info->getFunc("BR_GetPrevGridDivision");
BR_GetNextGridDivision = reaper_plugin_info->getFunc("BR_GetNextGridDivision");
But as azslow3 said, doing this at initialization time is unreliable because your extension can be loaded before SWS.

Last edited by cfillion; 03-29-2018 at 10:43 AM.
cfillion is offline   Reply With Quote
Old 03-29-2018, 11:53 AM   #346
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

Quote:
Originally Posted by cfillion View Post
But as azslow3 said, doing this at initialization time is unreliable because your extension can be loaded before SWS.
I agree. So, what would be a proper way to define/import those functions?
fundorin is offline   Reply With Quote
Old 03-29-2018, 12:08 PM   #347
azslow3
Human being with feelings
 
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
Default

Save reaper_plugin_info in global variable and use it in csurf constructor. But only for SWS and other extensions, REAPERAPI_LoadAPI from unmodified Reaper generated file is safe to use in the entrypoint.
azslow3 is offline   Reply With Quote
Old 03-29-2018, 12:44 PM   #348
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

How do I save it as global variable? I can only reference to it via pointer. Otherwise I get errors:


Globals:


CSurf constructor:
fundorin is offline   Reply With Quote
Old 03-29-2018, 03:30 PM   #349
azslow3
Human being with feelings
 
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
Default

C programming

Code:
static reaper_plugin_info_t *reaper; // "*" is important
double(*BR_GetPrevGridDivision)(double position) = NULL;

// Inside entry point:
  reaper = reaper_plugin_info;

// Inside constructor
  if(!BR_GetPrevGridDivision)
     BR_GetPrevGridDivision = (double (*)(double))reaper->GetFunc("BR_GetPrevGridDivision");
EDIT: C++ make things a bit more complicated then they are, I was not using it for a while, check Reaper include file for right GetFunc assignment.

Last edited by azslow3; 03-29-2018 at 03:36 PM.
azslow3 is offline   Reply With Quote
Old 03-30-2018, 03:11 AM   #350
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

Quote:
Originally Posted by azslow3 View Post
C programming
Same.

Global:


Entry point:


Constructor:


Also c_surf.h:
fundorin is offline   Reply With Quote
Old 03-31-2018, 07:06 AM   #351
azslow3
Human being with feelings
 
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
Default

I have mentioned, that was "C" programming.
"C++" has to be tricked to not produce compilation warning/error.

See reaper_plugin_functions.h
So (approximately) like:
Code:
double (*func)(double);
...

void **trick = (void **)&func;
*tick = reaper->getFunc("name");
In other words, C++ does not allow you assigned function pointer to simple pointer. But you can take the address of function pointer and then use it freely (including assigned something to the address it points to).

One of the reasons I program in C++ when that make sense (only) and program in C when not
azslow3 is offline   Reply With Quote
Old 03-31-2018, 12:09 PM   #352
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

Thanks. There should be an easier way than to add pointers to pointers. Hope that Justin can clarify, which is the best way to add third-party functions to an extension.
fundorin is offline   Reply With Quote
Old 03-31-2018, 01:27 PM   #353
azslow3
Human being with feelings
 
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
Default

Quote:
Originally Posted by fundorin View Post
Thanks. There should be an easier way than to add pointers to pointers. Hope that Justin can clarify, which is the best way to add third-party functions to an extension.
If you prefer more C++ way:
Code:
func = reinterpret_cast<double (*)(double)>reaper->GetFunc("Name")
I do not think I know any other possibility
azslow3 is offline   Reply With Quote
Old 03-31-2018, 01:57 PM   #354
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

Quote:
Originally Posted by azslow3 View Post
If you prefer more C++ way:
Code:
func = reinterpret_cast<double (*)(double)>reaper->GetFunc("Name")
I do not think I know any other possibility
What I meant it an alternative way to import all available functions of the specific Reaper extension at once. SWS, at least.
Thanks, anyway. Will try once again tomorrow. 👍
fundorin is offline   Reply With Quote
Old 04-01-2018, 05:35 AM   #355
D Rocks
Human being with feelings
 
Join Date: Dec 2017
Location: Quebec, Canada
Posts: 550
Default

Hey
How do I learn c++ ? Links, Where to start recommendations?

I am assuming Reaper is in C++?

Thanks
Alex
__________________
Alex | www.drocksrecords.com | Thanks for REAPER
D Rocks is offline   Reply With Quote
Old 04-01-2018, 06:54 AM   #356
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by D Rocks View Post
How do I learn c++ ? Links, Where to start recommendations?

I am assuming Reaper is in C++?
There are numerous C++ and C resources online...But it's difficult to recommend anything that would have any immediate use for Reaper extensions development. Most books, courses and tutorials tend to stay at the level of programming command line programs, which is not the programming model used in Reaper plugins. Besides the programming language, you will need to have an understanding of lots of additional things.

My recommendation would be to not attempt C++ (or C) extension plugins programming unless it's absolutely necessary. ReaScript can use pretty much all the low level functions in the API anyway with Lua, Eel or Python. With ReaScript you also don't need to understand build systems, dlls, 32/64 bit architectures, threading and all the other numerous details that don't even have much to do with the programming language. You can even get some basic GUI stuff going with ReaScript without the massive headaches that you have to go through if you attempted that with C or C++. That said, there are things in the Reaper API that make it necessary to use C++.
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.

Last edited by Xenakios; 04-01-2018 at 06:59 AM.
Xenakios is offline   Reply With Quote
Old 04-01-2018, 08:04 AM   #357
D Rocks
Human being with feelings
 
Join Date: Dec 2017
Location: Quebec, Canada
Posts: 550
Default

Thanks alot for the infos Xenakios.
I really appreciate it.

So if its related to Reaper usage I understand that it's not useful to learn all this since the devoloppers already made it easier for us through the sub scripting langages right?

What if I want to start programming and make it a living later, would you focus on C++ or another language for futur avenues and commun use in the world in general?

Big question but just looking foran insider's opinion since I don't trust schools recommendations so much since they have to protect their own futur by telling you what you should study sometimes.

Alex
__________________
Alex | www.drocksrecords.com | Thanks for REAPER
D Rocks is offline   Reply With Quote
Old 04-01-2018, 08:45 AM   #358
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by D Rocks View Post

So if its related to Reaper usage I understand that it's not useful to learn all this since the devoloppers already made it easier for us through the sub scripting langages right?

What if I want to start programming and make it a living later, would you focus on C++ or another language for futur avenues and commun use in the world in general?
It can be useful to do the Reaper stuff via the C and C++ way, too. It just has a very steep learning curve even for doing simple things. (You might be able to get by with copying, pasting and modifying existing code at first but that doesn't really scale in the long run. You need to understand the nitty gritty details too.)

I don't know much about the current popularity of programming languages outside of audio related development. For low level audio and other multimedia applications, as well as games, C++ is the obvious choice. As far as I've understood, C++ is not very popular anymore for general purpose applications. Most applications don't need the performance and ability to do the low level things C++ allows. On the other hand, there may be legacy C and C++ code bases where companies might find C++ programmers very valuable.

I suppose Java is still used quite a lot for general purpose applications? (It's also the recommended language to do development for the Android OS.)

Swift is going to be the number 1 language for Apple platforms (iOs, MacOs.) But it's not very well supported on other platforms, as far as I've understood. (The basic language may work on Linux and maybe even Windows, but you can't do much with just the base language, you have to have libraries and frameworks too...)

Maybe in general it's not so useful to decide to just do one particular language. Once you've learned one, going to another one is not so difficult. (Though I have to say it's not very likely I will ever be able to write in Haskell myself, after using more typical imperative languages like Pascal, C++, Python and Lua... )

The bulk of the learning effort is typically the libraries and frameworks involved. (For GUI, networking, databases etc...)
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
Xenakios is offline   Reply With Quote
Old 04-01-2018, 11:54 AM   #359
fundorin
Banned
 
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
Default

I've started in January with no prior knowledge of C++.
YT helped me the most (one particular Russian channel).
Also this project by Erriez, which is the Visual Studio solution of the Reaper SDK extension example. Erriez made a fork for me, which contained only one csurf device, BCR2000.
I've used it as a starting point for my own plugin, initially commenting (disabling) almost every line, related to BCR2000 and then enabling them one by one, editing them to suite my own midi controller.
I've also downloaded a bunch of open-source Reaper plugins from Github, so I could see, how people are making their controllers to work with Reaper and for the general idea of how the example could be changed.
There are many projects available at Github, if you'd search by keyword "reaper". They can give you inspiration and some knowledge of how to write your own plugin.
https://github.com/Erriez/reaper_csurf_vs201x

P.S. Please, remove that "Alex" part of your message's body or move it to the signature part via "User CP/Edit signature" option in the forum's header. We already have one arrogant -Michael here, who's doing the same thing. One *hole is enough, I suppose. Thanks in advance.
fundorin is offline   Reply With Quote
Old 04-02-2018, 05:30 AM   #360
D Rocks
Human being with feelings
 
Join Date: Dec 2017
Location: Quebec, Canada
Posts: 550
Default

Xenakios: Thank you this is very valuable I appreciate that you took time to tell me this!

Fundorin: Thank you too! Thats very nice to know you started like this its encouraging and you made me laugh with the "sinature thing".

I understand your point and you're right it fits on the line bellow


talk to you later guys, thanks again
__________________
Alex | www.drocksrecords.com | Thanks for REAPER
D Rocks is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 07:32 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.