|
|
|
02-03-2018, 10:16 PM
|
#321
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
02-09-2018, 04:07 AM
|
#322
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
02-09-2018, 06:41 AM
|
#323
|
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,690
|
"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
|
|
|
02-09-2018, 08:29 AM
|
#324
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
02-09-2018, 09:04 AM
|
#325
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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:
|
|
|
02-09-2018, 07:44 PM
|
#326
|
Human being with feelings
Join Date: Oct 2007
Location: home is where the heart is
Posts: 12,096
|
Nice. And kudos for posting your working code snippets. Could come in handy for others at some point.
|
|
|
02-11-2018, 06:03 PM
|
#327
|
Human being with feelings
Join Date: Aug 2009
Location: NL
Posts: 1,453
|
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.
|
|
|
02-11-2018, 10:34 PM
|
#328
|
Human being with feelings
Join Date: May 2015
Location: Québec, Canada
Posts: 4,937
|
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.
|
|
|
02-12-2018, 04:57 AM
|
#329
|
Human being with feelings
Join Date: Aug 2009
Location: NL
Posts: 1,453
|
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)?
|
|
|
02-25-2018, 05:22 AM
|
#330
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
How do I adjust FX wet/dry level via Reaper API?
|
|
|
02-25-2018, 10:02 AM
|
#331
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by fundorin
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.
|
|
|
02-25-2018, 10:13 AM
|
#332
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
02-25-2018, 01:39 PM
|
#333
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
02-26-2018, 05:33 AM
|
#334
|
Human being with feelings
Join Date: Oct 2007
Location: home is where the heart is
Posts: 12,096
|
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.
|
|
|
02-26-2018, 07:10 AM
|
#335
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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. 🤠
|
|
|
03-05-2018, 10:29 AM
|
#336
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
03-05-2018, 11:47 AM
|
#337
|
Human being with feelings
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
|
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"
|
|
|
03-05-2018, 11:55 AM
|
#338
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
Quote:
Originally Posted by azslow3
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.
|
|
|
03-05-2018, 02:24 PM
|
#339
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
03-12-2018, 09:30 AM
|
#340
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
03-17-2018, 09:42 PM
|
#341
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
03-29-2018, 08:36 AM
|
#342
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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);
|
|
|
03-29-2018, 09:33 AM
|
#343
|
Human being with feelings
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
|
Quote:
Originally Posted by fundorin
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.
|
|
|
03-29-2018, 09:49 AM
|
#344
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
Already tried adding GetFunc at line 35. Not working.
|
|
|
03-29-2018, 10:29 AM
|
#345
|
Human being with feelings
Join Date: May 2015
Location: Québec, Canada
Posts: 4,937
|
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.
|
|
|
03-29-2018, 11:53 AM
|
#346
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
Quote:
Originally Posted by cfillion
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?
|
|
|
03-29-2018, 12:08 PM
|
#347
|
Human being with feelings
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
|
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.
|
|
|
03-29-2018, 12:44 PM
|
#348
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
How do I save it as global variable? I can only reference to it via pointer. Otherwise I get errors:
Globals:
CSurf constructor:
|
|
|
03-29-2018, 03:30 PM
|
#349
|
Human being with feelings
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
|
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.
|
|
|
03-30-2018, 03:11 AM
|
#350
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
Quote:
Originally Posted by azslow3
C programming
|
Same.
Global:
Entry point:
Constructor:
Also c_surf.h:
|
|
|
03-31-2018, 07:06 AM
|
#351
|
Human being with feelings
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
|
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
|
|
|
03-31-2018, 12:09 PM
|
#352
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
03-31-2018, 01:27 PM
|
#353
|
Human being with feelings
Join Date: Nov 2017
Location: Heidelberg, Germany
Posts: 797
|
Quote:
Originally Posted by fundorin
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
|
|
|
03-31-2018, 01:57 PM
|
#354
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
Quote:
Originally Posted by azslow3
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. 👍
|
|
|
04-01-2018, 05:35 AM
|
#355
|
Human being with feelings
Join Date: Dec 2017
Location: Quebec, Canada
Posts: 550
|
Hey
How do I learn c++ ? Links, Where to start recommendations?
I am assuming Reaper is in C++?
Thanks
Alex
|
|
|
04-01-2018, 06:54 AM
|
#356
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by D Rocks
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.
|
|
|
04-01-2018, 08:04 AM
|
#357
|
Human being with feelings
Join Date: Dec 2017
Location: Quebec, Canada
Posts: 550
|
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
|
|
|
04-01-2018, 08:45 AM
|
#358
|
Human being with feelings
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
|
Quote:
Originally Posted by D Rocks
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.
|
|
|
04-01-2018, 11:54 AM
|
#359
|
Banned
Join Date: Feb 2014
Location: Moscow, Russia
Posts: 554
|
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.
|
|
|
04-02-2018, 05:30 AM
|
#360
|
Human being with feelings
Join Date: Dec 2017
Location: Quebec, Canada
Posts: 550
|
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
|
|
|
Thread Tools |
|
Display Modes |
Linear 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:53 AM.
|