aboutsummaryrefslogtreecommitdiff
path: root/rearrange.for
blob: 0b72da6da1a62a921a7694327f6eaa13dc22bbdd (plain)
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