English Amiga Board


Go Back   English Amiga Board > Coders > Coders. Language > Coders. Blitz Basic

 
 
Thread Tools
Old 14 January 2021, 15:50   #21
Akira
Black Lives Matter

Akira's Avatar
 
Join Date: May 2001
Location: New York
Posts: 19,438
Quote:
Originally Posted by idrougge View Post
Unfortunately you can’t specify that something must be INCBINed into chip memory, so the data must be copied.
But no one is incbin'ing data here, the module is loaded using LoadModule or as a Bank.
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.
Akira is offline  
Old 14 January 2021, 17:28   #22
Daedalus
Registered User

Daedalus's Avatar
 
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 5,007
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.
Daedalus is offline  
Old 14 January 2021, 18:35   #23
Akira
Black Lives Matter

Akira's Avatar
 
Join Date: May 2001
Location: New York
Posts: 19,438
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.
Akira is offline  
Old 18 January 2021, 19:03   #24
Akira
Black Lives Matter

Akira's Avatar
 
Join Date: May 2001
Location: New York
Posts: 19,438
Quote:
Originally Posted by Daedalus View Post
If you're just loading the file and interpreting it yourself, there's no need to load it with a dedicated library. Alternatively, if you do use e.g. LoadModule, you can get the location of the Blitz object (which then contains the module address) with the Addr Module(0) function.
I don't fully understand how to use this.
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:
The Sound object already has a pointer to sound data and not actual sound data. So if I could change that to point instead to wherever LoadModule has put the sample, I should be done.

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 Akira; 18 January 2021 at 23:31.
Akira is offline  
Old 19 January 2021, 14:48   #25
Daedalus
Registered User

Daedalus's Avatar
 
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 5,007
Quote:
Originally Posted by Akira View Post
I don't fully understand how to use this.
There's a page in Amigacoding defining the Blitz objects, and the module object's _mt_data sub-item would have the module data.
Yep, that value should be the address of the start of the module data in memory, or else 0 if the data wasn't loaded. It's very important to check that it's not 0 before trying to do anything with the data.

Quote:
How would I traverse through this data, for example with some "For" statement reading every byte straight?
Basically, yes. I'm not particularly familiar with the format, so it's about writing code to go through the data as necessary to find the part you need. Most likely the file format will contain offsets to particular data chunks, so you can jump to the locations directly instead of trawling through every byte along the way.

Quote:
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.
You need to set up a suitable Newtype and assign it to point at the address of the module. So something like:

Code:
*moduleData.module = Addr Module(0)
Then you can access the fields of the Newtype to get the addresses. To read a string from memory if it's null terminated, you can use Peek$():

Code:
offset.l = 0
If moduleData
  NPrint Peek$(*moduleData\_mt_data + offset)
End If
If it's a fixed length however, it might be better to use a loop:
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
This should give you the title - the first 20 characters located at offset 0.

Quote:
[edit] Well this is getting complicated fast... I don't think I can have a pointer inside a newtype definition, can I?
You can, but it's treated as a long value rather than an actual pointer type, so to access it you need to do Peek/Poking or maybe assign a pointer to the address if needed.

Quote:
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.
Actually copying data is simply a matter of reading a byte, then writing it to a new location. The more important part though is ensuring that you're actually supposed to write to that location, and that's usually done by allocating memory, either through the standard alloc routines or the Blitz InitBank command.

Quote:
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.
That's a perfectly reasonable approach, basically doing the same as above.

Quote:
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.
You're on the right track here:
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:
The Sound object already has a pointer to sound data and not actual sound data. So if I could change that to point instead to wherever LoadModule has put the sample, I should be done.

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
Never skip the check to make sure it exists. If, for any reason the sound object doesn't exist (didn't load, not enough free chip RAM to initialise etc.), you'll most likely get an instant guru when you try to modify it.
Daedalus is offline  
Old 19 January 2021, 16:13   #26
Akira
Black Lives Matter

Akira's Avatar
 
Join Date: May 2001
Location: New York
Posts: 19,438
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:
Originally Posted by Daedalus View Post
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
Never skip the check to make sure it exists. If, for any reason the sound object doesn't exist (didn't load, not enough free chip RAM to initialise etc.), you'll most likely get an instant guru when you try to modify it.
So that's how you do it!
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.
Akira is offline  
Old 19 January 2021, 16:27   #27
Daedalus
Registered User

Daedalus's Avatar
 
Join Date: Jun 2009
Location: Dublin, then Glasgow
Posts: 5,007
Quote:
Originally Posted by Akira View Post
So that's how you do it!
And if I read you correctly in the other thread, there's something I need to include here to make sure it works?
Yep, the bb2objtypes.res file needs to be added to the compiler settings (in Blitz 2 you'll need the full path, usually Blitz2:bb2objtypes.res) so you can access the definitions of all the Blitz object structures.

Quote:
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.
Yeah, it's not great, but you'll find it in the chapter on compiler directives and object handling, alongside Free, Use etc. Pointers are only very briefly covered in the manual, some decent examples would definitely be of help there! It's an area that I want to add some detail about on AmigaCoding... Some day
Daedalus is offline  
Old 19 January 2021, 17:07   #28
Akira
Black Lives Matter

Akira's Avatar
 
Join Date: May 2001
Location: New York
Posts: 19,438
Quote:
Originally Posted by Daedalus View Post
Yeah, it's not great, but you'll find it in the chapter on compiler directives and object handling, alongside Free, Use etc. Pointers are only very briefly covered in the manual, some decent examples would definitely be of help there! It's an area that I want to add some detail about on AmigaCoding... Some day
I downloaded that UBB thing now, the manual looks really good, thanks for that pointer too! And I'll be waiting for your pointer tips on Amigacoding, meanwhile, I'll have to be bothering you here ;P

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
Akira is offline  
Old 19 January 2021, 17:14   #29
Bren McGuire
Registered User

Bren McGuire's Avatar
 
Join Date: Nov 2019
Location: Croydon
Posts: 144
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.
Bren McGuire is offline  
 


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 23:45
Blitz Basic 2 and Protracker mods Radertified Coders. Blitz Basic 3 13 September 2018 23:55
Can't Create File error using Protracker 2.3d ViLXDRYAD support.Apps 5 09 December 2016 16:44
Protracker 3.xx Load Sample womagrid support.Apps 3 27 May 2016 07:28
Load Cubase made sample in protracker Brick Nash support.Other 4 26 May 2016 19:28

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 +2. The time now is 12:43.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2021, vBulletin Solutions Inc.
Page generated in 0.09396 seconds with 15 queries