diff options
author | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2025-10-06 00:48:48 +0300 |
---|---|---|
committer | Robin Haberkorn <rhaberkorn@fmsbw.de> | 2025-10-06 00:48:48 +0300 |
commit | ad9e7cd5117c965222aae708f660e56d537914fc (patch) | |
tree | 580006656ec76513500170e5646e92e7819c6c0b /rearrange.for | |
download | snippets-ad9e7cd5117c965222aae708f660e56d537914fc.tar.gz |
imported all of my Github gists from https://gist.github.com/rhaberkorn
Diffstat (limited to 'rearrange.for')
-rw-r--r-- | rearrange.for | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/rearrange.for b/rearrange.for new file mode 100644 index 0000000..0b72da6 --- /dev/null +++ b/rearrange.for @@ -0,0 +1,85 @@ +* 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 |