Old 08-16-2008, 09:02 AM   #1
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default Developer Challenge

Steinberg XML - One step at a time. The track archives are like a proprietary OMF. They capture EVERYTHING on a track. If extension devs can parse one thing at a time and work on importing projects into Reaper this way it would be a HUGE item on the feature list.

- Import Nuendo / Cubase track archives (preliminary)

If you guys can figure out how to import Steinberg Track Archives it would bring TONS of potential users over. One step at a time starting with just placing the audio at the correct position?

Can you parse the following events from an XML from an extension? You can ignore most tags and just focus on the ones needed for a proper basic file import to start with, start time, length of the audio parts and the location of the audio file. The other stuff can be ignored.

Quote:
<obj class="MAudioEvent" ID="337297128">
<float name="Start" value="0"/>
<float name="Length" value="14262526"/>
<int name="Priority" value="1"/>
<obj class="PAudioClip" name="AudioClip" ID="337870912">
<string name="Name" value="Spain_stems_-06-Room"/> <member name="Domain">
<int name="Type" value="10"/>
<float name="Period" value="2.2675736961451248e-005"/>
</member>
<obj class="FNPath" name="Path" ID="343341008">
<string name="Name" value="Spain_stems_-06-Room.wav"/>
<string name="Path" value="F:\Reaper Spain\"/>
<member name="FileType">
<int name="MacType" value="1463899717"/>
<string name="DosType" value="wav"/>
<string name="UnixType" value="wav"/>
<string name="Name" value="Wave File"/>
</member>
</obj>
If you guys can pull this off it would be GREAT. If anyone wants to take this on I will feed you the paramater tags.

If I were parsing this with VB I'd use the VB InStr(entire_file, "MAudioEvent") to get the char location of that main tag and then sequentially parse the other tags from that character location to get the start time, length and construct the file location from those other two tags.

Last edited by Lawrence; 08-16-2008 at 09:28 AM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 10:24 AM   #2
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Ok, I was able to parse the first audio clip in about 15 minutes in VB code to extract the filename and location, the start time and the clip length.

Feel free to do this in a C extension and let me test it. Here's the code in VB which is commented to explain what I did which is parse the first character positions of the tags and then using those as references, extract the values of the tags to display into VB labels so I could verify they're being extracted correctly.

I loaded the XML into a text box in VB and read it from there. File name, File path, combined the two to make a fully qualified filename path, start position and clip length which is in samples.

Once you have those values you can (hopefully) import the files into Reaper on new tracks at the proper positions. Since it's all text and you can ignore the tags you don't need it's pretty easy to do.



Quote:
Private Sub Command1_Click()
Dim EventX As Integer, Start As Integer, Length As Integer, ClipName As Integer
Dim FileName As String, FilePath As String, StartLoc As String, ClipLen As String

EventX = InStr(1, Archive.Text, "MAudioEvent") 'find the first audio clip
Start = InStr(EventX, Archive.Text, "Start") ' find the start tag
Length = InStr(EventX, Archive.Text, "Length") ' find the Length tag


' ==============================================
'The start and lenght tag positions have to be incremented to account
'for the letters up to the actual values. To account for the " value =

'Start" value="
Start = Start + 14 'should be the char position of the first value number

'read the start position numbers into a string
X = 0
StartLoc = ""
Do
StartLoc = StartLoc & Mid(Archive.Text, Start + X, 1)
If Right(StartLoc, 1) = "/" Then Exit Do
X = X + 1
Loop

StartLoc = Left(StartLoc, Len(StartLoc) - 2)
'test the start pos on a label
StartPos.Caption = StartLoc

' ==============================================
'Length" value="
Length = Length + 15 'should be the char position of the first value number

'read the clip length numbers into a string
X = 0
ClipLen = ""
Do
ClipLen = ClipLen & Mid(Archive.Text, Length + X, 1)
If Right(ClipLen, 1) = "/" Then Exit Do
X = X + 1
Loop

ClipLen = Left(ClipLen, Len(ClipLen) - 2) ' Remove the "/
'test the clip length number on a label
PartLen.Caption = ClipLen

' ==============================================

'Parse the file path for this clip
ClipName = InStr(EventX, Archive.Text, "FNPath") 'find the filename path tag for this event

'Move the char position to the Name tag
ClipName = InStr(ClipName, Archive.Text, "Name")

'Move the char position to the first char of the clip name
'Name" value="
ClipName = ClipName + 13

'read the chars of the clip name
FileName = "": X = 0
Do 'read until the string name tag is closed with the "/" char

FileName = FileName & Mid(Archive.Text, ClipName + X, 1)
If Right(FileName, 1) = "/" Then Exit Do
X = X + 1
Loop

'shorten the string by two chars to remove the "/ at the end

FileName = Left(FileName, Len(FileName) - 2)
'test the parse on a label
FName.Caption = FileName

'////////////////////////////////////////
' Get the file path

'Move the char position to the Path tag
ClipName = InStr(ClipName, Archive.Text, "Path")

'Move the char position to the first char of the clip path
'Path" value="
ClipName = ClipName + 13

'read the chars of the clip path
FilePath = "": X = 0
Do 'read until the string name tag is closed with the "/" char
FilePath = FilePath & Mid(Archive.Text, ClipName + X, 1)
If Right(FilePath, 1) = "/" Then Exit Do
X = X + 1
Loop

FilePath = Left(FilePath, Len(FilePath) - 2)

'test the parse on a label
FPath.Caption = FilePath

'test the full qualified filename string on a label
FileLoc.Caption = FilePath & FileName


End Sub
So what I would do is use a loop with this sub procedure using the last char position as the new start char position on each loop to look for the next audio clip, the next MAudioEvent, and do it again until all the events are captured. The strings that capture the values are all being nulled beforehand before each parse so on every loop you just need sequential variables to capture the different media items.

And of course then use those values to add new media items to Reaper.

It works pretty well... the parsing. X... you want to tackle this? Please?

I'll help as much as I can with the logic, I can't program C so I can't help there.

There's also a sample rate tag there "SampleRate" value="44100"/> to parse and make sure the items get placed at the correct sample position or to warn of sample rate mismatches which would throw the positions off.

Last edited by Lawrence; 08-16-2008 at 10:55 AM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 10:51 AM   #3
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Or... we could work on this as a standalone VB utility that will convert Steinberg track archives into Reaper track archive / templates or similar for importing into Reaper?

Anyone who codes VB want to collab on that? I'll do the extraction from XML if someone else can do the conversion to a Reaper readable text format. I'll design the UI and present the audio events in a list like [Audiopath;start;length] and you can write code to parse that list and write it to a format that Reaper can import.

Later ... [Audiopath;start;length;eq1,f,q,g;eq2,f,q,g;....}et c, etc, or in another format that's easier to parse for the final conversion.

I want to contribute to this fine community effort so let me know.

In the meantime I'm gonna study an empty Reaper project file to see how I can possible insert that data into a blank project file "template" directly. If I can get one track to transfer...

It's on baby... !!!!

Last edited by Lawrence; 08-16-2008 at 11:02 AM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 11:20 AM   #4
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

HAR! After looking over a Reaper project file ... I can do this! Here's the method I'm gonna use...

I'm taking a blank Reaper project file with 32 tracks and breaking it up into text blocks in VB. What I'll do is parse the Steiny xml like I did above and apply clip data for each clip to the "item" blocks for each Reaper track "block" and then stitch all of those text blocks back together into a project file and launch it directly from the conversion utility.

This is gonna work. No doubt about it. Direct conversion from Steinberg XML archives to a Reaper project.

By the end of this weekend you'll be able to import up to 32 tracks of Steinberg projects with ALL clips!!! (one clip per track - audio *wav* only - to start until I get the code worked out)

I'll keep this thread updated. Please... if there are VB coders out there. Help me! I'm going into code mode now for the next few hours... I need coffee.

Last edited by Lawrence; 08-16-2008 at 11:24 AM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 11:48 AM   #5
stodge
Human being with feelings
 
Join Date: May 2007
Location: Canada
Posts: 206
Default

This is ripe for Python, but I don't have the time to try it. Python rocks for XML and string handling.
__________________
http://stodge.blogspot.com
http://www.soundclick.com/mikestoddart

Registered Reaper user!
stodge is offline   Reply With Quote
Old 08-16-2008, 11:53 AM   #6
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by Lawrence View Post
HAR! After looking over a Reaper project file ... I can do this! Here's the method I'm gonna use...

I'm taking a blank Reaper project file with 32 tracks and breaking it up into text blocks in VB. What I'll do is parse the Steiny xml like I did above and apply clip data for each clip to the "item" blocks for each Reaper track "block" and then stitch all of those text blocks back together into a project file and launch it directly from the conversion utility.

This is gonna work. No doubt about it. Direct conversion from Steinberg XML archives to a Reaper project.

By the end of this weekend you'll be able to import up to 32 tracks of Steinberg projects with ALL clips!!! (one clip per track - audio *wav* only - to start until I get the code worked out)

I'll keep this thread updated. Please... if there are VB coders out there. Help me! I'm going into code mode now for the next few hours... I need coffee.
I don't see a reason why limit it to 32 tracks? To add tracks to the Reaper project file, you just add more and more track sections...
__________________
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 08-16-2008, 12:11 PM   #7
Mercado_Negro
Moderator
 
Mercado_Negro's Avatar
 
Join Date: Aug 2007
Location: Caracas, Venezuela
Posts: 8,676
Default Damn...

Damn guys you really want to take this DAW to a level that any DAW has reached before!!!!!!!! Keep coming with this, keep coding, keep on the battlefield!!!! I'm just waiting on finish my own studio and I'll definitely use reaper as the MAIN DAW (maybe the only one)...
Mercado_Negro is offline   Reply With Quote
Old 08-16-2008, 12:14 PM   #8
ralfk
Human being with feelings
 
ralfk's Avatar
 
Join Date: Sep 2007
Location: Montréal
Posts: 86
Default

Kudos for taking this on.

I hope you don't mind a little bit of advice.

Since the track archive and the Reaper project files are XML (I think... aren't they?) then you would be better off using a 3rd-party XML parser for your translator's i/o and parsing needs and concentrate your development efforts on just manipulating the DOMs.

I Googled "VB XML parser" and a bunch of freebies popped up.

Last edited by ralfk; 08-16-2008 at 12:16 PM.
ralfk is offline   Reply With Quote
Old 08-16-2008, 12:20 PM   #9
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by ralfk View Post
Kudos for taking this on.

I hope you don't mind a little bit of advice.

Since the track archive and the Reaper project files are XML (I think... aren't they?) then you would be better off using a 3rd-party XML parser for your translator's i/o and parsing needs and concentrate your development efforts on just manipulating the DOMs.

I Googled "VB XML parser" and a bunch of freebies popped up.
Reaper doesn't use XML, there's similarities to XML in Reaper's text based project and other files, but it's not exactly the same.
__________________
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 08-16-2008, 12:23 PM   #10
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

What I'd suggest for Lawrence : parse the relevant data from the Steinberg XML file and generate new Reaper spesific data based on that. (Don't try trickery like taking an existing Reaper project file as a "template" and manipulating that, it'll get more complicated than you think.) Reaper is pretty forgiving of missing lines in the project file, so you don't have to worry about getting all the details right for the generated project file.
__________________
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 08-16-2008, 12:48 PM   #11
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Breaking up an existing Reaper project file into text blocks is working fine. Starting with the 32 tracks and predefined 32 track ID's allows me to insert the items inside the item tags right into the project file.

I'm halfway there already. In a few hours I'll have a working beta.

I'm gonna hard code the text blocks from the project file into VB code to simplify things. Bear with me. This will be beta pretty soon.

Last edited by Lawrence; 08-16-2008 at 12:58 PM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 12:50 PM   #12
CoffeeMilkshake
Human being with feelings
 
Join Date: Mar 2007
Posts: 501
Default

LOL!!!!

Lawrence, you beat me to the punch!!!

I was thinking doing something like this a few days ago... I was investigating AutoHotKey scripts and Cubase/Nuendo keystroke actions so I could work out a simple:

-Select track
-Set locators
-export audio mixdown
-open fx browser
-take snapshot
-loop

But you're WAY ahead! I understand squat of XML or C# or whatever language I was just going to keystroke away!

But your stuff's classy! Keep it up, this will tilt the balance even more!

Kudos!
__________________
Reaper registered user - proudly, may I add :)
CoffeeMilkshake is offline   Reply With Quote
Old 08-16-2008, 01:31 PM   #13
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Ok, here's what I'm doing to "write" a project file on the fly.

1. The text blocks that I'm not using yet are hard coded line for line into the VB code.

2. The parts of the "Track" and "Item" blocks that I won't use are also hard coded. The stuff in between position, length, name etc.

3. The 32 track ID's from my blank project are assigned to vars so I can bring those in at will.

4. When I get to the "Track" section of the project file I'll insert the relevant data (track id, name, position, etc) into the text string in realtime based on what was extracted from the xml file, 1-for-1 and loop, adding new "Track" and "Item" tags and their relevant data and then closing the tags for those tracks and items, in between the project file blocks.

5. After that I'll add the text to close the project tags at the end of the file, save it and launch it.

My first pass will be with a single track and static names and files and then I'll go in and write the code for multiple file extraction from the xml, and then create the loops to bring those multiple tracks, and multiple items per track, into the project file.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 01:49 PM   #14
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Here's a (ugly) screenshot of the development. I parse the xml and then write the Reaper project file to this text box in realtime with the hardcoded text strings and the variables with values culled from the xml. Once I get it fully working I'll dress it up. It'll be pretty small and those text boxes won't be visible.

The cool thing about this method is that as I add more things I can isolate certain lines in code, assign the values to vars and bring in a value from the xml like tempo or master fader level etc.



I haven't written code to navigate and import the xml file yet, it's still static in a text box here. That won't take long at all.

Before I go there I need to write this project file to disk as an *.rpp and actually open it in Reaper. And deal with the inevitable bugs.

Last edited by Lawrence; 08-16-2008 at 01:54 PM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 02:16 PM   #15
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Ok, I need help. I need to convert to these values from the xml sample values.

What are these Reaper values?

POSITION 45.94898901088303
LENGTH 323.41328798185941

I can write the code to convert but I need to know what they are.

Edit: Got it, seconds. I can convert that from the sample rate.

P.S. I had a first successful opening of a project from this code with 2 (as yet) unknown errors.

Last edited by Lawrence; 08-16-2008 at 02:43 PM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 02:34 PM   #16
LCipher
Human being with feelings
 
LCipher's Avatar
 
Join Date: Apr 2008
Posts: 2,036
Default nifty

BTW - there are some GREAT xlm C++ tools over at CodeGuru and Codeproject - if you know MSVC++. I used one awhile ago (cant remember where it is right now) but it really was pretty decent


http://www.codeproject.com/KB/cpp/markupclass.aspx
http://www.codeproject.com/KB/recipe...bleParser.aspx

Last edited by LCipher; 08-16-2008 at 02:42 PM.
LCipher is offline   Reply With Quote
Old 08-16-2008, 04:09 PM   #17
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default SUCCESS!

I can now export a track archive from Cubase with a single track and single audio file and convert that to a Reaper project where the audio part enters the project at the exact position and with the correct length... with no errors on load.

It took awhile. For some reason Steiny's "Start Time" value is (I finally figured out) Samples / 45.9375. ???? I have no idea why that is. The length value, the very next line, is represented in pure samples.

Maybe that was their way of trying to keep people from using the files? I don't know. That number has no significance to anything I can think of.

Now on to the looping and parsing of multiple audio clips for the one track, and then I'll move on to multiple tracks.

Last edited by Lawrence; 08-16-2008 at 04:12 PM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 04:44 PM   #18
Mercado_Negro
Moderator
 
Mercado_Negro's Avatar
 
Join Date: Aug 2007
Location: Caracas, Venezuela
Posts: 8,676
Default C'mon...

KEEP ON... KEEP ON... KEEP ON...
Mercado_Negro is offline   Reply With Quote
Old 08-16-2008, 04:56 PM   #19
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

I am...

I've got the tempo transferring but the time sig is a problem. Steinberg handles tempo differently depending on if you use a tempo track or not so the tempo being extracted is assuming a static tempo with the tempo track turned off. No biggie.

Same with time sig... no extraction there... yet.

I can't believe I've spent my entire Saturday doing this...
Lawrence is offline   Reply With Quote
Old 08-16-2008, 07:04 PM   #20
TheCaptain
Human being with feelings
 
TheCaptain's Avatar
 
Join Date: Apr 2008
Posts: 135
Default

Hey mate, if you pull this off, it'd be an absolute killer.

Sorry I can't help you, keep at it man, you're playing a blinder!
TheCaptain is offline   Reply With Quote
Old 08-16-2008, 07:33 PM   #21
Tallisman
Human being with feelings
 
Tallisman's Avatar
 
Join Date: Jan 2007
Location: in the middle of the icecube.
Posts: 7,403
Default

wow! L-Dog you rock! This is fantastic.

I am rooting for ya!

.t
__________________
.t

_____________________________
http://jomei.bandcamp.com <--My Middle Son.

http://tallisman.bandcamp.com <--Me.

"Excuse me. Could you please point me in the direction of the self-help section?"
Tallisman is offline   Reply With Quote
Old 08-16-2008, 07:57 PM   #22
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default Failure...

Argh! After early success... failure. It's the way Steinberg writes the xml's... there are many clips that don't show an obvious start time and length, especially those in containers.

And I was so pumped. I really thought this would work. I got some good code out of it though.

The Bad News: It doesn't seem possible with Cubendo though I will keep looking at it.

The Good News: I have successfully parsed the Reaper project file format into executable code so that opens up avenues for other stuff... including trying to do the same type of thing with another daw's file formats... including maybe Reaper -> X.

With that said... if there are other popular hosts that export to xml or some other text based format I would sure like to have a look at those files to see if they're more hospitable to this kind of translation.

So if you guys have Sonar, Samp, DP, Logic etc and any of those have export formats that can be read with the human eye, post some samples here and I'll look them over. Maybe my work won't go to waste after all. Especially if a daw exports a plain text track list, that would be pretty straight forward.

I'm also looking at the actual Cubase project files which are very weird looking but much of the text data I was using from the xml is visible there along with what looks like binary data... I haven't quite given up yet.

Last edited by Lawrence; 08-16-2008 at 08:08 PM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 07:59 PM   #23
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by Lawrence View Post
Argh! After early success... failure. It's the way Steinberg writes the xml's... there are many clips that don't show an obvious start time and lenght.
Can you post an example XML file?
__________________
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 08-16-2008, 08:22 PM   #24
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Quote:
Originally Posted by Xenakios View Post
Can you post an example XML file?
http://theaudiocave.com/999.xml

I can post a better example later but I've run across circumstances where audio parts are listed with their paths but no start or length anywhere to be found.

It was GREATLY disappointing after the encouraging start. If someone can parse those xml's I'll be right back on it.

Last edited by Lawrence; 08-16-2008 at 08:33 PM.
Lawrence is offline   Reply With Quote
Old 08-16-2008, 08:32 PM   #25
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Quote:
Originally Posted by Lawrence View Post
Is this a single track only? Looking quickly at this, I can see only one audio event...Which would appear to have the start time and length info...
__________________
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 08-17-2008, 05:22 AM   #26
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Have a look at these...

http://theaudiocave.com/4tracks.xml

http://theaudiocave.com/4track2.xml


Maybe I was just getting sleepy as I don't see what I saw yesterday. Now I see all the events. I tried xml readers and I think I was doing better in wordpad.

Now I'm using the IE xml reader and it's much clearer. Forward we go...

I'm tweaking the code this morning, got a dinner with my family early this afternoon but I'll spend some time tonight tweaking this up. Maybe it will work after all.

Here's a video of the app working.

http://theaudiocave.com/convert/convert.html

And a snapshot of that project being opened in Reaper after importing one clip... at the correct time... there's still hope as the initial code is working.



I have to put my thinking cap on and write multidimensional vars for the tracks and clips or create lists to hold that data, which will make the app bigger but the development faster. Any help with the xml's would be appreciated.

Last edited by Lawrence; 08-17-2008 at 06:07 AM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 06:19 AM   #27
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Ok, I'm gonna use lists to capture the clips for each track. As you can see below I have all the clips from the 4track2.xml captured in this list. This will allows unlimted clips per track. I have to write code to seperate the clips to the correct track though, get them into the proper lists before adding them to the Reaper project file.

X - If you can help with the track seperation from the xml... help me determine how to seperate the tracks to know which clip goes to which track?

Start, length, name and path in the list. This way, on the export I can read the clips sequentially from the lists one step at a time.

One problem with clips is determining the clip start position - not on the timeline but the start postiion within the clip itself, if the beginning has been trimmed. I hadn't considered that before.

So we're gonna need two start times, the placement time and the actual start time inside the clip.



I refuse to be defeated by this...

Last edited by Lawrence; 08-17-2008 at 06:26 AM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 06:49 AM   #28
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

X: If you look at it, focus on this test XML file. 4 tracks with various clips.

http://theaudiocave.com/4track2.xml

The track names are after each MAudioTrackEvent. Track1 -> Track4. I will parse those to add each track name as the first item in each list.

If my thinking is correct, the clips for each track should be below that event and before the next MAudioTrackEvent. If thats the case I can seperate the track ranges by parsing the start characters of those events and using those ranges for parsing the track clips between them, the MAudioEvent 's.

Update:

I'm making progress. I've finished code to...

1. Locate the position in the XML file of each individual track.
2. Pull the track names from the file to the lists as the first item to hold the names.

To do: Finish the code to determine how many audio clips are between the MAudioTrackEvent tags and assign that to a var to loop through those clips, that I'll use to fill the track lists with clip data. These nested For/Next loops with Do/Loop's in between will be tricky to manage as they're all in one sub-routine. I'd considered using (and probably should have used) functions but I had so much done already I decided to keep it all in the same sub.

Once I can consistently fill those lists with the track data from the xml without errors it will be a snap to write that data to the Reaper project file in the conversion sub routine. The Reaper project file text blocks are arranged very logically.

So there's really only two sub-routines... extraction from the xml on load and conversion to the Reaper project file on export.

Looks like we're back on track.

I'm using 32 hidden lists for the track data being extracted - to speed development instead of using dimensional vars to hold that data and not being able to immediately see all of the results during testing without using multiple watches - which will also allow me to duplicate those list arrays and easily extend the maximum track limit to 64 / 128 very easily without tons of code to debug.

With max 32k items per list I don't think that 4/6/8/10 or whatever amount of clip data items are added per clip later (eq?) will ever surpass the list limit so we're good there.

Right now the exe file is only 52k so it won't increase the app size too much. Again, I'll be taking an extended break here for my son's "return to college" dinner, but I'll be back on this later this afternoon and tonight.

I hope to have a working beta that I can upload before tomorrow. It won't use any dependancies beyond standard windows controls (and the VB6 run dll which most people have already) so it won't require an installation.

Last edited by Lawrence; 08-17-2008 at 07:47 AM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 07:55 AM   #29
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

For you VB'ers... here's the sub that's parsing and extracting from the xml... it needs lots of cleaning up and it's still buggy on the clip loops as I haven't finished the pointers for the clip loops yet.

Some of the vars are leftovers and need cleaning up and some others are declared globally outside of here.

This is not the fastest code I've ever written but... hey... it it ultimately works it'll be worth it.

Quote:
Public Sub ParseXML()

Me.Refresh
Dim EventX As Long, Start As Long, Length As Long, CName As Long
Dim FileName As String, FilePath As String, StartLoc, CLen
Dim SR As String, TP As String, CTrack As Integer
Dim TN(0 To 32) As Long, TrackName(0 To 32) As String, I As Integer


'Get the sample rate

SR = InStr(1, Archive.Text, "PArrangeSetup")
SR = InStr(SR, Archive.Text, "SampleRate")
SR = SR + 19

SampleRate = Mid(Archive.Text, SR, 5)

'Get the tempo

TP = InStr(1, Archive.Text, "RehearsalTempo") + 23
tpx = InStr(TP, Archive.Text, Chr(34))
TP = Mid(Archive.Text, TP, tpx - TP)

Tempo = TP

Dim Z As Long
Z = 1

For I = 1 To 32
Track(I).Clear
Next I


'Get the track names

For I = 1 To 32

TN(I) = InStr(Z, Archive.Text, "MAudioTrackEvent")
If TN(I) = 0 Then Exit For
TN(I) = InStr(TN(I), Archive.Text, "Name")
TN(I) = TN(I) + 13
X = 0
TrackName(I) = ""
Do
TrackName(I) = TrackName(I) & Mid(Archive.Text, TN(I) + X, 1)
If Right(TrackName(I), 1) = "/" Then Exit Do
X = X + 1
Loop
TrackName(I) = Left(TrackName(I), Len(TrackName(I)) - 2)
Track(I).AddItem TrackName(I)
Z = TN(I) + 50
Next I

TrackCount = I - 1

' Exit Sub 'stop here to test the track count.

Dim StartChar As Integer

StartChar = 1



Dim CurPos As Long
Dim Clips(1 To 32) As Long, ClipCount As Integer, XPos As Long



For CTrack = 1 To TrackCount

'How many clips on this track? and get the start position of each
CurPos = 1
For I = 1 To 32

XPos = InStr(CurPos, Archive.Text, "MAudioEvent")
If XPos = 0 Then Exit For
Clips(I) = XPos
CurPos = Clips(I) + 15

Next I

ClipCount = I - 1

For I = 1 To ClipCount

'find the next
EventX = Clips(I) 'find the first audio clip
Start = InStr(EventX, Archive.Text, "Start") ' find the start tag
Length = InStr(EventX, Archive.Text, "Length") ' find the Length tag


' ==============================================
'The start and lenght tag positions have to be incremented to account
'for the letters up to the actual values. To account for the " value =

'Start" value="
Start = Start + 14 'should be the char position of the first value number

'read the start position numbers into a string
X = 0
StartLoc = ""
Do
StartLoc = StartLoc & Mid(Archive.Text, Start + X, 1)
If Right(StartLoc, 1) = "/" Then Exit Do
X = X + 1
Loop

StartLoc = Left(StartLoc, Len(StartLoc) - 2)
'test the start pos on a label



StartPos.Caption = Format((StartLoc * 45.9375) / SampleRate, "0.00000000000000")
Track(CTrack).AddItem StartPos.Caption


' ==============================================
'Length" value="
Length = Length + 15 'should be the char position of the first value number

'read the clip length numbers into a string
X = 0
CLen = ""
Do
CLen = CLen & Mid(Archive.Text, Length + X, 1)
If Right(CLen, 1) = "/" Then Exit Do
X = X + 1
Loop

CLen = Left(CLen, Len(CLen) - 2)
'test the clip length number on a label
PartLen.Caption = Format(CLen / SampleRate, "0.00000000000000")
Track(CTrack).AddItem PartLen.Caption
' ==============================================

'Parse the file path for this clip
CName = InStr(EventX, Archive.Text, "FNPath") 'find the filename path tag for this event

'Move the char position to the Name tag
CName = InStr(CName, Archive.Text, "Name")

'Move the char position to the first char of the clip name
'Name" value="
CName = CName + 13

'read the chars of the clip name
FileName = "": X = 0
Do 'read until the string name tag is closed with the "/" char

FileName = FileName & Mid(Archive.Text, CName + X, 1)
If Right(FileName, 1) = "/" Then Exit Do
X = X + 1
Loop

'shorten the string by two chars to remove the "/ at the end

FileName = Left(FileName, Len(FileName) - 2)
'test the parse on a label
FName.Caption = FileName
Track(CTrack).AddItem FName.Caption

'////////////////////////////////////////
' Get the file path

'Move the char position to the Path tag
CName = InStr(CName, Archive.Text, "Path")

'Move the char position to the first char of the clip path
'Path" value="
CName = CName + 13

'read the chars of the clip path
FilePath = "": X = 0
Do 'read until the string name tag is closed with the "/" char
FilePath = FilePath & Mid(Archive.Text, CName + X, 1)
If Right(FilePath, 1) = "/" Then Exit Do
X = X + 1
Loop

FilePath = Left(FilePath, Len(FilePath) - 2)

'test the parse on a label
FPath.Caption = FilePath
Track(CTrack).AddItem FPath.Caption

Next I
Next CTrack

Import.BackColor = vbGreen
End Sub

Last edited by Lawrence; 08-17-2008 at 07:59 AM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 08:08 AM   #30
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Project file. Haven't written the track and clip loops yet. This will allow adding any extracted value anywhere in the future.

Looping those track and item (clip) text string sections will allow building those parts of the project file on the fly from the track lists that were extracted.

Quote:
Public Sub MakeProject()
Dim ProjectFile As String

'' PROJECT FILE HEADER===

ProjectFile = "<REAPER_PROJECT 0.1" & Chr(10)
ProjectFile = ProjectFile & "RIPPLE 0" & Chr(10)
ProjectFile = ProjectFile & "GROUPOVERRIDE 0" & Chr(10)
ProjectFile = ProjectFile & "AUTOXFADE 1" & Chr(10)
ProjectFile = ProjectFile & "ENVATTACH 1" & Chr(10)
ProjectFile = ProjectFile & "MIXERUIFLAGS 11 28" & Chr(10)
ProjectFile = ProjectFile & "PEAKGAIN 1.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "FEEDBACK 0" & Chr(10)
ProjectFile = ProjectFile & "AUTOMUTE 0 7.94328235000000" & Chr(10)
ProjectFile = ProjectFile & "PANLAW 1.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "PROJOFFS 0.00000000000000 0" & Chr(10)
ProjectFile = ProjectFile & "MAXPROJLEN 0 600.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "GRID 1150 8 1.00000000000000 8 1.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "TIMEMODE 1 0 -1" & Chr(10)
ProjectFile = ProjectFile & "CURSOR 432.825939461891" & Chr(10)
ProjectFile = ProjectFile & "ZOOM 1.84987748000000 0 0" & Chr(10)
ProjectFile = ProjectFile & "VZOOMEX 0" & Chr(10)
ProjectFile = ProjectFile & "USE_REC_CFG 1" & Chr(10)
ProjectFile = ProjectFile & "RECMODE 1" & Chr(10)
ProjectFile = ProjectFile & "SMPTESYNC 0 30.000000 100 40 1000 300 0 0.000000" & Chr(10)
ProjectFile = ProjectFile & "LOOP 0" & Chr(10)
ProjectFile = ProjectFile & "LOOPGRAN 0 4.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "RECORD_PATH " & "F:\Reaper Spain" & Chr(10)
ProjectFile = ProjectFile & "<RECORD_CFG " & Chr(10)
ProjectFile = ProjectFile & "dmdnbwAAAD8AgAAAAIAAAAAgAAAAAAE" & Chr(10)
ProjectFile = ProjectFile & "AAA==" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "<APPLYFX_CFG" & Chr(10)

ProjectFile = ProjectFile & "dmdnbwAAAD8AgAAAAIAAAAAgAAAAAAE" & Chr(10)
ProjectFile = ProjectFile & "AAA==" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "RENDER_FILE """ & Chr(10)
ProjectFile = ProjectFile & "RENDER_FMT 0 2 0" & Chr(10)
ProjectFile = ProjectFile & "RENDER_1X 0" & Chr(10)
ProjectFile = ProjectFile & "RENDER_RANGE 1 0.00000000000000" & "0.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "RENDER_RESAMPLE 3 0" & Chr(10)
ProjectFile = ProjectFile & "RENDER_ADDTOPROJ 0" & Chr(10)
ProjectFile = ProjectFile & "RENDER_STEMS 0" & Chr(10)
ProjectFile = ProjectFile & "RENDER_DITHER 0" & Chr(10)
ProjectFile = ProjectFile & "TIMELOCKMODE 0" & Chr(10)
ProjectFile = ProjectFile & "DEFPITCHMODE 0" & Chr(10)
ProjectFile = ProjectFile & "TAKELANE 1" & Chr(10)
ProjectFile = ProjectFile & "SAMPLERATE 44100 0" & Chr(10)
ProjectFile = ProjectFile & "<RENDER_CFG" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "Lock 1" & Chr(10)
ProjectFile = ProjectFile & "<METRONOME 6 2.000000" & Chr(10)
ProjectFile = ProjectFile & "VOL 0.250000 0.125000" & Chr(10)
ProjectFile = ProjectFile & "FREQ 800 1600" & Chr(10)
ProjectFile = ProjectFile & "BEATLEN 4" & Chr(10)
ProjectFile = ProjectFile & "SAMPLES "" """ & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
''''''''''''END HEADER

'TEMPO and time sig

ProjectFile = ProjectFile & "TEMPO " & Tempo & " 4 4" & Chr(10)

''''''''CONFIG BLOCK
ProjectFile = ProjectFile & "PLAYRATE 1.00000000000000 0 0.25000" & "4.00000" & Chr(10)
ProjectFile = ProjectFile & "SELECTION 0#" & "0.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "SELECTION2 0#" & "0.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "MASTERAUTOMODE 0" & Chr(10)
ProjectFile = ProjectFile & "MASTERTRACKHEIGHT 0" & Chr(10)
ProjectFile = ProjectFile & "MASTERMUTESOLO 0" & Chr(10)
ProjectFile = ProjectFile & "MASTERTRACKVIEW 0 0.666700" & "0.500000" & Chr(10)
ProjectFile = ProjectFile & "MASTERHWOUT 0 0 1.00000000000000" & "0.00000000000000 0 0 0 -" & "1.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "MASTER_NCH 2" & Chr(10)
ProjectFile = ProjectFile & "MASTER_VOLUME 1#" & "0.00000000000000 -1.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "MASTER_FX 1" & Chr(10)
ProjectFile = ProjectFile & "MASTER_SEL 0" & Chr(10)
ProjectFile = ProjectFile & "<MASTERPLAYSPEEDENV" & Chr(10)
ProjectFile = ProjectFile & "ACT 1" & Chr(10)
ProjectFile = ProjectFile & "VIS 1" & Chr(10)
ProjectFile = ProjectFile & "ARM 1" & Chr(10)
ProjectFile = ProjectFile & "DEFSHAPE 0" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "<TEMPOENVEX" & Chr(10)
ProjectFile = ProjectFile & "ACT 1" & Chr(10)
ProjectFile = ProjectFile & "VIS 0" & Chr(10)
ProjectFile = ProjectFile & "ARM 1" & Chr(10)
ProjectFile = ProjectFile & "DEFSHAPE 1" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "<MASTERVOLENV" & Chr(10)
ProjectFile = ProjectFile & "ACT 1" & Chr(10)
ProjectFile = ProjectFile & "VIS 1" & Chr(10)
ProjectFile = ProjectFile & "ARM 1" & Chr(10)
ProjectFile = ProjectFile & "DEFSHAPE 0" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "<MASTERPANENV" & Chr(10)
ProjectFile = ProjectFile & "ACT 1" & Chr(10)
ProjectFile = ProjectFile & "VIS 1" & Chr(10)
ProjectFile = ProjectFile & "ARM 1" & Chr(10)
ProjectFile = ProjectFile & "DEFSHAPE 0" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "<MASTERVOLENV2" & Chr(10)
ProjectFile = ProjectFile & "ACT 1" & Chr(10)
ProjectFile = ProjectFile & "VIS 1" & Chr(10)
ProjectFile = ProjectFile & "ARM 1" & Chr(10)
ProjectFile = ProjectFile & "DEFSHAPE 0" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10)
ProjectFile = ProjectFile & "<MASTERPANENV2" & Chr(10)
ProjectFile = ProjectFile & "ACT 1" & Chr(10)
ProjectFile = ProjectFile & "VIS 1" & Chr(10)
ProjectFile = ProjectFile & "ARM 1" & Chr(10)
ProjectFile = ProjectFile & "DEFSHAPE 0" & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10) & Chr(10)
'-------- END CONFIG BLOCK

'LOOP HERE TO INSERT INDIVIDUAL TRACK BLOCKS

'TRACK START BLOCK
ProjectFile = ProjectFile & "<TRACK '{" & TID(1)
ProjectFile = ProjectFile & "}'" & Chr(10)
ProjectFile = ProjectFile & "NAME " & Chr(34) & FName & Chr(34) & Chr(10)

''''INSERT TRACK ID'S HERE

''' MISC BLOCK BEFORE ITEMS =====

ProjectFile = ProjectFile & "PEAKCOL 16576" & Chr(10)
ProjectFile = ProjectFile & "BEAT -1" & Chr(10)
ProjectFile = ProjectFile & "AUTOMODE 0" & Chr(10)
ProjectFile = ProjectFile & "VOLPAN 1#" & "1.00000000000000" & "0.00000000000000" & "-1.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "MUTESOLO 0 0" & Chr(10)
ProjectFile = ProjectFile & "IPHASE 0" & Chr(10)
ProjectFile = ProjectFile & "ISBUS 0" & Chr(10)
ProjectFile = ProjectFile & "BUSCOMP 0" & Chr(10)
ProjectFile = ProjectFile & "SHOWINMIX 1 0.666700 0.500000" & Chr(10)
ProjectFile = ProjectFile & "FREEMODE 1" & Chr(10)
ProjectFile = ProjectFile & "SEL 1" & Chr(10)
ProjectFile = ProjectFile & "REC 0 0 0 0 0" & Chr(10)
ProjectFile = ProjectFile & "TRACKHEIGHT 0" & Chr(10)
ProjectFile = ProjectFile & "INQ 0 0 0 0.5000000000 100 0 0 100" & Chr(10)
ProjectFile = ProjectFile & "NCHAN 2" & Chr(10)
ProjectFile = ProjectFile & "FX 1" & Chr(10)
ProjectFile = ProjectFile & "TRACKID {" & TID(1) & "}" & Chr(10)
ProjectFile = ProjectFile & "PERF 0" & Chr(10)
ProjectFile = ProjectFile & "MIDIOUT -1" & Chr(10)
ProjectFile = ProjectFile & "MAINSEND 1" & Chr(10)

''''=========
ProjectFile = ProjectFile & Chr(10)

''''' ITEM BLOCK ===============================================
' LOOP HERE TO INSERT INDIVIDUAL CLIPS

ProjectFile = ProjectFile & "<ITEM" & Chr(10)
ProjectFile = ProjectFile & "POSITION " & StartPos & Chr(10) 'starpos
ProjectFile = ProjectFile & "LENGTH " & PartLen & Chr(10) 'PartLen
ProjectFile = ProjectFile & "SNAPOFFS " & "0.000000" & Chr(10)
ProjectFile = ProjectFile & "LOOP 1" & Chr(10)
ProjectFile = ProjectFile & "ALLTAKES 0" & Chr(10)
ProjectFile = ProjectFile & "SEL 1" & Chr(10)
ProjectFile = ProjectFile & "FADEIN 1 0.010000 0.000000" & Chr(10)
ProjectFile = ProjectFile & "FADEOUT 1 0.010000 0.000000" & Chr(10)
ProjectFile = ProjectFile & "MUTE 0" & Chr(10)
ProjectFile = ProjectFile & "YPOS 0.291667 1.000000" & Chr(10)
ProjectFile = ProjectFile & "NAME " & Chr(34) & FName & Chr(34) & Chr(10)
ProjectFile = ProjectFile & "VOLPAN 1.000000 0.000000 1.000000 -1.000000" & Chr(10)
ProjectFile = ProjectFile & "SOFFS 0.00000000000000" & Chr(10)
ProjectFile = ProjectFile & "PLAYRATE 1.00000000000000 1 0.00000000000000 -1" & Chr(10)
ProjectFile = ProjectFile & "CHANMODE 0" & Chr(10)
ProjectFile = ProjectFile & "<SOURCE WAVE " & Chr(10) & "FILE " & Chr(34) & FPath & FName & Chr(34) & Chr(10)
ProjectFile = ProjectFile & ">" & Chr(10) 'CLOSE SOURCE WAVE
ProjectFile = ProjectFile & ">" & Chr(10) 'CLOSE CLIP BLOCK

'END CLIP LOOP

ProjectFile = ProjectFile & ">" & Chr(10) & Chr(10) 'CLOSE TRACK BLOCK

'END TRACK LOOP


'''=============================================== ============
ProjectFile = ProjectFile & ">" & Chr(10) 'CLOSE PROJECT FILE

PFile = ProjectFile 'PFile is a text box used to hold the result before the file export.

End Sub

Last edited by Lawrence; 08-17-2008 at 08:19 AM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 08:55 AM   #31
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Oh yeah... track seperation is working... ...kinda...


Last edited by Lawrence; 08-17-2008 at 09:01 AM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 09:34 AM   #32
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Export selected tracks from Cubase, import and extract the values from the xml file into the VB conversion app, export it as a new Reaper project and open it in Reaper. Now I can let this go for a few hours and not feel defeated. The import / parse code is slow as hell but it works.

Once I get everything working and tested (multiple clips per track) I'll dig into the code and ry to speed it up a bit. I'm also going to freeze a VSTI and see if the xml references the frozen audio file in a way that allows it to be extracted and used as an audio track in Reaper.


Last edited by Lawrence; 08-17-2008 at 10:13 AM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 02:41 PM   #33
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
Default

AWESOME Lawrence!!!!
pipelineaudio is offline   Reply With Quote
Old 08-17-2008, 02:42 PM   #34
Xenakios
Human being with feelings
 
Xenakios's Avatar
 
Join Date: Feb 2007
Location: Oulu, Finland
Posts: 8,062
Default

Yes, very heroic efforts by Lawrence and certainly much appreciated!
__________________
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 08-17-2008, 02:53 PM   #35
manning1
Human being with feelings
 
Join Date: Apr 2006
Posts: 2,957
Default

Lawrence.
crikey, as an ex coder i gotta say this is a amazeing effort by you mate. just want to say kudos.

lawrence , just trying to help.
n i dont know how much this might speed things up in the parseing etc...,
but as you know basic , demo www.purebasic.com sometime.
its advantage is it compiles to standalone exe's with no run times needed.
they claim very fast executeables, plus if i remember
for optimisation one can include in line assembler routines.

Last edited by manning1; 08-17-2008 at 03:01 PM.
manning1 is offline   Reply With Quote
Old 08-17-2008, 03:32 PM   #36
Banned
Human being with feelings
 
Banned's Avatar
 
Join Date: Mar 2008
Location: Unwired (probably in the proximity of Amsterdam)
Posts: 4,868
Default

+++ respect & kudo's !

Most of my (most legacy) stuff on Cubase / Nuendo is using surround sound... i'm guessing that would be hard to translate to Reaper?
Banned is offline   Reply With Quote
Old 08-17-2008, 03:34 PM   #37
Lawrence
Human being with feelings
 
Join Date: Mar 2007
Posts: 21,551
Default

Quote:
Originally Posted by manning1 View Post
Lawrence.
crikey, as an ex coder i gotta say this is a amazeing effort by you mate. just want to say kudos.

lawrence , just trying to help.
n i dont know how much this might speed things up in the parseing etc...,
but as you know basic , demo www.purebasic.com sometime.
its advantage is it compiles to standalone exe's with no run times needed.
they claim very fast executeables, plus if i remember
for optimisation one can include in line assembler routines.
I thought PureBasic was mac?

Oh... I was thinking RealBasic. I'll have to give PureBasic a look. If it's close to VB I might jump on board... I'm too old to learn new tricks.

As to this tool, it's going well and I'm gonna spend another couple of hours working on it since I'm back home now, before football and "Generation Kill" comes on. I *really* wish some VB'ers here would jump in with some functions.

Hint, hint...

P.S. I think I solved the problem with trimming the start of events. Cuborg has an offset value and so does the Reaper file. I just have to add the value to the list for each item.

Last edited by Lawrence; 08-17-2008 at 04:35 PM.
Lawrence is offline   Reply With Quote
Old 08-17-2008, 03:41 PM   #38
Blechi
Human being with feelings
 
Blechi's Avatar
 
Join Date: Apr 2008
Location: Saarlänner
Posts: 1,141
Default

PureBasic is windows.
But they shure need someone like nicholas as this programming language is way better than it's documentation.
Blechi is offline   Reply With Quote
Old 08-17-2008, 04:56 PM   #39
manning1
Human being with feelings
 
Join Date: Apr 2006
Posts: 2,957
Default

lawrence.
yes ..real basic is for mac. not pc i understand.
heres another alternative to vb used by lots of big corps.
they state will compile a million lines a minute ?
http://www.powerbasic.com/aboutpb.asp
once again compiles to stand alone exe i understand.
god bless.
manning1 is offline   Reply With Quote
Old 08-17-2008, 06:07 PM   #40
JasonTheron
Human being with feelings
 
JasonTheron's Avatar
 
Join Date: Sep 2007
Location: Medford, OR
Posts: 1,207
Default

Quote:
Originally Posted by Lawrence View Post
I thought PureBasic was mac?

Oh... I was thinking RealBasic. I'll have to give PureBasic a look. If it's close to VB I might jump on board... I'm too old to learn new tricks.

As to this tool, it's going well and I'm gonna spend another couple of hours working on it since I'm back home now, before football and "Generation Kill" comes on. I *really* wish some VB'ers here would jump in with some functions.

Hint, hint...

P.S. I think I solved the problem with trimming the start of events. Cuborg has an offset value and so does the Reaper file. I just have to add the value to the list for each item.
My VB is rusty and I'm short on time but let me know if you want to hand me specific pieces to work out.
I'll give it a shot.
__________________
"pff... anybody who has over 900 posts is a total dork..." -Till (Post count of 932 as of the date of this quote)

My Band - http://ischemiacore.com
Till's FR Vote Tracker - http://tillmannn.de/reaper.html -
Underground Music in Southern Oregon - http://www.myspace.com/sohcindustries
JasonTheron 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 12:45 PM.


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