diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..f202cc2 --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ +__all__ = "tuba.py" \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..9565ccb --- /dev/null +++ b/main.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from math import sin,cos,pi + +class Tube(object): + + def __init__(self, length, left_open = False, right_open = True ): + """Takes length in Meters of the tube and the state of either end""" + + self.length = length + self.kind = "" + + if left_open: + self.kind += "O" + else: + self.kind += "C" + + if right_open: + self.kind += "O" + else: + self.kind += "C" + + @property + def __str__(self): + + if self.kind == "OC" or self.kind == "CO": + return "Kundt's tube with one open end" + elif self.kind == "OO": + return "Kundt's tube with two open ends" + else: + return "Kundt's tube with two closed ends" + + def get_wavelength(self, n): + + if self.kind == "OC" or self.kind == "CO": + return (4 * self.length) / (2 * n + 1) + else: + return (2 * self.length) / (n + 1) + + def get_frequency(self, n): + + return 343/self.get_wavelength(n) + + def wave_function(self, n, x): + + if self.kind == "OC": + return cos((0.5 + n) * pi * x / self.length) + elif self.kind == "CO": + return sin((0.5 + n) * pi * x / self.length) + elif self.kind == "OO": + return cos((1 + n) * pi * x / self.length) + else: + return sin((1 + n) * pi * x / self.length) + + def get_wave_points(self, n , steps): + + step, point = self.length/(steps -1), 0 + while point <= self.length: + yield self.wave_function(n, point) + point += step + + def get_visual_wave_points(self, n, steps): + + outStr = "" + + for val in self.get_wave_points(n, steps): + if abs(val) < 1/3: + outStr += chr(9617) + elif abs(val) < 2/3: + outStr += chr(9618) + else: + outStr += chr(9619) + + + if self.kind == "OC": + outStr = "0" + outStr + "|" + elif self.kind == "CO": + outStr = "|" + outStr + "0" + elif self.kind == "OO": + outStr = "0" + outStr + "0" + else: + outStr = "|" + outStr + "|" + + return outStr + +if __name__ == "__main__": + + test_tube = Tube(1.5, False, False) + for num in range(20): + print(test_tube.get_visual_wave_points(num,70) + " " + str(test_tube.get_frequency(num)) + "Hz") \ No newline at end of file