Add new functions: 'concat', 'range' and 'Map' constructor

This commit is contained in:
Bartłomiej Pluta
2019-07-09 20:54:56 +02:00
parent 7d14b0cbe7
commit b4d5d11b84
5 changed files with 80 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
from smnp.environment.environment import Environment
from smnp.library.function import display, sleep, semitones, interval, combine, flat, wait, rand, tuplet, synth, pause, \
transpose, type, exit, duration, octave, debug, get, sound, play
transpose, type, exit, duration, octave, debug, get, sound, play, map, concat, range
from smnp.type.model import Type
@@ -21,6 +21,9 @@ def createEnvironment():
pause.function,
transpose.function,
sound.function,
map.function,
concat.function,
range.function,
debug.function
]

View File

@@ -0,0 +1,10 @@
from smnp.library.model import Function
from smnp.library.signature import varargSignature, ofType
from smnp.type.model import Type
_signature = varargSignature(ofType(Type.STRING))
def _function(env, vararg):
return Type.string("".join([ arg.value for arg in vararg ]))
function = Function(_signature, _function, 'concat')

View File

@@ -0,0 +1,29 @@
from smnp.library.model import Function, CombinedFunction
from smnp.library.signature import varargSignature, listMatches, ofTypes, allTypes, signature, listOfMatchers
from smnp.type.model import Type
_signature1 = varargSignature(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE), allTypes()))
def _function1(env, vararg):
map = {}
for entry in vararg:
key, value = entry.value
map[key] = value
return Type.map(map)
_signature2 = signature(listOfMatchers(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE), allTypes())))
def _function2(env, list):
map = {}
for entry in list.value:
key, value = entry.value
map[key] = value
return Type.map(map)
function = CombinedFunction(
'Map',
Function(_signature1, _function1),
Function(_signature2, _function2)
)

View File

@@ -0,0 +1,36 @@
from smnp.library.model import CombinedFunction, Function
from smnp.library.signature import signature, ofType
from smnp.note.model import Note
from smnp.type.model import Type
_signature1 = signature(ofType(Type.INTEGER))
def _function1(env, upper):
return Type.list(list(range(upper.value + 1)))
_signature2 = signature(ofType(Type.INTEGER), ofType(Type.INTEGER))
def _function2(env, lower, upper):
return Type.list(list(range(lower.value, upper.value + 1)))
_signature3 = signature(ofType(Type.INTEGER), ofType(Type.INTEGER), ofType(Type.INTEGER))
def _function3(env, lower, upper, step):
return Type.list(list(range(lower.value, upper.value + 1, step.value)))
_signature4 = signature(ofType(Type.NOTE), ofType(Type.NOTE))
def _function4(env, lower, upper):
return Type.list([Type.note(n) for n in Note.range(lower.value, upper.value)])
# TODO
# signature5 = range(note lower, note upper, integer step) OR step = "diatonic" | "chromatic" | "augmented" | "diminish"
function = CombinedFunction(
'range',
Function(_signature1, _function1),
Function(_signature2, _function2),
Function(_signature3, _function3),
Function(_signature4, _function4),
)

View File

@@ -47,6 +47,7 @@ class Type(Enum):
@staticmethod
def note(value):
return Value(Type.NOTE, value, {
"pitch": Type.string(str(value.note)),
"octave": Type.integer(value.octave),
"duration": Type.integer(value.duration),
"dot": Type.string('.' if value.dot else '')