Add new functions: 'concat', 'range' and 'Map' constructor
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
from smnp.environment.environment import Environment
|
from smnp.environment.environment import Environment
|
||||||
from smnp.library.function import display, sleep, semitones, interval, combine, flat, wait, rand, tuplet, synth, pause, \
|
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
|
from smnp.type.model import Type
|
||||||
|
|
||||||
|
|
||||||
@@ -21,6 +21,9 @@ def createEnvironment():
|
|||||||
pause.function,
|
pause.function,
|
||||||
transpose.function,
|
transpose.function,
|
||||||
sound.function,
|
sound.function,
|
||||||
|
map.function,
|
||||||
|
concat.function,
|
||||||
|
range.function,
|
||||||
debug.function
|
debug.function
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
10
smnp/library/function/concat.py
Normal file
10
smnp/library/function/concat.py
Normal 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')
|
||||||
29
smnp/library/function/map.py
Normal file
29
smnp/library/function/map.py
Normal 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)
|
||||||
|
)
|
||||||
36
smnp/library/function/range.py
Normal file
36
smnp/library/function/range.py
Normal 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),
|
||||||
|
)
|
||||||
@@ -47,6 +47,7 @@ class Type(Enum):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def note(value):
|
def note(value):
|
||||||
return Value(Type.NOTE, value, {
|
return Value(Type.NOTE, value, {
|
||||||
|
"pitch": Type.string(str(value.note)),
|
||||||
"octave": Type.integer(value.octave),
|
"octave": Type.integer(value.octave),
|
||||||
"duration": Type.integer(value.duration),
|
"duration": Type.integer(value.duration),
|
||||||
"dot": Type.string('.' if value.dot else '')
|
"dot": Type.string('.' if value.dot else '')
|
||||||
|
|||||||
Reference in New Issue
Block a user