aboutsummaryrefslogtreecommitdiff
path: root/rearrange.for
diff options
context:
space:
mode:
authorRobin Haberkorn <rhaberkorn@fmsbw.de>2025-10-06 00:48:48 +0300
committerRobin Haberkorn <rhaberkorn@fmsbw.de>2025-10-06 00:48:48 +0300
commitad9e7cd5117c965222aae708f660e56d537914fc (patch)
tree580006656ec76513500170e5646e92e7819c6c0b /rearrange.for
downloadsnippets-ad9e7cd5117c965222aae708f660e56d537914fc.tar.gz
imported all of my Github gists from https://gist.github.com/rhaberkorn
Diffstat (limited to 'rearrange.for')
-rw-r--r--rearrange.for85
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