diff --git a/smnp/module/__init__.py b/smnp/module/__init__.py index d23ea3e..4ea9f27 100644 --- a/smnp/module/__init__.py +++ b/smnp/module/__init__.py @@ -1,4 +1,4 @@ from smnp.module import system, mic, note, iterable, sound, synth, string, util functions = [ *system.functions, *mic.functions, *note.functions, *iterable.functions, *sound.functions, *synth.functions, *string.functions, *util.functions ] -methods = [ *system.methods, *mic.methods, *note.methods, *iterable.methods, *sound.methods, *synth.methods, *string.functions, *util.methods ] \ No newline at end of file +methods = [ *system.methods, *mic.methods, *note.methods, *iterable.methods, *sound.methods, *synth.methods, *string.methods, *util.methods ] \ No newline at end of file diff --git a/smnp/module/note/__init__.py b/smnp/module/note/__init__.py index d308544..30547fd 100644 --- a/smnp/module/note/__init__.py +++ b/smnp/module/note/__init__.py @@ -1,4 +1,4 @@ -from smnp.module.note.function import tuplet, transpose, semitones, octave, duration, interval +from smnp.module.note.function import transpose, semitones, interval, note -functions = [ semitones.function, interval.function, transpose.function, tuplet.function ] -methods = [ duration.function, octave.function ] \ No newline at end of file +functions = [ semitones.function, interval.function, transpose.function, note.function ] +methods = [] \ No newline at end of file diff --git a/smnp/module/note/function/duration.py b/smnp/module/note/function/duration.py deleted file mode 100644 index 0e12b15..0000000 --- a/smnp/module/note/function/duration.py +++ /dev/null @@ -1,11 +0,0 @@ -from smnp.function.model import Function -from smnp.function.signature import signature -from smnp.type.model import Type -from smnp.type.signature.matcher.type import ofType - -_signature = signature(ofType(Type.NOTE), ofType(Type.INTEGER)) -def _function(env, note, duration): - return Type.note(note.value.withDuration(duration.value)) - - -function = Function(_signature, _function, 'withDuration') \ No newline at end of file diff --git a/smnp/module/note/function/note.py b/smnp/module/note/function/note.py new file mode 100644 index 0000000..878b1be --- /dev/null +++ b/smnp/module/note/function/note.py @@ -0,0 +1,11 @@ +from smnp.function.model import Function +from smnp.function.signature import signature +from smnp.note.model import Note +from smnp.type.model import Type +from smnp.type.signature.matcher.type import ofType + +_signature = signature(ofType(Type.STRING), ofType(Type.INTEGER), ofType(Type.INTEGER), ofType(Type.BOOL)) +def _function(env, note, octave, duration, dot): + return Type.note(Note(note.value, octave.value, duration.value, dot.value)) + +function = Function(_signature, _function, 'Note') \ No newline at end of file diff --git a/smnp/module/note/function/octave.py b/smnp/module/note/function/octave.py deleted file mode 100644 index 5f43312..0000000 --- a/smnp/module/note/function/octave.py +++ /dev/null @@ -1,11 +0,0 @@ -from smnp.function.model import Function -from smnp.function.signature import signature -from smnp.type.model import Type -from smnp.type.signature.matcher.type import ofType - -_signature = signature(ofType(Type.NOTE), ofType(Type.INTEGER)) -def _function(env, note, octave): - return Type.note(note.value.withOctave(octave.value)) - - -function = Function(_signature, _function, 'withOctave') \ No newline at end of file diff --git a/smnp/module/note/function/tuplet.py b/smnp/module/note/function/tuplet.py deleted file mode 100644 index 217d479..0000000 --- a/smnp/module/note/function/tuplet.py +++ /dev/null @@ -1,23 +0,0 @@ -from smnp.function.model import CombinedFunction, Function -from smnp.function.signature import signature, varargSignature -from smnp.type.model import Type -from smnp.type.signature.matcher.list import listOf -from smnp.type.signature.matcher.type import ofTypes - -_signature1 = varargSignature(ofTypes(Type.NOTE), ofTypes(Type.INTEGER), ofTypes(Type.INTEGER)) -def _function1(env, n, m, vararg): - t = [Type.note(arg.value.withDuration(int(arg.value.duration * n.value / m.value))) for arg in vararg] - return Type.list(t).decompose() - - - -_signature2 = signature(ofTypes(Type.INTEGER), ofTypes(Type.INTEGER), listOf(Type.NOTE)) -def _function2(env, n, m, notes): - return _function1(env, n, m, notes.value) - - -function = CombinedFunction( - 'tuplet', - Function(_signature1, _function1), - Function(_signature2, _function2) -) diff --git a/smnp/module/string/__init__.py b/smnp/module/string/__init__.py index 922c606..3ba0e49 100644 --- a/smnp/module/string/__init__.py +++ b/smnp/module/string/__init__.py @@ -1,4 +1,4 @@ -from smnp.module.string.function import concat +from smnp.module.string.function import concat, stringify functions = [ concat.function ] -methods = [] \ No newline at end of file +methods = [ stringify.function ] \ No newline at end of file diff --git a/smnp/module/string/function/stringify.py b/smnp/module/string/function/stringify.py new file mode 100644 index 0000000..0511db2 --- /dev/null +++ b/smnp/module/string/function/stringify.py @@ -0,0 +1,10 @@ +from smnp.function.model import Function +from smnp.function.signature import signature +from smnp.type.model import Type +from smnp.type.signature.matcher.type import allTypes + +_signature = signature(allTypes()) +def _function(env, object): + return Type.string(object.stringify()) + +function = Function(_signature, _function, 'toString') \ No newline at end of file diff --git a/smnp/module/system/__init__.py b/smnp/module/system/__init__.py index 93af5e0..ced0515 100644 --- a/smnp/module/system/__init__.py +++ b/smnp/module/system/__init__.py @@ -1,4 +1,4 @@ -from smnp.module.system.function import sleep, display, debug, exit, type +from smnp.module.system.function import sleep, display, displayln, debug, exit, type -functions = [ debug.function, display.function, exit.function, sleep.function, type.function ] +functions = [ debug.function, display.function, displayln.function, exit.function, sleep.function, type.function ] methods = [] \ No newline at end of file diff --git a/smnp/module/system/function/display.py b/smnp/module/system/function/display.py index c60b842..54f1de2 100644 --- a/smnp/module/system/function/display.py +++ b/smnp/module/system/function/display.py @@ -4,7 +4,7 @@ from smnp.type.signature.matcher.type import allTypes _signature = varargSignature(allTypes()) def _function(env, vararg): - print("".join([arg.stringify() for arg in vararg])) + print("".join([arg.stringify() for arg in vararg]), end="") function = Function(_signature, _function, 'print') \ No newline at end of file diff --git a/smnp/module/system/function/displayln.py b/smnp/module/system/function/displayln.py new file mode 100644 index 0000000..9934084 --- /dev/null +++ b/smnp/module/system/function/displayln.py @@ -0,0 +1,10 @@ +from smnp.function.model import Function +from smnp.function.signature import varargSignature +from smnp.type.signature.matcher.type import allTypes + +_signature = varargSignature(allTypes()) +def _function(env, vararg): + print("".join([arg.stringify() for arg in vararg])) + + +function = Function(_signature, _function, 'println') \ No newline at end of file diff --git a/smnp/module/util/function/rand.py b/smnp/module/util/function/rand.py index 5c87a5a..c0aff65 100644 --- a/smnp/module/util/function/rand.py +++ b/smnp/module/util/function/rand.py @@ -1,29 +1,12 @@ -import random as r +import random -from smnp.error.function import IllegalArgumentException -from smnp.function.model import Function, CombinedFunction -from smnp.function.signature import varargSignature +from smnp.function.model import Function +from smnp.function.signature import signature from smnp.type.model import Type -from smnp.type.signature.matcher.list import listMatches -from smnp.type.signature.matcher.type import ofTypes +from smnp.type.signature.matcher.type import ofType +_signature = signature(ofType(Type.INTEGER), ofType(Type.INTEGER)) +def _function(env, min, max): + return Type.integer(random.randint(min.value, max.value)) -def forType(t): - _signature = varargSignature(listMatches(ofTypes(Type.PERCENT), ofTypes(t))) - def _function(env, vararg): - choice = r.random() - acc = 0 - if sum(arg.value[0].value for arg in vararg) != 1.0: - raise IllegalArgumentException("Sum of all percentage values must be equal 100%") - for arg in vararg: - percent, item = arg.value - acc += percent.value - if choice <= acc: - return item - - return Function(_signature, _function) - - -function = CombinedFunction('random', *[ forType(t) for t in Type if t != Type.VOID ]) - -#TODO: sample \ No newline at end of file +function = Function(_signature, _function, 'rand') \ No newline at end of file diff --git a/smnp/note/pitch.py b/smnp/note/pitch.py index 938f2ac..fb757b5 100644 --- a/smnp/note/pitch.py +++ b/smnp/note/pitch.py @@ -16,7 +16,7 @@ class NotePitch(Enum): A = 9 AIS = 10 H = 11 - + def toFrequency(self): return { NotePitch.C: 16.35, @@ -32,19 +32,23 @@ class NotePitch(Enum): NotePitch.AIS: 29.17, NotePitch.H: 30.87 }[self] - + def __str__(self): return self.name - + def __repr__(self): return self.__str__() - + @staticmethod def toPitch(string): - try: + if string.lower() in stringToPitch: return stringToPitch[string.lower()] - except KeyError as e: - raise NoteException(f"Note '{string}' does not exist") + + if string.upper() in NotePitch: + return NotePitch[string.upper()] + + raise NoteException(f"Note '{string}' does not exist") + stringToPitch = { 'cb': NotePitch.H, @@ -67,4 +71,4 @@ stringToPitch = { 'a#': NotePitch.AIS, 'b': NotePitch.AIS, 'h': NotePitch.H -} \ No newline at end of file +} diff --git a/smnp/runtime/evaluators/relation.py b/smnp/runtime/evaluators/relation.py index 0708d65..fb0de94 100644 --- a/smnp/runtime/evaluators/relation.py +++ b/smnp/runtime/evaluators/relation.py @@ -21,11 +21,11 @@ class RelationEvaluator(Evaluator): @classmethod def equalOperatorEvaluator(cls, left, operator, right): - return Type.bool(left.value == right.value) + return Type.bool(left.type == right.type and left.value == right.value) @classmethod def notEqualOperatorEvaluator(cls, left, operator, right): - return Type.bool(left.value != right.value) + return Type.bool(left.type != right.type or left.value != right.value) @classmethod def otherRelationOperatorsEvaluator(cls, left, operator, right): diff --git a/smnp/type/model.py b/smnp/type/model.py index f3e4037..8e757b9 100644 --- a/smnp/type/model.py +++ b/smnp/type/model.py @@ -51,7 +51,7 @@ class Type(Enum): "pitch": Type.string(str(value.note)), "octave": Type.integer(value.octave), "duration": Type.integer(value.duration), - "dot": Type.string('.' if value.dot else '') + "dot": Type.bool(value.dot) }) @staticmethod