Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1415:projekte_im_wintersemester_2014_15:bildzutoncode

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1415:projekte_im_wintersemester_2014_15:bildzutoncode [2015/02/28 15:37]
lschmittmann
ws1415:projekte_im_wintersemester_2014_15:bildzutoncode [2016/05/10 14:46] (aktuell)
Zeile 436: Zeile 436:
             return plraster             return plraster
 </​code>​ </​code>​
-==== Markovketten ​====+==== Farbräume ​====
 <code python> <code python>
 +
 +    def farbraume (self, z=2): #z Anzahl der Teilbereiche pro Farbkomponente
 +        '''​Wenn man sich den RGB-Farbraum als Würfel vorstellt, so kann man diesen in kleinere Würfel zerlegen. Diese Methode zerlegt den Würfel in z*z*z kleine Würfel und ordnet jedem Pixel den Würfel zu, in dem er liegt.'''​
 +        farbraume = []
 +        for i in range (z):
 +            for j in range (z):
 +                for k in range (z):
 +                    farbraume.append((i,​j,​k))
 +
 +        konvpixel = []
 +        for pixel in self.pixels:​
 +            r = pixel[0]
 +            g = pixel[1]
 +            b = pixel[2]
 +            for i in range(z): ​         ​
 +                if (256/z)*i <= r and r < (256*(i+1))/​z:​
 +                    rl = i #rot
 +                if (256/z)*i <= g and g < (256*(i+1))/​z:​
 +                    gl = i #grün
 +                if (256/z)*i <= b and b < (256*(i+1))/​z:​
 +                    bl = i #blau
 +            konvpixel.append((rl,​gl,​bl))
 +        return [farbraume.index(tupel) for tupel in konvpixel]
 +</​code>​
 +==== Synthesizer ====
 +<code python>
 +def tune(f, d, r=44100, mode='​sinus'​):​
 + vol = 1
 + waves = []
 + waves.append(sinewave(f,​ r, d))
 + if mode == '​organ':​
 + while vol >= 0.1:
 + vol *= 0.7
 + waves.append(sinewave(f*freq.getRatio('​quinte'​),​ r, d, vol=vol/​2))
 + f *= freq.getRatio('​oktave'​)
 + waves.append(sinewave(f,​ r, d, vol = vol))
 + if '#'​ in mode: #bei #​a-z1,​b-z2,​c-z3,​d-z4,​g-z5,​t-z6,​e-z7 wird der a-te, b-te, ..., e-te oberton hinzugefügt mit z1, z2,..., z7 % lautstärke
 + toene = mode[1:​].split(','​)
 + for ton in toene:
 + waves.append(sinewave(f*2**int(ton[:​ton.index('​-'​)]),​ r, d, vol=int(ton[ton.index('​-'​):​])/​100))
 +
 + return wave
 +</​code>​
 +==== MARKOV ====
 +<code python>
 +    from __future__ import division
 +    from bild import Bild
 +    import matplotlib.pyplot as plt
 +    import numpy as np
 +    from sound import *
 +    import frequenzen as freq
 +    import zufallszahlen as zahlen
 +    import rhythm
 +    ​
 +    def normMatrix(matrix):​
 +            '''​normiert die Spalten der Matrix, so dass die Summe aller elemente einer Spalte genau 1 ergibt, das Verhaeltnis zwischen den Spalten aber                                                   noch erhalten bleibt.'''​
 +        matrixcopy = []
 +        for col in matrix:
 +            colcopy = []
 +            nenner = sum(col)
 +            if nenner != 0:
 +                for element in col:
 +                    colcopy.append(element/​nenner)
 +                matrixcopy.append(colcopy)
 +            else:
 +                colcopy = [1/len(col) for x in range(len(col))]
 +                print colcopy
 +        return matrixcopy
 +    def step(matrix,​ vec, step = 1):
 +        '''​berechnet den Vector der Notenwahrscheinlichkeit nach step Noten'''​
 +        for i in range(step):​
 +            retvec = []
 +            for y in range(len(matrix[0])):​
 +                retvec.append(sum([matrix[x][y]*vec[x] for x in range(len(matrix))]))
 +            vec = retvec[:]
 +        return vec
 +    def nextTune(matrix,​ vec, val):
 +        '''​val muss zwischen 0 und 1 liegen. Dann berechnet diese Methode den naechsten Ton, der gespielt wird.'''​
 +        element = 0
 +        probvec = step(matrix,​ vec)
 +        print sum(probvec),​ " >= ", val
 +        while sum(probvec[:​element+1]) < val:
 +            element += 1
 +            if (element == len(probvec)-1):​
 +                return element
 +        #print '​Tonhoehe berechnet.'​
 +        return element
 +    def generateMelodie(pic,​ nums, tunes = 24):
 +        '''​nums muss eine Liste mit zahlen zwischen 0 und 1 sein'''​
 +        matrix = pic.transformImage(tunes,​ tunes)
 +        matrix = normMatrix(matrix)
 +        melodie = []
 +        vec = genVector(9,​ tunes)
 +        for num in nums:
 +            melodie.append(nextTune(matrix,​ vec, num))
 +            vec = genVector(melodie[-1])
 +            print 'Ton wurde der Melodie hinzugefuegt.'​
 +        #print '​Melodie erzeugt.'​
 +        return melodie
 +    def generateTune(pic,​ notes = 240, tunes = 24, length = 1, mode = '​sinus'​):​
 +        '''​generiert ein Sound object, mit einer durch markov ketten erstellte melodie'''​
 +        nums = zahlen.zufallsZahl(pic,​ notes)
 +        print nums
 +        print '​Zufallszahlen generiert.'​
 +        melodie = generateMelodie(pic,​ nums, tunes)
 +        print '​Melodie erzeugt.'​
 +        rhythmus = rhythm.generateRhythm(pic,​ len(nums), length, 4)
 +        print '​Rhythmus erzeugt.'​
 +        tonlage = 1
 +        s = Sound(np.array([]))
 +        for i in range(len(melodie)):​
 +            ton = melodie[i]
 +            laenge = rhythmus[i]
 +            tune = createTune(freq.getFreq(freq.buchstaben[ton%8][0])*2**(tonlage-ton//​8),​ laenge, mode = mode)
 +            #print max(tune)
 +            s.appendSound([tune],​ swz.GRENZE)
 +        print '​Fertig.'​
 +        return s
 +    def genVector(eins,​ length = 24):
 +        '''​generiert einen Vector der Laenge length mit einer 1 an der stelle eins'''​
 +        vec = [0 for i in range(length)]
 +        vec[eins] = 1
 +        return vec
 +    def genRandList(length,​ maximum):
 +        return [(np.random.random_integers(maximum+1)-1)/​maximum for x in range(length)]
 +</​code> ​   ​
 +==== Zufallszahlen ====
 +Zufallszahlen für Markov-ketten
 +<code python>
 +# -*- coding: cp1252 -*-
 +#​Zufallszahl für Markov-Kette
 +
 +#-*- coding: utf-8 -*-
 from __future__ import division from __future__ import division
 +from PIL import Image
 +import random
 from bild import Bild from bild import Bild
-import matplotlib.pyplot as plt 
 import numpy as np import numpy as np
-from sound import * 
-import frequenzen as freq 
-import zufallszahlen as zahlen 
-import rhythm 
  
 +def spaltenBreite(bild,​ spalten = 240):
 +    '''​Spaltenbreite der Pixel die zusammengefasst wird!'''​
 +    n = bild.bBreite()
 +    b = int((n-(n%spalten))/​spalten)
 +    if b == 0:
 +        return 1
 +    return b 
  
-def normMatrix(matrix): +def spalten(bild, spaltenum = 240): 
-    ​'''​normiert die Spalten der Matrix, so dass die Summe aller elemente einer Spalte genau 1 ergibt, das Verhaeltnis zwischen den Spalten aber noch erhalten bleibt.'''​ +    ​spalten ​= [] 
-    matrixcopy ​= [] +    ​pic bild.rasterList(bild.farbraume(4)) 
-    ​for col in matrix: +    ​sBreite ​spaltenBreite(bild, spaltenum
-        colcopy ​[] +    ​ende ​bild.bBreite()-bild.bBreite()%sBreite 
-        ​nenner ​sum(col+    if ende == 0
-        if nenner !0: +        ​ende ​bild.bBreite() 
-            for element in col: +    for i in range(0, ende, sBreite): 
-                colcopy.append(element/​nenner) +        ​spalte ​= [] 
-            matrixcopy.append(colcopy+        for in range(sBreite): 
-        else+            ​if (i+len(pic)): 
-            ​colcopy ​[1/len(colfor x in range(len(col))] +                ​spalte ​+= pic[i+x
-            print colcopy +        ​spalten.append(spalte  
-    return matrixcopy +    return ​spalten 
-def step(matrix,​ vec, step = 1): + 
-    '''​berechnet den Vector der Notenwahrscheinlichkeit nach step Noten'''​ +def zufallsZahl(bildspaltenum ​= 240): 
-    for i in range(step): +    ​bild.bBreite() 
-        ​retvec ​= [] +    ​spaltenBreite(bildspaltenum
-        for in range(len(matrix[0])): +    ​int(bild.bHohe()) 
-            ​retvec.append(sum([matrix[x][y]*vec[x] for x in range(len(matrix))])) +    ​l 
-        vec = retvec[:] + 
-    ​return vec +    ​spalter ​= [] 
-def nextTune(matrix,​ vec, val): +    ​spaltenliste ​spalten(bildspaltenum)
-    '''​val muss zwischen 0 und 1 liegen. Dann berechnet diese Methode den naechsten Ton, der gespielt wird.'''​ +
-    element = 0 +
-    probvec = step(matrix,​ vec) +
-    print sum(probvec),​ " >= ", val +
-    while sum(probvec[:​element+1]) < val: +
-        element ​+= +
-        if (element == len(probvec)-1):​ +
-            return element +
-    #print '​Tonhoehe berechnet.'​ +
-    return element +
-def generateMelodie(pic, nums, tunes = 24): +
-    '''​nums muss eine Liste mit zahlen zwischen 0 und 1 sein'''​ +
-    matrix = pic.transformImage(tunes,​ tunes) +
-    matrix = normMatrix(matrix) +
-    melodie = [] +
-    vec = genVector(9,​ tunes) +
-    for num in nums: +
-        ​melodie.append(nextTune(matrix,​ vec, num)+
-        vec = genVector(melodie[-1]) +
-        print 'Ton wurde der Melodie hinzugefuegt.'​ +
-    #print '​Melodie erzeugt.'​ +
-    return ​melodie +
-def generateTune(picnotes = 240, tunes = 24, length = 1, mode = '​sinus'​): +
-    ​'''​generiert ein Sound object, mit einer durch markov ketten erstellte melodie'''​ +
-    nums zahlen.zufallsZahl(pic, notes+
-    ​print nums +
-    print '​Zufallszahlen generiert.'​ +
-    melodie ​generateMelodie(pic, numstunes+
-    ​print '​Melodie erzeugt.'​ +
-    rhythmus ​rhythm.generateRhythm(pic, len(nums), length, 4) +
-    print '​Rhythmus erzeugt.+
-    tonlage = 1 +
-    s = Sound(np.array([])) +
-    ​for i in range(len(melodie)):​ +
-        ton melodie[i] +
-        laenge = rhythmus[i] +
-        tune = createTune(freq.getFreq(freq.buchstaben[ton%8][0])*2**(tonlage-ton//​8),​ laenge, mode = mode) +
-        #​print max(tune) +
-        s.appendSound([tune],​ swz.GRENZE) +
-    ​print '​Fertig.'​ +
-    return s +
-def genVector(eins,​ length = 24): +
-    '''​generiert einen Vector der Laenge length mit einer 1 an der stelle eins'''​ +
-    vec = [0 for i in range(length)+
-    ​vec[eins] ​+
-    return vec +
-def genRandList(lengthmaximum)+
-    return [(np.random.random_integers(maximum+1)-1)/​maximum for x in range(length)] +
-    ​+
     ​     ​
 +    for spalte in spaltenliste:​
 +        spalter.append(sum(spalte)/​len(spalte)) ​       ​
 +
 +    zZahl = []
 +    for spalte in range(len(spalter)):​
 +        varianz = 0
 +        for y in range(r):
 +            x1 = spalter[spalte]
 +            x2 = spaltenliste[spalte][y]
 +            varianz += 1/r*(x1 - x2)**2
 +        zZahl.append(varianz)
 +    maximum = max(zZahl)
 +    return [num/​maximum for num in zZahl]
 +</​code>  ​
ws1415/projekte_im_wintersemester_2014_15/bildzutoncode.1425134253.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)