karplus-strong in python
This commit is contained in:
		
							parent
							
								
									7fa52a235a
								
							
						
					
					
						commit
						181393821a
					
				
					 4 changed files with 120 additions and 0 deletions
				
			
		
							
								
								
									
										54
									
								
								projekte/soundz/karplus-simple.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								projekte/soundz/karplus-simple.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
############################################################
 | 
			
		||||
#
 | 
			
		||||
# karplus-simple.py
 | 
			
		||||
#
 | 
			
		||||
# Author: MV (http://electro-nut.blogspot.com/)
 | 
			
		||||
#
 | 
			
		||||
# Generates a plucked string sound WAV file using the
 | 
			
		||||
# Karplus-Strong algorithm. (Simple version.)
 | 
			
		||||
#
 | 
			
		||||
############################################################
 | 
			
		||||
from math import sin, pi
 | 
			
		||||
from array import array
 | 
			
		||||
from random import random
 | 
			
		||||
 | 
			
		||||
import wave
 | 
			
		||||
 | 
			
		||||
# KS params
 | 
			
		||||
SR = 44100
 | 
			
		||||
f = 220
 | 
			
		||||
N = SR/f
 | 
			
		||||
 | 
			
		||||
# WAV params
 | 
			
		||||
NCHANNELS = 1
 | 
			
		||||
SWIDTH = 2
 | 
			
		||||
FRAME_RATE = 44100
 | 
			
		||||
NFRAMES = 44100
 | 
			
		||||
NSAMPLES = 44100
 | 
			
		||||
# max - 128 for 8-bit, 32767 for 16-bit
 | 
			
		||||
MAX_VAL= 32767
 | 
			
		||||
 | 
			
		||||
# pluck
 | 
			
		||||
buf = [random() - 0.5 for i in range(N)]
 | 
			
		||||
 | 
			
		||||
#init samples 
 | 
			
		||||
samples = []
 | 
			
		||||
 | 
			
		||||
# KS - ring buffer
 | 
			
		||||
bufSize = len(buf)
 | 
			
		||||
for i in range(NSAMPLES):
 | 
			
		||||
    samples.append(buf[0])
 | 
			
		||||
    avg = 0.996*0.5*(buf[0] + buf[1])
 | 
			
		||||
    buf.append(avg)
 | 
			
		||||
    buf.pop(0)
 | 
			
		||||
 | 
			
		||||
# samples to 16-bit to string
 | 
			
		||||
tmpBuf = [int(x*MAX_VAL) for x in samples] 
 | 
			
		||||
data = array('h', tmpBuf).tostring()
 | 
			
		||||
 | 
			
		||||
# write out WAV file
 | 
			
		||||
file = wave.open('karplus-simple.wav', 'wb')
 | 
			
		||||
file.setparams((NCHANNELS, SWIDTH, FRAME_RATE, NFRAMES,
 | 
			
		||||
                'NONE', 'noncompressed'))
 | 
			
		||||
file.writeframes(data)
 | 
			
		||||
file.close()
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								projekte/soundz/karplus-simple.wav
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								projekte/soundz/karplus-simple.wav
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										66
									
								
								projekte/soundz/karplus.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								projekte/soundz/karplus.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
############################################################
 | 
			
		||||
#
 | 
			
		||||
# karplus.py
 | 
			
		||||
#
 | 
			
		||||
# Author: MV (http://electro-nut.blogspot.com/)
 | 
			
		||||
#
 | 
			
		||||
# Generates a plucked string sound WAV file using the
 | 
			
		||||
# Karplus-Strong algorithm. 
 | 
			
		||||
#
 | 
			
		||||
############################################################
 | 
			
		||||
from math import sin, pi
 | 
			
		||||
from array import array
 | 
			
		||||
from random import random
 | 
			
		||||
import wave
 | 
			
		||||
 | 
			
		||||
# KS params
 | 
			
		||||
SR = 44100
 | 
			
		||||
f = 220
 | 
			
		||||
 | 
			
		||||
# WAV params
 | 
			
		||||
NCHANNELS = 1
 | 
			
		||||
SWIDTH = 2
 | 
			
		||||
FRAME_RATE = 44100
 | 
			
		||||
NFRAMES = 44100
 | 
			
		||||
NSAMPLES = 44100*2
 | 
			
		||||
# max - 128 for 8-bit, 32767 for 16-bit
 | 
			
		||||
MAX_VAL= 32767
 | 
			
		||||
 | 
			
		||||
class String:
 | 
			
		||||
    def __init__(self, freq, SR):
 | 
			
		||||
        self.freq = freq
 | 
			
		||||
        self.N = SR/freq
 | 
			
		||||
    # 'pluck' string
 | 
			
		||||
    def pluck(self):
 | 
			
		||||
        self.buf = [random() - 0.5 for i in range(self.N)]
 | 
			
		||||
    # return current sample, increment step
 | 
			
		||||
    def sample(self):
 | 
			
		||||
        val = self.buf[0]
 | 
			
		||||
        avg = 0.996*0.5*(self.buf[0] + self.buf[1])
 | 
			
		||||
        self.buf.append(avg)
 | 
			
		||||
        self.buf.pop(0)
 | 
			
		||||
        return val
 | 
			
		||||
    
 | 
			
		||||
str1, str2 = String(196, SR), String(440, SR)
 | 
			
		||||
 | 
			
		||||
str1.pluck()
 | 
			
		||||
str2.pluck()
 | 
			
		||||
 | 
			
		||||
samples = []
 | 
			
		||||
 | 
			
		||||
for i in range(NSAMPLES):
 | 
			
		||||
    sample = str1.sample()
 | 
			
		||||
    if(i > NSAMPLES/8):
 | 
			
		||||
        sample += str2.sample()
 | 
			
		||||
    samples.append(sample)
 | 
			
		||||
 | 
			
		||||
# samples to 16-bit to string
 | 
			
		||||
tmpBuf = [int(x*MAX_VAL) for x in samples] 
 | 
			
		||||
data = array('h', tmpBuf).tostring()
 | 
			
		||||
 | 
			
		||||
# write out WAV file
 | 
			
		||||
file = wave.open('karplus.wav', 'wb')
 | 
			
		||||
file.setparams((NCHANNELS, SWIDTH, FRAME_RATE, NFRAMES,
 | 
			
		||||
                'NONE', 'noncompressed'))
 | 
			
		||||
file.writeframes(data)
 | 
			
		||||
file.close()
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								projekte/soundz/karplus.wav
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								projekte/soundz/karplus.wav
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in a new issue