1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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
|