|
|
|
04-03-2008, 07:34 PM
|
#1
|
Administrator
Join Date: Jan 2005
Location: NYC
Posts: 15,721
|
The "how do I?" REAPER plug-in extension thread
If anybody wants to know how to do a particular task using the plug-in extension API, ask it here and we will either tell you, or interpret it as a request for that particular API!
-Justin
|
|
|
04-03-2008, 07:46 PM
|
#2
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
OK, this is gonna be really lame : but how do I access the Reaper project's items and their takes from the APIs?
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
|
|
|
04-03-2008, 08:09 PM
|
#3
|
Administrator
Join Date: Jan 2005
Location: NYC
Posts: 15,721
|
Quote:
Originally Posted by Xenakios
OK, this is gonna be really lame : but how do I access the Reaper project's items and their takes from the APIs?
|
Look at "GetTrackMediaItem" in reaper_plugin.h.. there are a few other functions for accessing information about those items, and modifying them. This is supported in v2.149+.
-Justin
Last edited by Justin; 04-04-2008 at 12:27 PM.
|
|
|
04-04-2008, 05:16 AM
|
#4
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Well, I guess I now know how to :
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
|
|
|
04-04-2008, 07:37 AM
|
#5
|
Code Monkey
Join Date: Sep 2007
Location: Madison, WI
Posts: 857
|
Howto:
1) Get/set track color?
2) Get/set HW/MIDI input of track?
|
|
|
04-04-2008, 11:09 AM
|
#6
|
Administrator
Join Date: Jan 2005
Location: NYC
Posts: 15,721
|
Quote:
Originally Posted by sws
Howto:
1) Get/set track color?
2) Get/set HW/MIDI input of track?
|
TODO: coming soon
-Justin
|
|
|
05-17-2008, 11:08 PM
|
#7
|
Human being with feelings
Join Date: Mar 2007
Location: Vancouver
Posts: 2,279
|
Quote:
Originally Posted by Justin
If anybody wants to know how to do a particular task using the plug-in extension API, ask it here and we will either tell you, or interpret it as a request for that particular API!
-Justin
|
What would be a good starting point for a newbie to add a few new actions or two? I'm an intermediate developer with the AHK scripting language and also the audio programming language called Csound...and I use to input hex values on tiny LCD hardware synth displays back in the day, which was quite the PITA.
Shane
__________________
"Music should be performed by the musician not by the engineer."
Michael Wagener 25th July 2005, 02:59 PM
|
|
|
05-19-2008, 09:48 PM
|
#8
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by Shan
What would be a good starting point for a newbie to add a few new actions or two? I'm an intermediate developer with the AHK scripting language and also the audio programming language called Csound...and I use to input hex values on tiny LCD hardware synth displays back in the day, which was quite the PITA.
Shane
|
The insert random Ninjam Loop example in the SDK served me well, I've furiously built my code over it in the past couple of months...
It demonstrates how to add new menu entries to the Reaper menu, how to create a simple win32 dialog and handle it's messages, how to import and use the Reaper Extension API functions from Reaper and probably some other points as well...
I could probably make my own source code public if it wasn't such a horrendous mess that would confuse the hell out of anyone looking at it...
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
|
|
|
05-20-2008, 12:20 AM
|
#9
|
Human being with feelings
Join Date: Mar 2007
Posts: 794
|
Xenakios,
That's great to know - thanks very much for the info
I'll be sure to take a look at that stuff when I'm a bit more conversant with the stuff I'm doing/have-been-doing.
Thanks Xenakios
Deric.
__________________
REAPER? Oh yes...
|
|
|
05-21-2008, 01:49 AM
|
#10
|
Human being with feelings
Join Date: Mar 2007
Location: Vancouver
Posts: 2,279
|
Quote:
Originally Posted by Xenakios
The insert random Ninjam Loop example in the SDK served me well, I've furiously built my code over it in the past couple of months...
It demonstrates how to add new menu entries to the Reaper menu, how to create a simple win32 dialog and handle it's messages, how to import and use the Reaper Extension API functions from Reaper and probably some other points as well...
|
Thanks Xen! I'll check that out. That is basically how I learnt Csound and AHK scripting. After scratching my head over the syntax etc, I just started to look a good examples of code and things started to fall into place. I'll have a look at that.
Quote:
Originally Posted by Xenakios
I could probably make my own source code public if it wasn't such a horrendous mess that would confuse the hell out of anyone looking at it...
|
I hear ya on that one mate. I have a few AHK scripts that I wouldn't even show Bevoss cuz they are quite the work of Spaghetti code.
Shane
__________________
"Music should be performed by the musician not by the engineer."
Michael Wagener 25th July 2005, 02:59 PM
|
|
|
05-25-2008, 07:15 AM
|
#11
|
Human being with feelings
Join Date: Mar 2008
Posts: 56
|
Quote:
Originally Posted by Justin
If anybody wants to know how to do a particular task using the plug-in extension API, ask it here and we will either tell you, or interpret it as a request for that particular API!
|
Hi Justin,
I'd like to know how to access time markers.
An ability to read and write their properties such as Position, BPM and time signature would be great. I've seen there is
TimeMap_timeToQN, TimeMap_QNToTime, TimeMap_GetDividedBpmAtTime,
on the todo's list in reaper_plugin_functions.h i think this comes close to what i'm looking?
Still, a function returning a list or array of marker structs and an OnTimeMapUpdate to pump the modified list back into reaper would be better (i think sws would like something for 'normal' markers as well ).
I thought of attacking this FR: http://www.cockos.com/forum/showthread.php?t=4157 as far as i know it has not been resolved yet.
I need a function to recalc the BPM for markers and update them. In fact this function is almost there: 'Markers: Time signature measure from time selection' but the problem with this is that, the markers on both ends are updated, where only the left marker should.
For making a Drag-Drop Time marker completely transparent in Reaper, a TimeMarkerChanged call coming in from Reaper after the drop, would be perfect
cheers!
|
|
|
05-25-2008, 11:18 AM
|
#12
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by shaman
TimeMap_timeToQN, TimeMap_QNToTime, TimeMap_GetDividedBpmAtTime,
|
I don't know what the 3rd function of these does but the first two are for converting between beats/seconds-based times, taking into account the tempo changes of the project. They both take in a double floating point value and return a double floating point value.
Proper APIs to add/edit/delete markers/regions/time signature+tempo changes would be great!
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
|
|
|
06-26-2009, 09:57 PM
|
#13
|
Human being with feelings
Join Date: Jun 2009
Location: vancouver
Posts: 6
|
For live work.
Quote:
Originally Posted by Justin
If anybody wants to know how to do a particular task using the plug-in extension API, ask it here and we will either tell you, or interpret it as a request for that particular API!
-Justin
|
I'm just starting to get into programming after well...probably 92? C++ seems to make sense. Anyways, what I'm wanting to do is just make it so you can assign a key command (midi)to select a particular track. for effect changes live. Also, so I can nest my other input device, Assign a key command for selecting the the fx slot in the selected track.
Wonderring if you might know of examples I could use, that would be compact just to do that as a starting point.
|
|
|
06-27-2009, 08:01 AM
|
#14
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by Rubberfrog
I'm just starting to get into programming after well...probably 92? C++ seems to make sense. Anyways, what I'm wanting to do is just make it so you can assign a key command (midi)to select a particular track. for effect changes live. Also, so I can nest my other input device, Assign a key command for selecting the the fx slot in the selected track.
Wonderring if you might know of examples I could use, that would be compact just to do that as a starting point.
|
You can do actions to select particular tracks easily. (Once you have everything else set up for programming Reaper extensions.) However opening the window of a particular fx in a track isn't supported directly by the Reaper APIS.
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
|
|
|
06-27-2009, 07:32 PM
|
#15
|
Human being with feelings
Join Date: Jun 2009
Location: vancouver
Posts: 6
|
Quote:
Originally Posted by Xenakios
You can do actions to select particular tracks easily. (Once you have everything else set up for programming Reaper extensions.) However opening the window of a particular fx in a track isn't supported directly by the Reaper APIS.
|
Hmmm... I was kind of assuming that since the fx window opens when you click the effect, the same would be true calling it from the sdk. It's really too bad the commands in the fx browser aren'ts available... I could set up my foot pedal to send midi note on off, for browsing, loading, etc, and still have my hands free for playing.
|
|
|
09-30-2009, 02:03 PM
|
#16
|
Human being with feelings
Join Date: Feb 2007
Posts: 99
|
Quote:
Originally Posted by Justin
If anybody wants to know how to do a particular task using the plug-in extension API, ask it here and we will either tell you, or interpret it as a request for that particular API!
-Justin
|
I've got a personal package to create reaper rpp project files.
This works very smooth.
But having native access through the API is very nice indeed.
However:
I'm using OSX 10.6 with python 2.6.2
Would it be possible to get reascript using that as well (for the time being)
Thanks!
Floris
|
|
|
09-30-2009, 03:14 PM
|
#17
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by klankschap
I've got a personal package to create reaper rpp project files.
This works very smooth.
But having native access through the API is very nice indeed.
However:
I'm using OSX 10.6 with python 2.6.2
Would it be possible to get reascript using that as well (for the time being)
Thanks!
Floris
|
Why could you not install the latest Python on OS-X? Can't OS-X handle multiple Python versions installed or some other problem like that?
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
|
|
|
10-01-2009, 03:37 PM
|
#18
|
Human being with feelings
Join Date: Apr 2008
Posts: 510
|
here is a very interesting hack i've found with reascript. it can be used to dump some extra / hidden information on api functions.
save to dumpfunctions.py and run from reaper :-)
Code:
#------------------------------------------------------------
# dumpfunctions.py
# reascript function parser by l.ivanov
#------------------------------------------------------------
name=chr(90)+chr(73)+chr(90)+chr(73)
ctype=chr(83)+chr(78)+chr(65)+chr(75)+chr(69)
dim=chr(76)+chr(79)+chr(78)+chr(71)
action=chr(76)+chr(73)+chr(75)+chr(69)
user=chr(89)+chr(79)+chr(85)
ctype=ctype.lower()
dim=dim.lower()
action=action.lower()
user=user.lower()
#------------------------------------------------------------
step=20
length=20
startstr=name+" is a very "+dim+" "+ctype+"... \n \n \n /\\"
startstr+=" \n | | \n | | \n"
str0="\\x\\ \n"
str1="/x/ \n"
endstr=" |_| \n o o \n \\_/ \n | \n x \n\nHi, i'm "+name
endstr+=" the "+ctype+". \n"
endstr+="Hope you find some good use of ReaScript!"
mbstr="Press ok if "+user+" "+action+" "+name+" the "+ctype
#------------------------------------------------------------
RPR_ShowConsoleMsg("")
def msg(m):
#--- reaper console
RPR_ShowConsoleMsg(m)
#--- or print with shell
#print m
#------------------------------------------------------------
lstr="";
j=0
while j<step:
lstr=" "+lstr
j+=1
msg(startstr)
#------------------------------------------------------------
i=0
while i<length:
j=0
tstr="";
while j<step:
tstr = " "+tstr
msg(tstr+str0)
j+=1
j=step
tstr=lstr;
while j>0:
msg(tstr[(step-j):]+str1)
j-=1
i+=1
#------------------------------------------------------------
msg(endstr)
RPR_MB(mbstr," ",0)
#------------------------------------------------------------
|
|
|
10-01-2009, 03:42 PM
|
#19
|
Administrator
Join Date: Mar 2007
Location: NY
Posts: 15,758
|
Quote:
Originally Posted by liteon
here is a very interesting hack i've found with reascript. it can be used to dump some extra / hidden information on api functions.
|
[img]http://img33.**************/img33/3835/captureyq.png[/img]
Last edited by schwa; 10-01-2009 at 03:45 PM.
Reason: less rude snake
|
|
|
10-01-2009, 04:15 PM
|
#20
|
Human being with feelings
Join Date: Aug 2006
Location: Berlin
Posts: 11,817
|
Hahaha. SSSSSweet.
|
|
|
10-06-2009, 09:28 AM
|
#21
|
Mortal
Join Date: Dec 2008
Location: France
Posts: 1,969
|
Quote:
Originally Posted by liteon
here is a very interesting hack i've found with reascript. it can be used to dump some extra / hidden information on api functions.
|
woo! liteon!? do you have a reascript to dump some extra / hidden information about that (beyond the fact that it's base 64)
Code:
<VST "VSTi: ReaSamplOmatic5000 (Cockos)" "reasamplomatic.dll" 0 ""
bW9zcu5e7f4AAAAAAgAAAAEAAAAAAAAAAgAAAAAAAACVAAAAAQAAAA==
AAAAAAAAAAAAAADwPwAAAAAAAOA//anx0k1iUD8AAAAAAAAAAAAAAA==
AAAA8D+amZmZmZmxP83MzMzMzOs/AAAAAAAAAAAAAAAAAAAAAPyp8Q==
0k1iQD/8qfHSTWJAPwAAAAAAAPA/AAAAAAAAAAAAAAAAAAAAAAAAAA==
AAAA8D8AAAAAAADgPwIAAAAAAAAAAAAAAAAAAAAAAPA/
>
SWS, some news about the wrapper class ? (just asking... I can imagine how you should be busy with the merge).
Or, can someone provide a ccp example messing around (*GetSetObjectState)(void* obj, char* str), i.e. an example that "parses" + updates "str" ?
[edit1] I've done some tests (see previous posts), but I really need to know what/where I should patch...
[edit2] Justin, if you read this... I'd love beeing on the dev side... drinking beers and having good laughs while reading this thread... seeing these guys struggling... Just to let you know: I think that you've invented the perfect off-shoring system, and it's free of course! But it's hard, here, in the south contries (UK, Finland, France, ...)
Last edited by Jeffos; 10-06-2009 at 09:59 AM.
|
|
|
10-06-2009, 12:16 PM
|
#22
|
Code Monkey
Join Date: Sep 2007
Location: Madison, WI
Posts: 857
|
Quote:
Originally Posted by Jeffos
SWS, some news about the wrapper class ? (just asking... I can imagine how you should be busy with the merge).
Or, can someone provide a ccp example messing around (*GetSetObjectState)(void* obj, char* str), i.e. an example that "parses" + updates "str" ?
|
Jeffos, you got it, that parsing class is a bit on hold as I'm working on the merge and some other fancy things.
The Base64 encoding of VST plugin's parameters is unique to the plugin and not really modifiable unless you know the internal data structure of the plugin. Unlikely in 99% of cases.
Take care,
Tim
|
|
|
10-06-2009, 10:04 AM
|
#23
|
Human being with feelings
Join Date: Nov 2006
Location: Belgium
Posts: 1,462
|
Quote:
Originally Posted by liteon
here is a very interesting hack i've found with reascript. it can be used to dump some extra / hidden information on api functions.
save to dumpfunctions.py and run from reaper :-)
Code:
#------------------------------------------------------------
# dumpfunctions.py
# reascript function parser by l.ivanov
#------------------------------------------------------------
name=chr(90)+chr(73)+chr(90)+chr(73)
ctype=chr(83)+chr(78)+chr(65)+chr(75)+chr(69)
dim=chr(76)+chr(79)+chr(78)+chr(71)
action=chr(76)+chr(73)+chr(75)+chr(69)
user=chr(89)+chr(79)+chr(85)
ctype=ctype.lower()
dim=dim.lower()
action=action.lower()
user=user.lower()
#------------------------------------------------------------
step=20
length=20
startstr=name+" is a very "+dim+" "+ctype+"... \n \n \n /\\"
startstr+=" \n | | \n | | \n"
str0="\\x\\ \n"
str1="/x/ \n"
endstr=" |_| \n o o \n \\_/ \n | \n x \n\nHi, i'm "+name
endstr+=" the "+ctype+". \n"
endstr+="Hope you find some good use of ReaScript!"
mbstr="Press ok if "+user+" "+action+" "+name+" the "+ctype
#------------------------------------------------------------
RPR_ShowConsoleMsg("")
def msg(m):
#--- reaper console
RPR_ShowConsoleMsg(m)
#--- or print with shell
#print m
#------------------------------------------------------------
lstr="";
j=0
while j<step:
lstr=" "+lstr
j+=1
msg(startstr)
#------------------------------------------------------------
i=0
while i<length:
j=0
tstr="";
while j<step:
tstr = " "+tstr
msg(tstr+str0)
j+=1
j=step
tstr=lstr;
while j>0:
msg(tstr[(step-j):]+str1)
j-=1
i+=1
#------------------------------------------------------------
msg(endstr)
RPR_MB(mbstr," ",0)
#------------------------------------------------------------
|
Hey,
Would you mind dumping this info somewhere in a text file and share it with us/me ?
Thanks
Yves
|
|
|
10-06-2009, 10:42 AM
|
#24
|
Mortal
Join Date: Dec 2008
Location: France
Posts: 1,969
|
... oh! yeah, I forgot belgium among the south countries !
Of course, here it is, Yves, (I had to cut the snake) :
Code:
ZIZI is a very long snake...
/\
| |
| |
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
\x\
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
/x/
|_|
o o
\_/
|
x
Hi, i'm ZIZI the snake.
Hope you find some good use of ReaScript!
|
|
|
10-29-2009, 05:45 PM
|
#25
|
Human being with feelings
Join Date: Oct 2009
Posts: 6,290
|
Using 2nd computer for FX
OK, I've put Reaper on both computer's and connected them through ethernet. Now do I open Reaper on both computer's to use the FX via ReaMote?
I like to use my Guitar Rig so do I have to install that on the FX computer, too?
Same with Absynth?
Thank you for the help.
|
|
|
04-20-2013, 01:38 PM
|
#26
|
Human being with feelings
Join Date: Jan 2013
Location: Austria
Posts: 73
|
CSurf notification about changed input monitor
Hi,
how do I get notified in csurf about a change on an input monitor of a track?
There is no CSurf_SetMonitorChange...
Same with track automation state
Please extend the API :-)
Last edited by Celphor; 04-20-2013 at 01:44 PM.
Reason: Added automation
|
|
|
04-20-2013, 04:07 PM
|
#27
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by Celphor
Hi,
how do I get notified in csurf about a change on an input monitor of a track?
There is no CSurf_SetMonitorChange...
Same with track automation state
Please extend the API :-)
|
Look here in the csurf api section : https://code.google.com/p/sws-extens...eaper_plugin.h
Automation state seems to be already supported with a dedicated virtual method (albeit just for "current track") and input monitoring notifications appear to be possible to be received via the Extended() call.
__________________
I am no longer part of the REAPER community. Please don't contact me with any REAPER-related issues.
|
|
|
04-20-2013, 04:51 PM
|
#28
|
Human being with feelings
Join Date: Jan 2013
Location: Austria
Posts: 73
|
Thank you, didn't know about the extened method yet. Will give it a try tomorrow...
|
|
|
10-04-2009, 02:01 PM
|
#29
|
Human being with feelings
Join Date: Feb 2007
Posts: 99
|
Quote:
Originally Posted by Justin
If anybody wants to know how to do a particular task using the plug-in extension API, ask it here and we will either tell you, or interpret it as a request for that particular API!
-Justin
|
it would be nice to have a function to switch to a specific project tab (and to get the current tab)
F
|
|
|
10-04-2009, 02:08 PM
|
#30
|
Human being with feelings
Join Date: Jul 2008
Location: Berlin / Germany
Posts: 832
|
Have you seen
REAPER_PLUGIN_DECLARE_APIFUNCS void *(*EnumProjects)(int idx, char *projfn, int projfnlen); // idx=-1 for "current" project, projfn can be NULL if not interested in filename
REAPER_PLUGIN_DECLARE_APIFUNCS void (*SelectProjectInstance)(ReaProject *proj);
in reaper_plugin_functions.h?
I never tried it till now, but i think they exist for this purpose.
|
|
|
10-29-2009, 05:42 PM
|
#31
|
Human being with feelings
Join Date: Oct 2009
Posts: 6,290
|
Make Reaper Master /Slave to Korg Triton Sequencer
I think I have it set to where the Triton will Slave to Reaper but I can't get it the other way around. step by step instructions would be appreciated.
Thanks
|
|
|
10-29-2009, 05:46 PM
|
#32
|
Human being with feelings
Join Date: Nov 2006
Location: Belgium
Posts: 1,462
|
Quote:
Originally Posted by dea-man
I think I have it set to where the Triton will Slave to Reaper but I can't get it the other way around. step by step instructions would be appreciated.
Thanks
|
This is a developers forum thread. Maybe you want to ask your question in the Reaper Compatibility forum
Yves
|
|
|
11-01-2009, 03:43 PM
|
#33
|
Human being with feelings
Join Date: Dec 2006
Location: UK
Posts: 789
|
How do I..."
Two things (sorry)
1 - Call OnCommand from within the MIDI editor
2 - Check if the user chose Cancel when loading a note names file
Oh In ReaScript, of course
Mike
__________________
Mike Lacey, Leicestershire, UK
|
|
|
11-02-2009, 09:08 AM
|
#34
|
Human being with feelings
Join Date: Dec 2006
Location: UK
Posts: 789
|
New MIDI API calls *AND* just like I asked plus a bit more... Thank you very much.
Queries:
MIDIEditorOnCommand is documented as returning bool - and does return TRUE. When does it return !=TRUE?
No flags parameter in MIDIEditorOnCommand(), does that matter?
__________________
Mike Lacey, Leicestershire, UK
|
|
|
12-01-2009, 07:55 AM
|
#35
|
Human being with feelings
Join Date: Aug 2009
Posts: 210
|
Getting track mute/solo state
I decided to port my BCR2000 control surface plugin for Sonar to Reaper. This has been very popular in the Sonar community because it provides quite extensive functionality (search for BCR2000 in www.sourceforge.net for the project and documentation) and now I have Reaper I miss having that functionality. I'll contribute it to the stash when done, of course.
(note: the BCR2000 does NOT support Mackie mode unlike the BCF2000 so this is not an option for BCR users)
After a day or so of reverse-engineering the existing control surface SDK source I was able to modify my code to get the core part of it working, and what I am now doing now is taking the points at which it interfaces to Sonar and changing those to call, as far as possible, the corresponding functions in Reaper.
So far I've been able to get MIDI in and out to the control surface working, and I can programmatically set the MUTE status for a track from the control surface - so the core code is essentially working - but I have now hit a rock and can't figure out from the header files and sample code how you programmatically get a track's mute and solo status BACK from Reaper, because now I need to get the full duplex bit working i.e you toggle mute/solo etc from Reaper and the control surface updates accordingly.
I simply can't find an API that appears to retrieve a track's mute or solo status. What am I missing here?.
There seems to be APIs to get track pan, volume and all the FX parameters, as there are with Sonar, but mute and solo seem oddly missing.
Experimentally I tried calling GetTrackUIVolPan and indeed the values of volume and pan are returned correctly, so they're ok. It's mute, solo, and - come to think of it - record arm as well, for which there are SET APIs but apparently no corresponding GET APIs.
Also, I'm assuming that the model here is identical to Sonar in that Reaper will call the control surface every so often (I think 15Hz refresh is the standard) and that this occurs regardless of whether or not any settings have changed in the Reaper project. It's then up to the control surface code, as it would be in Sonar, to programmatically determine whether any controlled parameter on the surface has changed, Reaper doesn't call you back specifically when the user changes a parameter from Reaper itself, as far as I can see, is this correct?.
Finally, at this stage - though I may find other things as I complete the project - I'm not sure how to manage sends and busses programmatically. In Sonar, tracks have types - standard, master and buss, and you can interrogate or set any of their properties. In Reaper there seems to be just a single master out even if I define multiple hardware outputs and I'm not quite clear how to programmatically control this - what track number, if any, would the master have?.
As for sends, I haven't yet explored the FX APIs but is Reaper treating sends as part of the FX chain programmatically or separately. I couldn't see anything obvious in the SDK APIs for this.
I think it would be a very good idea to document the SDKs, to be honest, because it would really help third parties to develop added value for Reaper. At present it is proving rather challenging to reverse-engineer from the very sparsely-commented sample code. However, I would really appreciate any clarification or assistance that you can provide; I'd love to get this ported over and I think Reaper users would find it useful.
|
|
|
12-06-2009, 10:45 AM
|
#36
|
Human being with feelings
Join Date: Dec 2006
Location: UK
Posts: 789
|
Would it be possible to implement the functionality implied by these made-up API calls below?
It wouldn't be done precisely like this I suspect, as I don't think we have a MIDINote object, so I'm asking for the functionality rather than these APIs.
Code:
int GetNumSelectedMidiNotes(MIDIEditor)
MIDINote* GetSelectedMidiNote(MIDIEditor,Index)
bool SetSelectedMidiNote(MIDIEditor, MIDINote* mn, param char, newvalue int)
"param" would be things like POS, PITCH, DURATION, VOLUME
__________________
Mike Lacey, Leicestershire, UK
|
|
|
12-15-2009, 02:55 AM
|
#37
|
Human being with feelings
Join Date: Dec 2006
Location: UK
Posts: 789
|
Translate between .rpp and raw MIDI data
How do I translate between .rpp MIDI data and raw MIDI data?
__________________
Mike Lacey, Leicestershire, UK
|
|
|
12-15-2009, 07:01 AM
|
#39
|
Human being with feelings
Join Date: Dec 2006
Location: UK
Posts: 789
|
Ooh look at that, can open and worms just everywhere.
Thanks Jeffos, it's not quite the single function call conversion I had in mind but I will look at it.
__________________
Mike Lacey, Leicestershire, UK
|
|
|
12-15-2009, 03:40 PM
|
#40
|
Mortal
Join Date: Dec 2008
Location: France
Posts: 1,969
|
... about the MIDI_eventlist approach i obviously forget http://forum.cockos.com/showthread.php?t=45430, with a cool example posted by rome. MIDI looks like a brand new place for extensions.. but padre & rome seems in the starting block for that!
Quote:
Originally Posted by MikeLacey
Ooh look at that, can open and worms just everywhere.
|
What I meant above is that, if I was sure of what I'm doing I won't use the MIDI_eventlist appoach!
I've started digging into midi too.. but directly working with chunks. It's ok for READ and it can answer some your Q's above (see bellow). The few WRITE tests I did: removing cc123, empying, .. seemed also safe but I stopped there: it seemed "too easy to be true" (and schwa didn't talk about that in the thread above, where midi selection is also aksed)
So the few things I can answer you about your Q's in the previous posts are bellow. I only talk about my "C" point of view here, but HTH!
Inside a take's chunk (GetSetObjectState(MediaItem*)), the midi event list looks like:
Code:
e 4781 90 0e 01
e 240 80 0e 00
E 269 90 10 7f
E 240 80 10 00
E 240 b0 7b 00
here 5 events: 2* note on/off on channel 1 and the famous "all notes off" (cc123 on channel 1) that ends midi takes.
- 1st token: dunno yet if it can be different from "e/E". however, lower/upper case distinguish selected events (one of yours Qs)
- 2nd token: *offset* with the previous event or with the begining of the take for the 1st event. it's not really a timing (dunno the english wording..), in short the unit is 1/2560T, e.g. 240 = 1/16. note: working with offset can be nice (copy/paste,..)
- 3 following "bytes" = classical hexa midi coding (one of your Qs, if we're talking about the same "raw data")
beware! in the middle of this gentle midi event list you can face a wicked base64 sysex!
Code:
<X 286306 0
8AECAwQF9w==
>
note: does not work with external midi source file. any tips to complete/correct these info would be appreciated..
|
|
|
Thread Tools |
|
Display Modes |
Hybrid Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -7. The time now is 03:30 PM.
|