Dark Bit Factory & Gravity
PROGRAMMING => C / C++ /C# => Topic started by: bbear on December 12, 2006
-
Hi
I found the sources of the abyss AHX player but I don't understand how to use it.
I'm searching about a complete example in C/C++ with the player implementation with VC6, devcpp or codeblock.
links for AHX:
http://www.exotica.org.uk/tunes/formats/index.html
http://www.exotica.org.uk/tunes/formats/ahx/AYS-AHX-Sources.zip
thanx
some of my little stuffs (http://cyberpingui.free.fr/oldies/intros.rar) I done with GDI and test with opengl
-
Hi bbear, welcome aboard
Well, I take a look at this source and it is really good, it's also a good point to start a softsynth player.
I'll see what I can do with this, there's some ASM code in there, hope VC++2005 accept that either...
-
Thanks bbear!
Looks like a relatively easy port...there's a tiny bit of asm in there that would be easy to replace with C.
Are there lots of tunes for this tracker? It looks like an AY emulator (Atari ST, Amstrad CPC, Spectrum 128 sound chip).
Jim
<edit>Got it building in Visual Studio easily. There's no front end, so I'll jam a simple one on, get a link to some tunes and repost it.
-
Here it is, source, project files, exe, with a front end and a sample tune.
If there's any interest, this could easily be made into a FreeBasic lib.
Jim
<edit> fixed a number of bugs in the player while I was listening to some top tunes this afternoon :-)
-
Nice one, Jim. Thanks for sharing the code ... never heard about this sound format either ....
Anyway ... sounds interesting and chippy :) ---> Karma Up!
-
excellent
you can find a lot of AHX on www.plopbox.net and www.chiptune.com (firefox recommended)
this format was made originally on Amiga
-
Great one Jim, works fine here, k++
-
You can also find many AHX's at http://www.chip-on.com/
I recently began composing in AHX (about 4 days ago) on my old Amiga..
Here are some results :)
I'm the AHX n00b (http://imthebastard.googlepages.com/i%27mtheahxn00b)
:)
Edit: By the way, that EXE - superb :) I was after something like this! However , unforutunatly the EXE also trips up on this one (attached)... Deliplayer does not, nor does the real AHX itself.. (its about 30 secs in).
The other replayers that do this (like the winamp plugin) only play AHX's about 50% correctly, if you can find a moment to take a poke and fix that then that would be awesome.
-
:hi: aboard dude
Well, it seems to me that you arent a n00b :)
unforutunatly the EXE also trips up on this one (attached)... Deliplayer does not, nor does the real AHX itself.. (its about 30 secs in).
The other replayers that do this (like the winamp plugin) only play AHX's about 50% correctly, if you can find a moment to take a poke and fix that then that would be awesome.
I have tested this ahx player it with lots of .ahx songs and it crashes only with your song, tested it with real amiga AHX player and it works fine.
I guess you can help us to find this problem, tell us where it exactly crash, for example when you play one specific note, volume or instrument...
-
Hi M0d, Welcome to the forum! I fired up that tune in the debugger and for some reason it doesn't crash, but the noise (D) channel goes totally haywire and never corrects itself. I'll see what I can do, but it's a fair amount of effort I would think.
Jim
-
:hi: aboard dude
Well, it seems to me that you arent a n00b :)
unforutunatly the EXE also trips up on this one (attached)... Deliplayer does not, nor does the real AHX itself.. (its about 30 secs in).
The other replayers that do this (like the winamp plugin) only play AHX's about 50% correctly, if you can find a moment to take a poke and fix that then that would be awesome.
I have tested this ahx player it with lots of .ahx songs and it crashes only with your song, tested it with real amiga AHX player and it works fine.
I guess you can help us to find this problem, tell us where it exactly crash, for example when you play one specific note, volume or instrument...
Thanks for the warm welcome :cheers: I've been out tonight so I'll check into finding out when it crashes, unfortunatly swapping stuff to and fro between my amiga on the other side of the studio is a pain until i get my network cable plugged back into the LAN (been wireless for some time now) :) tomorrow.
In this terrifically dark picture, the amiga behind me when im sitting at the PC.
clicky (http://imthebastard.googlepages.com/darkstudio1.jpg)
I was made aware that AHX is buggy and generally keeps on going when it hits bugs, and being that I'm so very new at using AHX (yes im a n00b - really!) - I wouldn't have noticed a problem had I not put it into any WinAHX-based player. I also managed (unfortunatly not reproductably) to crash the EXE with another one of my songs, it locked up the PC for a while and failed to die when thrust with a bannana shaped angry task-menu kill, but that's not so important - it could have been anything. I played the song another time and it went through fine (the song was TherePie).
Hi M0d, Welcome to the forum! I fired up that tune in the debugger and for some reason it doesn't crash, but the noise (D) channel goes totally haywire and never corrects itself. I'll see what I can do, but it's a fair amount of effort I would think.
Jim
Hi Jim, again - thanks for helping to rejuvinate AHXness, as above my level of insight into AHX is flat bottom zero, i'm still learning how to make tone portmentos work ::) So i was a little surpirsed i'd broken something, and then later not so surprised after I heard from a friend how this sort of thing is actually quite common (at least on the constuction stage).
Luckily, and this is cool - a mate of mine (with contributions) has re-vamped the AHX user-documentation into a sexy PDF. I'll let you know where to get it when it's released 1.0 (only drafts at the moment) as I'ts really helped me get to grips with some of the stuff i never even knew was possible. (You're reading a post by someone who's been using a clipboard, pencil and paper to copy column data down to put into another column, not knowing how to use the clipboard function of the programme itself).
Again thanks both for the warm >:D welcome :)
-
I tried quite a number of things, but there doesn't appear to be any obvious bugs. Perhaps a design flaw?
Jim
-
Hi Jim,
I believe I might have found the issue - the issue being that a column volume setting ($C) over 40 causes this "crash" to occur. It seems the error is definitly not trapped in the replayer code. The real AHX assumes values over the max, to be the actual maximum, for instance >40 = 40.
I have attached an updated version of Chip Shoulder - I can't test it on the AHX player you made because on my w2k machine at work I seem to be missing various DLL components to get it to run :(
Let me know how it goes
(P.S I've also attached a new AHX I made yesterday - Discovery of Pieland :) )
-
Nice one dude, you found it, works fine now.
Karma++
Btw, nice ahx tunes, well done :clap:
-
Fixed it. Somehow you'd set column volume to 66 (0x42), which isn't in any of the 3 valid ranges 0-0x40, 0x50-0x90 or 0xA0-0xE0. So basically I've put a check in which just ignores invalid ranges.
Along with a new .exe, I've included your original broken song in the archive, it now plays just fine. :D
Jim
-
Awesome Jim. Do you mind if I distribute your AHX player within some other communities? I'm sure it will be well received, especially for those people who dont have a native AHX player or wish to install one of the plugins for their own player, etc...
:cheers:
-
Excellent Jim! I started c++ yesterday (!) and I'll definitly enjoy using old AHX song in intros :) karma boost of course :)
-
->m0d - by all means distribute my patches to the AHX library (I think there are 4 or 5 important fixes). The front end too.
Jim
-
@Jim: by the way, that ASM code in the "GenerateWhiteNoise" function works fine with VC++2005
-
Yeah, I ported it to C though and removed the last of the asm. I used memcmp to check the results were identical. It'll port to PSP now, for instance :). Funnily enough though, the asm is just a simple RNG, I don't know if it's actually doing a real AY emulation, it looks like it might be, but just using C's rand() function sounds just the same!
Jim
-
:D thanks Jim.
If i knew how to add these Karma points, i'd give you some :) So far i have no idea how :-\
So instead, here's a little tune I composed in an hour or so because frankly, AHX rocks and i'm bored so what a wonderful way to spend time eh? It's called "Lava Burnt Pie". Just a shortie, but i've also included all 8 other tunes that i composed in the last few weeks - and I guess i may archive 'em as well as i dont think i will be composing any more in 2006 ;D
Enjoy!
-
When you've posted enough times you get an 'applaud' button under each user's av. Click that to help that person achieve nirvana! :p
Thanks for the tunes! Do you think anyone will use the code? And if so, is there any way the patches can get into the source that was put in the OP?
Jim
-
Hi Jim
I'm sorry i don't really know anything about the original source or how to get your changes merged, but if someone asks for the src any time from me i'll be sure to send them this stuff.
I could try and contact the original authors, or maybe i can by proxy the info through some of the sceners i know.
Oh, and here's tonight's creation attached (children of the pie) :) I actually did another one before this but i have been asked not to release it yet as it's been invited onto a music disk by UpRough.net (demosceners). awesome!
Oh one thing - i noticed that the frontend you made hangs on my XP systems when quitting. It holds up the system for quite a while then eventually releases it, well, i say that - im hoping it does because it did one, the rest of the times i've had to kill the task manually (then wait more, even still). Would this be something in the AHX code with the sound drivers not releasing or something? (i'm not a coder, i could be barking up any tree).
Edit: Oh no!! My new piece causes the updated AHX player to crash at about 59 secs in! :o
I know in that part a lot of stuff is being pushed around in the instrument filters, i think it might be another unchecked limiter or something. it plays fine in delix/deliplayer and of course AHX itself. :cheers:
-
It doesn't hang for me, but it is definitely using a 2nd thread which could cause that. How are you quitting the program? The X in the window or Alt-F4 or?
I'll take a look at the new tune bug some time soon.
Jim
-
It doesn't hang for me, but it is definitely using a 2nd thread which could cause that. How are you quitting the program? The X in the window or Alt-F4 or?
I'll take a look at the new tune bug some time soon.
Jim
I forget, i also can't seem to reproduce it on my laptop which is where it initially occured - i would put this to one side for the time being, it seems to be fine now so either it was related to a particular song that had been loaded, my system was misbehaving, or something else. For the record, i quit with both the X, the quit button, and i've never alt-f4'd on this app before, and it didnt make any difference this time. oh well :)
-
Oh one thing - i noticed that the frontend you made hangs on my XP systems when quitting. It holds up the system for quite a while then eventually releases it, well, i say that - im hoping it does because it did one, the rest of the times i've had to kill the task manually (then wait more, even still). Would this be something in the AHX code with the sound drivers not releasing or something? (i'm not a coder, i could be barking up any tree).
Edit: Oh no!! My new piece causes the updated AHX player to crash at about 59 secs in! Shocked
I know in that part a lot of stuff is being pushed around in the instrument filters, i think it might be another unchecked limiter or something. it plays fine in delix/deliplayer and of course AHX itself. Cheers!
@m0d: Please try this new player version, I did some modifications on Jim frontend ( hope you don't mind Jim :) )
Btw, your last song is working fine with this version.
-
I have no problem with you editing the source. It's a shame that it no longer plays the current tune while you're browsing for another one though - I liked that!
Jim
-
I have no problem with you editing the source. It's a shame that it no longer plays the current tune while you're browsing for another one though - I liked that!
Jim
Phew :)
-
Weee :) I will test it when i get home, doesn't work on my win2k system@work (complains of missing dll's, as usual).
Great news rbraz - You know, all we need now is a funky graphic routine and we could release it as a demo :clap:
And just to celebrate the new player version, here's 2 more AHXes composed, enjoy :)
:buddies:
-
Still plan to fix the player. I like all kinds of pie-related music. Are you a butcher?
Jim
-
Jim,
Take a look at this thread: http://www.un4seen.com/forum/?topic=6641.0
It seems that this plugin uses Hively, which is based on WinAHX but has the bugs fixed already, although we are finding more each day - thought it might be of interest as I put your source code modification out there and got a reply about it. :)
p.s got 4 more ahx's on my http://m0d.untergrund.net/ site :)
-
Is the source for their player available? If so under what license? If theirs is so much better, and is GPL, it's barely worth fixing this one.
Jim
-
how about using the player with a C based program (and not C++) ?
I always have the same error in windows.cpp : at "AHXWaveOut::StartBackgroundPlay()" and " EventLoop()" -> _beginthread and _endthread undeclared
2. how about loading module from Resources or from an unsigned char tab, like I use Minifmod ?
how to implement that ?
-
hehe... the good old AHX former known as AHX sound replayer source for windows *grin* ... i got the source years ago directly from Dexter/Abyss afaik... (it was forbidden for me, to share/spread it)... so its cool to see the source is now public :)
@benny:
AHX is a really nice tracking system... i used and compoed tracks with it too - back on the good old amiga days :)
If someone is interested, i will try to recover some of my old AHX v1 and v2 tunes... ^^
-
_beginthread and _endthread undeclared
If you're building with Visual Studio 2003 or previous, you need to make sure you're building with the Multithreaded Runtime libraries (VS2005 only has multithreaded so it's not a problem there).
Project->Properties->Configuration Properties->C++->Code Generation->Runtime Library.
If you're using devc++, I'm not sure what the fix is. Those functions create and end threads, the subtle difference is that they make sure the C runtime has been initialised for that thread - each thread has its own C runtime state, eg. each thread has its own rand() seed, each has its own errno.
->va!n - it'd be great to hear some more tunes :)
Jim
-
ah! it's ok now ;)
thanks
but about the second "problem" : I don't want to use a file selector, but a built-in file in resource, or better, in a char tab (like minifmod)
is it possible to adapt the same rout than MiniFmod (memopen,memclose,memread...) with ahx (tuneload) ? I tried but failed...
-
...is it possible to adapt the same rout than MiniFmod (memopen,memclose,memread...) with ahx (tuneload) ? I tried but failed...
Yes, you can play direct from memory, I did it in this prod for intro inferno contest (http://www.intro-inferno.com/production.php?id=2459), you will need to convert your music into array and use this to play:
player = new AHXPlayer;
player->Init(NULL);
player->LoadSong(music, 13721);
player->InitSubsong(0);
Where "music" is your char array and "13721" is the music file length.
:cheers:
-
->va!n - it'd be great to hear some more tunes :)
Definately !
-
ok, i have searched all my old unmarked backup CDs and found a few AHX (former known as THX) version 0 and 1 tunes... The only different between version 0 and version 1 files is just one byte in the header of each tune... 0 = old version (no filter sample support)... 1 = new version (filter support for samples!)... You can simple track with lastest AHX tracker, save the tune and change the 1 in the header to 0, to get the tune played with the old (small 680x0) replayer... (if you dont use, or can life without filtered samples ^^ ) just as small info/cheat :P
Sadly atm i found only 3 tunes by me... one of them is real shit and made in a few minutes for a 32k-coop-game before deatline, when i optimized the code and we had some bytes for a tiny tune and replayer ^^ (you can find my tunes unter the directory mr.vain)
However, this time i am back with a small AHX Tune collection...
(just over 850+ complete AHX tunes (~3,8 MB) packed as ZIP into ~945 KB :)
http://www.secretly.de/public/va!ns_AHX_Collection.zip (http://www.secretly.de/public/va!ns_AHX_Collection.zip)
-
Cool. Downloading ... thx va!n - K++ !!!
-
my main problem is how to use cpp functions into main.c with VC6 :
the functions tune_init(),tune_stop()... are in an external cpp with include ahx.h and windows.h.
But I can't call them from my main.c (unresolved external symbol)
I removed static declaration, I tested with extern, but it doesn't work...
I renamed main.c in main.cpp to put functions in main but I get "unresolved external symbol" with ptc_open and ptc_update...
If you want to test, I use the TinyPTC DX9 framework (see in C/C++ coding forum)
-
Yup, fixable.
In the C++ file do this
extern "C" tune_init();
extern "C" tune_stop();
Then you can call it from C. The extern "C" tells the compiler to make that function callable from C. Don't use static.
->Va!n: thanks for the tunes. There's a standalone player I put together hanging around in this thread somewhere!
Jim
-
i'm desperate...it doesn't work
I tested with a main.cpp : now I have 4 unresolved external symbol : ptc_open/update and tune_init/stop!
-
Take it easy dude :) - it's something simple enough to fix :D . It's not working because you're guessing at the fixes. Mixing C and C++ can sometimes be tricky.
In your code where you're trying to call ptc_open(), at the top of that file afer the includes, add
extern "C" void ptc_open();
basically anywhere in your file before you call it.
Next, what compiler are you using? and is is possible for you to post your code?
Jim
-
VC6
I started with this sample (http://dbfinteractive.com/index.php?action=dlattach;topic=450.0;attach=219)
it's tinyptc with devcpp. It works fine with VC6.
extern "C" void ptc_open();
it's ok now for that
but not yet for tune_init...
-
argll
having put tune_xxx functions in my main.cpp and extern "C" = no more "unresolved external symbol" :D
But now it crashs (at tune_init() ? but also without ahx) ??? I tested the module tab char with your front end, and it's ok
Edit : it's seems to be the multithread. I set with DLL, and it works fine now !! :updance:
phew...
But if you have better way, let me know
-
Glad it's working :)...it does sound a little more like luck than judgement though - changing from static library to dll shouldn't really change anything.
Jim
-
hmm...I think I missed something when I compiled with static lib : MSVCRTD.lib ::)
-
I made a little intro with Ahx with multithread static lib, but cause big crash on Windows 98 (pagination error) and ask for a dll.
perhaps it's only msvcr71.dll ?
or is it possible to use only single thread, like with minifmod ?
-
Yes, but that makes it difficult to time the delivery of new samples in to the buffer when the buffer becomes empty. You have to make sure you check for the buffer being empty at the right points in your game loop. Difficult, but not impossible.
But it's not that that's causing your trouble. You have something wrong in the way you're building the program. If you post your code and project files (either here or in a PM), I will take a look, if you like?
Jim
-
thanks
the whole project (http://cyberpingui.free.fr/skidrow_tinyptc.zip) (but VC6)
sorry for the crappy and ugly code
If you have any comments, advices, update, enhancement, debug...feel free
-
Thanks for that.
I can't see anything obviously wrong (code review, my VC6 is on a PC I can't get at until tomorrow), but can you try something? Remove all the #pragma stuff, that's not the best way to do this. Make sure you turn off the option in the project settings which disables default libraries. In the extra linker dependencies add winmm.lib. If you need the other stuff to work you can add ddraw.lib in there too. In the settings for the runtime library, make sure it's set for Multithreaded Static library. Delete the winmm.lib from your folder - you want to be using the one that comes with VS6 (probably the same one, but best to be on the safe side). If it can't find it, you need to add the path to the platform SDK in the Tools->Options menu.
Then fix the debug version - you need to be able to trace where this is going wrong. Does it work if you use tune_init() with a .ahx file rather than with the include file version? Does it crash in tune_init2 or further on?
Your code's not so crappy, I was able to see what you're up to without building it in a few minutes. I'm sure you'll tidy it up when you're closer to getting everything the way you want ;)
Jim
-
in multithreaded mode, vc add libcmt.lib, but if I miss msvcrt.lib, exe crash :
"instruction 0x77f47bd2 (ntdll) use address 0x00000010. memory can't be read"
if I use MD, no problem. If I use MT, no warning, but crash
libcmt is for static multithread and msvcrt for dll multithread, no ?
In another program, I also use Ahx and it doesn't need msvcrt in static multithread. works fine in both mode.
phew...there's something wrong here...
I tried to remove pragma, checked runtime lib, etc... but I can't test now because I haven't win98, it's a friend of mine. so I'm waiting his test :-\
-
is it possible to change the code and use API CreateThread ? no more need libcmt.lib in static
-
If you use CreateThread() instead of beginthread() then the runtime library isn't initialised properly for the new thread.
If you just let VC6 manage what libraries it needs and set the settings right in the project properties, you will never have to worry about whether it needs libcmt, msvcrt etc. If it needs the DLL then some setting is wrong somewhere and this is almost certainly why it's crashing. I'll try to have a look at it this morning.
That crash indicates you passed some crap (probably NULL) into a Windows function.
Jim
-
I've found the problem. In your project you have tinyptc.c with this in it...
//
// TinyPTC by Gaffer
// www.gaffer.org/tinyptc
//
#include "tinyptc.h"
//----------------------------- windows mode
#ifdef __PTC_WINMAIN_CRT__
extern int main();
void WinMainCRTStartup()
{
main();
}
#endif
//------------------------------ console mode
#ifdef __PTC_MAIN_CRT__
extern int main();
void MainCRTStartup()
{
main();
}
#endif
That's bad. It means that instead of calling the code that sets up the C runtime library (WinMainCRTStartup()), it calls this function instead. This function then calls in to main() in tinyptc_stars.cpp.
So basically as soon as it hit the 'new' inside tune_init2() the memory allocator hasn't been initialised and it blows its brains out.
You need to remove tinyptc.c from your project, and change
int main() in tinyptc_stars.cpp to
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
which is the proper startup function for Windows programs. You need to add a couple of return 0s too.
You also need to remove libtinyptcwin.lib and msvcrt.lib from the link options and add winmm.lib. You don't need any of the #pragma stuff.
The reason it works with the dll but not static is that the very act of loading the dll means the C runtime gets initialised. But it's still naughty to override MainCRTStartup().
Have fun!
Jim
-
I guess the reason it's doing this is because you (or whoever wrote the original sample) really wanted to make the program very tiny. You can only do that if you have /nodefaultlib set, but that means NO CRT AT ALL, including the use of 'new'. AHX is written to use Windows API instead of CRT. I suppose you could overload the new/delete operators to use GlobalAlloc/GlobalFree.
Jim
-
ok, thanks
the compilation is ok now
I hope that it will work fine on win98 now
:cheers:
-
Let us know!
Cheers!
Jim
-
It's OK now ;D
the old version asked for msvcrt.dll and the big crash was from fsg packer!
but some questions about timing/fps with tinyptc/directx/opengl:
my friend have an old pc (400 mhz). He have tested 2 progs : this one, with tinyptc/ddraw, and that one (http://cyberpingui.free.fr/ahx_debug.zip) using OpenGl and he say me that they run very very slowly !
It's strange because I remember on my P166 Mhz to have run 3Dmark99 and 3Dmark2000 with a good speed on 3dfx and riva tnt cards. Unfortunately, my p166 is dead, and I can't test my 2 progs. Edit : ok, he have a S3Trio...but it's strange for the simple ddraw intro.
I think the problem is the timing fixed to 60 fps. and I think it's a wrong way.
what are the better ways to adapt fps ?
-
Nice little demo...thanks for the name drop :)
I'm not sure about old 3dfx cards - they used to have a special OpenGL driver (as opengl32.dll) which didn't really support everything - so if you're using glPoint or something like that it might be really slow. It's quite possible that both are rendering in software...
How are you syncing to 60Hz? Using wglSwapIntervalEXT() is a good way to sync to the vblank, but if you run at < 60fps everything will look slow and/or jerky. Either that or you can use the timer (Sleep, timeGetTime, QueryPerformanceCounter) but you have to be careful then about precision.
Jim
-
for opengl intro, I used SetTimer(hwnd,1,1000/60,null), case wm_timer:...
for tinyptc intro, it's in the main loop with timeGetTime
but for my friend, he have a S3Trio graphic card, so...
-
Try adding
timeBeginPeriod(1)right at the start, and
timeEndPeriod(1)right at the end of your program.
That should give the timers a bit more accuracy. Right now they'll be all over the place.
I don't think that will fix the S3Trio problem though - old card that...
Jim
-
Hi,
does somebody have working links for the player (AYS-AHX-Sources.zip)?
I'm currently looking for the smartest static library to play ahx stuff.
I saw this one, too: http://www.dbfinteractive.com/forum/index.php/topic,3876.0.html
But it starts up after a huuuge delay of time only (several secs).
cheers
-
Hi,
does somebody have working links for the player (AYS-AHX-Sources.zip)?
I'm currently looking for the smartest static library to play ahx stuff.
I saw this one, too: http://www.dbfinteractive.com/forum/index.php/topic,3876.0.html
But it starts up after a huuuge delay of time only (several secs).
cheers
Here (https://dl.dropbox.com/u/14569142/AYS-AHX-Sources.zip) you go ufo. Welcome to DBF too btw :)
-
Whoop.. big thx for the prompt reply!!
But aww.. no compiled ready to use static lib in there :|
Let's see if I can build something usable for the folks with it.
Will report back..
-
OK, if anybody ever needs to play AHX in C or ASM via a static
lib (~10kb when packed), then check out the attachment.
cheers
-
Nice one ufo, K++ :)
-
just out of interest, does anyone still have a copy of va!ns AHX collection that he posted a lot earlier in this thread? the original URL was http://www.secretly.de/public/va!ns_AHX_Collection.zip but it seems to be no longer alive :(
-
just out of interest, does anyone still have a copy of va!ns AHX collection that he posted a lot earlier in this thread? the original URL was http://www.secretly.de/public/va!ns_AHX_Collection.zip but it seems to be no longer alive :(
Afraid I don't have a copy. I've attached a bunch of AHX tunes to this post though, that I had hanging around from an old AHX player I wrote for the PS2 about 10 years ago.
-
Thanks very much Raizor - this is lovely stuff, and very kind of you to share :-)
-
You're most welcome :)
There are some more here too http://www.mmnt.net/db/0/0/ftp.rave.ca/pub/favourites/AHX/ (http://www.mmnt.net/db/0/0/ftp.rave.ca/pub/favourites/AHX/).
And a ton on this FTP (http://ftp://ftp.modland.com/pub/modules/AHX/).