Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/common/Generation/VariationRythm.py
blob: 5fb6111afd83949c54d0aca34397e888d49a6153 (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
import random

import common.Config as Config

# remplacer position dans notesList par l'attribut de CSoundNote
class RythmShuffle:

    def getNewList( self, notesList, nbeats ):
        self.barLength = Config.TICKS_PER_BEAT * nbeats
        self.onsetDelta = 0
        self.newOnsetList = []
        self.oldDuration = []
        self.newDuration = []
        self.extractOnsetValue(notesList)

        self.newOnsetList = random.sample(range(len(self.originalList)), len(self.originalList))
        self.getOldDuration(notesList)
        self.getNewDuration(notesList)

        for i in range(len(notesList)):
            notesList[i].onset = self.onsetDelta
            notesList[i].duration = self.oldDuration[i] * self.newDuration[i]
            self.onsetDelta = self.onsetDelta + self.originalList[self.newOnsetList[i]]

        return notesList
    
    def extractOnsetValue( self, notesList ):
        self.originalList = []
        for note in notesList:
            self.originalList.append(note.onset)

        for i in range(len(self.originalList) -1):
            self.originalList[i] = self.originalList[i+1] - self.originalList[i]

        self.originalList[-1] = self.barLength - (self.originalList[-1] % self.barLength)

    def getOldDuration( self, notesList ):
        for i in range(len(notesList)):
            if (i+1) == len(notesList):
                self.oldDuration.append(notesList[i].duration / (self.barLength - (notesList[i].onset % self.barLength)))
            else:
                self.oldDuration.append(notesList[i].duration / (notesList[i+1].onset - notesList[i].onset))

    def getNewDuration( self, notesList ):
        for i in self.newOnsetList:
            if (i+1) == len(notesList):
                self.newDuration.append(self.barLength - (notesList[i].onset % self.barLength))
            else:
                self.newDuration.append(notesList[i+1].onset - notesList[i].onset)

class RythmReverse( RythmShuffle ):

    def getNewList( self, notesList, nbeats ):
        self.barLength = Config.TICKS_PER_BEAT * nbeats
        self.onsetDelta = 0
        self.newOnsetList = []
        self.oldDuration = []
        self.newDuration = []
        RythmShuffle.extractOnsetValue( self, notesList )

        for i in range( len( self.originalList ) ):
            self.newOnsetList.append( i )

        self.newOnsetList.reverse() 

        RythmShuffle.getOldDuration( self, notesList )
        RythmShuffle.getNewDuration( self, notesList )

        for i in range(len(notesList)):
            notesList[i].onset = self.onsetDelta
            notesList[i].duration = self.oldDuration[i] * self.newDuration[i]
            self.onsetDelta = self.onsetDelta + self.originalList[self.newOnsetList[i]]

        return notesList