My last version probably - done a bit more tweaking - nothing major. Fireworks are now more brightly coloured - no shades of grey or brown for example, which was possible before due to the random colour generation. Also added a blur effect, which I think also gives the fireworks a bit more of a sparkly effect you get around the edges. And yes, I agree, the sound does get annoying after about 5 seconds. Please adjust the volume control accordingly!
autocam off
color backdrop 0
set ambient light 0
hide mouse
make light 1
position light 1,0,2,0
set light range 1,10000
make light 2
position light 2,0,0,0
set light range 2,10000
position camera 0,0,-2
randomize timer()
sync on
sync rate 40
make camera 1
color backdrop 1,rgb(30,30,30)
set camera to image 1,2,128,128
set camera range 0,0.1,1000
set camera range 1,0.1,1000
createsound("sparkle1",10,8000,3000,500,30,0.01,10,5,0,0,0.05)
createsound("sparkle2",11,6200,5000,300,30,0.01,10,5,0,0,0.05)
createsound("sparkle3",12,4000,5000,800,30,0.01,10,5,0,0,0.05)
createsound("rocket1",4,1600,2000,2000,0.003,0.01,0,0,0,0,10)
createsound("rocket2",5,2000,2500,2000,0.004,0.005,0,0,0,0,10)
createsound("rocket3",7,1800,3500,2000,0.002,0.01,0,0,0,0,10)
createsound("deep explosion",9,30,100,16000,0.00,1.5,.0,0,0,0,100)
make object plain 1000000,-1.6,1.2
texture object 1000000,2
set object transparency 1000000,3
set alpha mapping on 1000000,60
for ob=10000 to 10020
make object box ob,rnd(2)/10.0+0.1,rnd(10)/10.0+0.3,rnd(2)/10.0+0.1
position object ob,rnd(40)/10.0-2,-2+object size y(ob)/2,rnd(40)/10.0-2
set object specular power ob,0
color object ob,rgb(rnd(30),rnd(30),rnd(30))
set object specular ob,rgb(100,100,100)
next ob
global numberoffwks
numberoffwks=8
create_firework()
ink rgb(255,255,255),0
blur=15
for ob=1 to blur
show object ob
next ob
n=blur+1
dim offset(100*numberoffwks)
for clone=100 to 100*numberoffwks step 100
offset(clone)=rnd(100)
next clone
do
position object 1000000,camera position x(0),camera position y(0),camera position z(0)
set object to camera orientation 1000000
move object 1000000,1.0
position camera 1,camera position x(0),camera position y(0),camera position z(0)
point camera 1,0,0.5,0
if rnd(20)=0 then color backdrop rgb(30,30,30) else color backdrop 0
for ob=10000 to 10020
set object specular ob,rgb(rnd(60),rnd(60),rnd(60))
next ob
for clone=0 to 100*numberoffwks step 100
show=n+offset(clone)
if show>100 then dec show,100
hide=n+offset(clone)-blur
if hide>100
dec hide,100
endif
if hide<1 then inc hide,100
show object show+clone
hide object hide+clone
next clone
inc n
if n>100 then n=1
position camera 4*sin(theta#),-2,4*cos(theta#)
inc theta#,0.5
point camera 0,0.5,0
if rnd(5)=0 and sound playing(4)=0 then play sound 4
if rnd(5)=0 and sound playing(5)=0 then play sound 5
if rnd(5)=0 and sound playing(7)=0 then play sound 7
if rnd(14)=0 and sound playing(9)=0 then play sound 9
if rnd(10)=0 and sound playing(10)=0 then play sound 10
if rnd(10)=0 and sound playing(11)=0 then play sound 11
if rnd(10)=0 and sound playing(12)=0 then play sound 12
text 0,0,str$(screen fps())
sync
loop
function create_firework
bushiness=300
droopiness#=4
roundness=100
density=5
create bitmap 2,400,400
set current bitmap 2
cls
for l=1 to bushiness
if rnd(density)=0 then ink rgb(255,255,255),0 else ink 0,0
for d=1 to bushiness
if rnd(density)=0 then dot d,l
next d
next l
get image 1,1,1,bushiness,bushiness,1
set current bitmap 0
delete bitmap 2
ob=1
polarity=1
dim x#(100*numberoffwks)
dim y#(100*numberoffwks)
dim z#(100*numberoffwks)
dim r(100*numberoffwks)
dim g(100*numberoffwks)
dim b(100*numberoffwks)
for clone=100 to 100*numberoffwks step 100
x#(clone)=(rnd(30)/10.0)-1.5
y#(clone)=(rnd(30)/10.0)-0.5
z#(clone)=(rnd(30)/10.0)-1.5
r(clone)=(250)
if rnd(1)=0 then g(clone)=(250) else g(clone)=0
if rnd(1)=0 then b(clone)=(250) else b(clone)=0
next clone
for a#=0.01 to 1.0 step 0.01
make object sphere ob,(0.05+a#)*1.5,10,10
position object ob,0,-(a#/(droopiness#/0.5)),0
hide object ob
set object transparency ob,5
texture object ob,1
fade object ob,400-(ob*4)
set object specular power ob,0
set object emissive ob,rgb(0,0,255)
set object specular ob,rgb(0,0,255)
for clone=100 to 100*numberoffwks step 100
clone object ob+clone,ob
set object emissive ob,rgb(r(clone),g(clone),b(clone))
set object specular ob,rgb(r(clone),g(clone),b(clone))
position object ob+clone,x#(clone),y#(clone)-(a#/(droopiness#/0.5)),z#(clone)
hide object ob+clone
next clone
inc ob
next a#
for n#=1.0 to 100.0
xrotate object n#,n#/50.0
next n#
endfunction
function createsound(name$,soundnumber,frequency#,length#,loudness#,bend#,decay#,vibratospeed#,vibratodepth#,tremelospeed#,tremelodepth#,attack#)
outWord as word
dword1 as dword: dword2 as dword: dword3 as dword: dword4 as dword
dword5 as dword: dword6 as dword: dword7 as dword
samples=int((length#/1000)*44100)
if memblock exist(1) then delete memblock 1
make memblock 1,samples*2+28
` write 28 memblock header bytes
dword1=1
dword2=2
dword3=22050
dword4=88200
dword5=4
dword6=16
dword7=0
position=0
write memblock dword 1, position, dword1 : inc position,4
write memblock dword 1, position, dword2 : inc position,4
write memblock dword 1, position, dword3 : inc position,4
write memblock dword 1, position, dword4 : inc position,4
write memblock dword 1, position, dword5 : inc position,4
write memblock dword 1, position, dword6 : inc position,4
write memblock dword 1, position, dword7 : inc position,4
rem generate and write wave
riseinloudness#=loudness#
for x=1 to samples
outInteger=int(sin((x/122.5)*(frequency#+vibratodepth#*sin(theta#)))*(loudness#-fallinloudness#-riseinloudness#+tremelodepth#*sin(phi#)))*3.0
if outInteger <-32767 then outInteger=-32767
if outInteger>32767 then outInteger=32767
outWord=outInteger
inc theta#,vibratospeed#
inc phi#,tremelospeed#
dec frequency#,bend#
if fallinloudness#<loudness#
inc fallinloudness#,decay#
endif
if riseinloudness#>0
dec riseinloudness#,attack#
endif
write memblock word 1, position, outWord : inc position,2
next x
if sound exist(soundnumber)=1 then delete sound soundnumber
make sound from memblock 999, 1 ` assumes you won't need sound number 999!
clone sound soundnumber, 999
delete sound 999
` memblock no longer required
delete memblock 1
endfunction