14 January 2021, 14:50 | #21 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Quote:
Could you just redirect a sound object to this data, with a pointer, then? I guess if the sound data is in Fast RAM, that would be a problem. |
|
14 January 2021, 16:28 | #22 |
Registered User
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 6,369
|
Ah yeah, if you load it as a bank you can specify which memory type you want. I assume LoadModule would automatically load it into chip RAM so it can be played, but might be worth checking, just in case.
|
14 January 2021, 17:35 | #23 |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
I meant here's nothing wrong with using Fast RAM if you have it, but I am aiming for the absolute lowest denominator.
I guess memory management will be something I have to get into at some point, scary. |
18 January 2021, 18:03 | #24 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Quote:
There's a page in Amigacoding defining the Blitz objects, and the module object's _mt_data sub-item would have the module data. How would I traverse through this data, for example with some "For" statement reading every byte straight? I'm sorry if this is super newbie, but I am not sure I understand how to refer to t he module object loaded in memory exactly. For the time being, finding it in RAM and reading the module's name (which is at offset 0 and is 20 bytes long) would be enough for me to understand how to do the rest. [edit] Well this is getting complicated fast... I don't think I can have a pointer inside a newtype definition, can I? I really don't know how to create a copy of the actual sample data, there's no variable that can hold that that I can think of, so the best choice here would be to point at the sample data already in memory thanks to LoadModule, but I wanted to create an array of sample objects where the actual sample data was one of the elements. I guess I cannot. SoundData pushes a byte of info at a time into a sound object, so I guess I would have to make consecutive SoundData calls until "sample length" is reached, starting from the sample address in memory. It would be easier if I could, somehow, just redirect the sound data part of a sound object to the memory location where there's already sound data, but I don't know how I could do that, feel like it has to do with the sound data type, but don't really know how I can access it, as I said before. My mind is getting really mushy with all this [edit 2] aghhh i am in tears haha. Sorry EAb to use you as my rubber ducky debug So having this in mind: Code:
_data.l ;00: NULL if no sound present, else pointer to sound data _period.w ;04: period of sound _length.w ;06: length, in words, of sound data _loop.l ;08: repeat to loop position of sound _looplength.w ;12: length of looping section, in words _pad.b[2] ;14: Assuming I am dealing with a sound that Initialized as Sound 1, how can I access this _data parameter of that sound object when I have no variable name for it? this is the part that confuses me. Last edited by Amiga1992; 18 January 2021 at 22:31. |
|
19 January 2021, 13:48 | #25 | |||||||
Registered User
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 6,369
|
Quote:
Quote:
Quote:
Code:
*moduleData.module = Addr Module(0) Code:
offset.l = 0 If moduleData NPrint Peek$(*moduleData\_mt_data + offset) End If Code:
offset.l = 0 name$ = "" If moduleData If peek.l(*moduleData\_length) > 20 For i.l = 1 to 20 name$ + Peek.b(*moduleData\_mt_data + offset + i) Next i NPrint name$ End If End If Quote:
Quote:
Quote:
Quote:
So having this in mind: Code:
_data.l ;00: NULL if no sound present, else pointer to sound data _period.w ;04: period of sound _length.w ;06: length, in words, of sound data _loop.l ;08: repeat to loop position of sound _looplength.w ;12: length of looping section, in words _pad.b[2] ;14: Assuming I am dealing with a sound that Initialized as Sound 1, how can I access this _data parameter of that sound object when I have no variable name for it? this is the part that confuses me.[/QUOTE] You create a sound Newtype pointer to the Sound object, and then the fields will point to the values you want: Code:
*mySound.sound = Addr Sound(1) ; mySound is now a pointer to that object If *mySound ; Make sure it exists *mySound\_data = address_of_new_data.l End If |
|||||||
19 January 2021, 15:13 | #26 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Man you're a godsend, thanks for helping out with this!
Let's skip to the part that seems relevant as a solution, after all my mumbling. Quote:
And if I read you correctly in the other thread, there's something I need to include here to make sure it works? I feel bad asking all this because it feels like it's buried somewhere in the shit manual and I cannot find it. I searched several pages for the "Addr" command and was not able to find it, for example. Also no explanation on how to create these type of objects, how to work with pointers, etc... just a really bad manual. |
|
19 January 2021, 15:27 | #27 | ||
Registered User
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 6,369
|
Quote:
Quote:
|
||
19 January 2021, 16:07 | #28 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Quote:
I need to recollect my thoughts now and put all t his new knowledge to use. As soon as we're talking pointers and stuff, I am far more in my game than I was before, so hopefully I can make this work. Thanks again to you and idrougge, you will be heavily credited in whatever I make :P |
|
19 January 2021, 16:14 | #29 |
Registered User
Join Date: Nov 2019
Location: Croydon
Posts: 587
|
jesus I leave a few days and this thread blew up, thanks to all for the input, I think I can work form this point on in a solution to my problem but I don't really understand pointers and all that, must learn more.
|
11 February 2021, 23:39 | #30 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
I'm back on this! Question:
Quote:
Also how do I define these newtypes? Do I repeat the structure of what I posted above? Do they have to have the same names as the BB objects? Last edited by Amiga1992; 11 February 2021 at 23:49. |
|
12 February 2021, 09:55 | #31 |
Registered User
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 6,369
|
You need to enter Blitzlibs:amigalibs.res in the right hand box at the bottom that's labelled Resident. (Apologies for the incorrect path in my example...)
As for defining the newtypes, the extension of the name (the .sound bit) defines the Newtype, so you have to use that when setting it up. And it's case sensitive, so it has to be exactly as listed, case, underscores and all. Field names (the \_data bit) have to match what's listed too. But the main part of the name can be any valid variable name. |
12 February 2021, 14:58 | #32 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Quote:
So to define these object newtypes, should I do something like this, for example, with the sound object: Code:
NEWTYPE .sound _data.l _period.w _length.w _loop.l _looplength.w _pad.b[2] End NEWTYPE |
|
12 February 2021, 16:45 | #33 |
Registered User
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 6,369
|
No, you don't need to do that. All those types are already defined in the resident file. You can just used them directly in your code then, from my earlier example:
Code:
*mySound.sound = Addr Sound(1) ; mySound is now a pointer to that object |
15 February 2021, 15:24 | #34 |
Registered User
Join Date: Jan 2009
Location: Barcelona / Spain
Posts: 432
|
You can try using XBciatrackerLib library, it has a lot of useful commands
http://aminet.net/package/dev/blitz/CIATrkrLib.lha It is probably inside your blitz distribution already |
23 February 2021, 23:00 | #35 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Quote:
First, I included what was necessary (which was indeed bb2objtypes.res as your first suggested, not amigalibs.res), and now I am getting a "syntax error", no idea why, on the line highlighted in bold: Code:
Statement SetName {} SHARED modName SHARED modulePointer offset.l = 0 tempString$ = "" If modulePointer For i.l = 1 to 20 tempString$ + Peek.b (*modulePointer\_mt_data + offset + i) Next i End If packName=tempString$ End Statement Statement ModuleLoading {filename.s} SHARED modulePointer LoadModule #PROTRACKERMOD,filename *modulePointer = Addr Module(0) SetName {} End Statement Code:
If peek.l(*moduleData\_length) > 20 Any ideas? Last edited by Amiga1992; 23 February 2021 at 23:05. |
|
24 February 2021, 00:12 | #36 | ||
Registered User
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 6,369
|
Quote:
Code:
tempString$ + chr$(Peek.b (*modulePointer\_mt_data + offset + i)) Quote:
|
||
24 February 2021, 00:59 | #37 | |||
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Quote:
_mt_data is itself a pointer, this looks like a nested pointer, is that even possible? Should I instead do Code:
modulePointer/_mt_data This looks really complicated :/ Quote:
Quote:
|
|||
24 February 2021, 14:45 | #38 |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Well I kept thinking about this and am really stuck. Manual has been no help.
What I tried - trying to do Code:
myModule.module = 0 modulePointer.l = *myModule\_mt_data - removing the * ? I'm really confused. Seems like I cannot use the pointer, or that I cannot access the pointer inside of a pointer. If there was a way for me to read _mt_data directly I'd have the address where the MOD actually is and that is all I need. Maybe this method is just pure garbage and I should load the module as a BANK and deal with it my own way. |
24 February 2021, 14:56 | #39 |
Registered User
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 6,369
|
Yeah, you need the * to make it a pointer. Otherwise it's a variable of type module, which contains lots of sub-fields and can't simply hold an integer like 0. The pointer points to a structure, but is in fact just a longword representing the memory location of that structure, meaning you can assign a number to it. This changes where the code thinks that structure is, so assigning 0 would make it think it's at address 0, and is why checking for null pointers is important. It would likely be an instant hard crash to write values to such a struct.
I'll have to sit down and have a play with that code when I have the time, see if I can figure out what needs to be done. |
24 February 2021, 19:54 | #40 | |
Registered User
Join Date: May 2001
Location: ?
Posts: 19,646
|
Quote:
I still don't understand how to access the pointer inside the pointer. The problem seems to lie within this. And again if I load the module as a bank, I don't have to deal with this bogus "module" type which all it has is the whole module plus its length. I only need what's inside "_mt_data" in the module object, so I can traverse it with loops. |
|
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
Thread Tools | |
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Protracker file format, number of samples | phx | Coders. General | 21 | 02 August 2019 22:45 |
Blitz Basic 2 and Protracker mods | Radertified | Coders. Blitz Basic | 3 | 13 September 2018 22:55 |
Can't Create File error using Protracker 2.3d | ViLXDRYAD | support.Apps | 5 | 09 December 2016 15:44 |
Protracker 3.xx Load Sample | womagrid | support.Apps | 3 | 27 May 2016 06:28 |
Load Cubase made sample in protracker | Brick Nash | support.Other | 4 | 26 May 2016 18:28 |
|
|