Skip to content

Instantly share code, notes, and snippets.

@rhaberkorn
Created December 30, 2010 04:33
Show Gist options
  • Save rhaberkorn/759460 to your computer and use it in GitHub Desktop.
Save rhaberkorn/759460 to your computer and use it in GitHub Desktop.
'shuffle' wave files (quick Open Watcom FORTRAN hack)
* Rearranges patches of a wave-file (shuffles them like a card deck)
program REARRANGE
include 'fsublib.fi'
structure /WAVEHEADER/
integer main_id
integer length
integer wave_id
integer fmt_id
integer fmt_length
integer*2 format
integer*2 channels
integer samplerate
integer byte_per_second
integer*2 samplesize
integer*2 bit
integer data_id
integer data_length
end structure
character*256 arg
record /WAVEHEADER/ header
logical exists
integer*2 t_h, t_m, t_s, t_ms
integer*1 buffer(:)
integer src, dst, status, size, patchsize
real length
if(iargc() .NE. 4)
& stop 'rearrange {infile.wav} {outfile.wav} {patchsize|0}'
call igetarg(3, arg)
read(arg,*) length
call igetarg(1, arg)
inquire(file=arg, exist=exists)
if(.not. exists) go to 666
open(10, file=arg, status='OLD', access='SEQUENTIAL', err=666,
& form='UNFORMATTED', recordtype='FIXED', action='READ')
read(10,err=666) header
header.samplesize = 2
size = filesize(10) - isizeof(header)
allocate(buffer(size), stat=status)
if(status .NE. 0) go to 666
read(10,err=666) buffer
close(10)
call gettim(t_h, t_m, t_s, t_ms)
if(length .NE. 0)
& patchsize = length*header.samplesize*header.samplerate
i = 1
while(i .LE. size) do
if(length .EQ. 0)
& patchsize = urand(t_ms)*header.samplesize*header.samplerate
if(mod(patchsize, 2)) patchsize = patchsize + 1
if(i + patchsize .GT. size) quit
k = int(urand(t_ms)*(size-patchsize)/
& (header.channels*header.samplesize))*
& header.channels*header.samplesize + 1
do j = 0, patchsize
src = buffer(i+j)
dst = buffer(k+j)
buffer(i+j) = dst
buffer(k+j) = src
end do
i = i + patchsize
end while
call igetarg(2, arg)
inquire(file=arg, exist=exists)
if(exists) call fsystem('del '//arg(:lentrim(arg)))
open(10, file=arg, status='NEW', access='SEQUENTIAL',err=666,
& form='UNFORMATTED', recordtype='FIXED', action='WRITE')
write(10,err=666) header
write(10,err=666) buffer
close(10)
deallocate(buffer)
stop 'Finished properly'
666 print *, 'Some kind of error occured - but I don''t care...'
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment