Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import ossaudiodev as oss
- import wave
- import array
- import numpy as np
- from math import *
- # Open the os sound output
- dsp = oss.open('/dev/dsp', 'w')
- rate = 44100
- dsp.setparameters(oss.AFMT_S16_NE, 1, rate)
- # This is the part of interest
- def play_tones(freqs, time=1):
- sampc = int(rate*time)
- s = sum(np.array([sin(t/rate*2*pi*f)*2**12 for t in range(sampc)]) \
- for f in freqs) #/ len(freqs)
- # Smoothen
- #s *= sum(np.sin(n*np.linspace(0, pi, sampc))/n for n in range(1, 2))
- #s *= np.sin(np.linspace(0, pi, sampc))
- s[0:rate//100] *= np.linspace(0, 1, rate//100)
- s[-rate//50:] *= np.linspace(1, 0, rate//50)
- # Avoid overflow
- if abs(s).max() > 2**14:
- s = s / abs(s).max() * (2**15-1)
- s = s.astype('int16')
- dsp.writeall(s.tostring())
- #play_tones([440, 440*2**(1/5)])
- a, b, k = 12, 7, 9 # Please read main.py for an explanation
- def play_fraction():
- f = 440
- for i in range(2*k+1):
- play_tones([f], 0.7)
- f *= a/b
- if f >= 880*0.995:
- f /= 2
- """
- Repeated fractions don't quite make an octave.
- >>> for i in range(10): print(log2(12/7)*9*i%9)
- ...
- 0.0
- 6.9984682079719684
- 4.996936415943937
- 2.9954046239159062
- 0.9938728318878738
- 7.992341039859845
- 5.9908092478318125
- 3.98927745580378
- 1.9877456637757476
- 8.986213871747715
- """
- # round((a/b)**k)**(1/k) is the rounded frequency interval
- """
- Disturbed fractions get close enough to an octave.
- >>> oq = round((a/b)**k)**(1/k)
- >>> for i in range(10): print(log2(oq)*k*i%k)
- ...
- 0.0
- 6.999999999999999
- 4.999999999999998
- 2.9999999999999964
- 0.9999999999999964
- 7.999999999999993
- 5.999999999999993
- 3.999999999999993
- 1.999999999999993
- 8.999999999999993
- """
- oq = round((a/b)**k)**(1/k)
- cq = oq**4/8 # hard-coded
- def lm2(x):
- while x >= 1.995:
- x /= 2
- return x
- def play_sparse_octave():
- f = 440
- for i in range(2*k+1):
- print(i)
- play_tones([f*lm2(oq**i)], 0.7)
- def play_dense_octave():
- f = 440
- for i in range(k+1):
- play_tones([f*cq**i], 0.7)
- #play_dense_octave()
- def play_abk_tones(tones, time=1, cq=cq):
- #play_tones([440*2**(i/28) for i in tones], time)
- play_tones([440*cq**i for i in tones], time)
- def play_abk_sheet(sheet, pm=120):
- for i, j in sheet:
- play_abk_tones(i, j*60/pm)
- """
- Some chords:
- [0, 5, 3] like major
- [0, 5, 2] like minor
- [0, 5, 7] like sus2
- [0, 5, 8] like aug
- [0, 4] like sus4
- [0, 4, 7] very pure
- """
- sheet = [
- ([-14, -11, -9], 1),
- ([-14, -11, -9, 0], .75),
- ([-14, -11, -9, -1], .25),
- ([-14, -11, -9, -2], 1),
- ([-14, -11, -9, -5], 1),
- ([-14, -12, -9, -6], 3),
- ([-14, -12, -8], 1),
- ([-15, -11, -8], 1),
- ([-15, -11, -8], 1),
- ]
- #play_abk_sheet(sheet)
- # Close the os sound output
- def close():
- dsp.close()
- if __name__ == '__main__':
- close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement