... сейчас понятно что можно загружать "звук", но хотелось бы еще научиться выгружать в "звук" ...
... пояснение где смотреть ...
Аппликату́ра (нем. Applikatur, от лат. applico — прикладываю, прижимаю) — порядок расположения и чередования пальцев при игре на музыкальном инструменте. Аппликатурой также называется указание пальцев в нотах с помощью цифр или, реже, иным способом. Аппликатура особенно важна для клавишных и струнных инструментов. Умение разрабатывать аппликатуру — важная составляющая мастерства исполнителя.
>> ещё аппликатуру можно бы было указывать...... несмотря на упоминание в этой теме подобного, указанной цели не ставилось ...... тем не менее, если к этому функционалу есть интерес, давайте собирать информацию ...... вот напримерhttps://itunes.apple.com/ru/app/chord3d-guitar-ukulele-guitalele/id1004214587?mt=12... есть у этой тематики технологические описания и готовые шаблоны? ...... выкладывайте алгоритмы и методики ...
>> Ещё что?... умеренный сепаратизм ...... у нас "уже" есть скрипт загрузки нот в кривые без привязки к конкретному инструменту ...... допустим, что даже есть анимированный инструмент со своим ригом ...... теперь нужно проработать интерфейс стыковки одного с другим ...... и в целом правила стыковки не должны зависеть от инструмента (ксилофон, саксофон, миелафон, ...) ...
class NoteSettingItem(bpy.types.PropertyGroup): name = bpy.props.StringProperty() volume = bpy.props.IntProperty() position = bpy.props.IntProperty() duration = bpy.props.IntProperty() hands = bpy.props.EnumProperty( name="Hands", items=( ("left", "Left", ""), ("right", "Right", ""), ("both", "Both", "")), default="right") left_hand = bpy.props.EnumProperty( name="motion_left_hand", items=( ("up", "Up", ""), ("down", "Down", ""), ("blow", "Blow", ""), ("fingers", "Fingers", "")), default="blow") finger_left_1 = bpy.props.BoolProperty() finger_left_2 = bpy.props.BoolProperty() finger_left_3 = bpy.props.BoolProperty() finger_left_4 = bpy.props.BoolProperty() finger_left_5 = bpy.props.BoolProperty() finger_left_1_connect = bpy.props.BoolProperty() finger_left_2_connect = bpy.props.BoolProperty() finger_left_3_connect = bpy.props.BoolProperty() finger_left_4_connect = bpy.props.BoolProperty() finger_left_5_connect = bpy.props.BoolProperty() right_hand = bpy.props.EnumProperty( name="motion_right_hand", items=( ("up", "Up", ""), ("down", "Down", ""), ("blow", "Blow", ""), ("fingers", "Fingers", "")), default="blow") finger_right_1 = bpy.props.BoolProperty() finger_right_2 = bpy.props.BoolProperty() finger_right_3 = bpy.props.BoolProperty() finger_right_4 = bpy.props.BoolProperty() finger_right_5 = bpy.props.BoolProperty() finger_right_1_connect = bpy.props.BoolProperty() finger_right_2_connect = bpy.props.BoolProperty() finger_right_3_connect = bpy.props.BoolProperty() finger_right_4_connect = bpy.props.BoolProperty() finger_right_5_connect = bpy.props.BoolProperty()
def register(): bpy.utils.register_module(__name__) bpy.types.INFO_MT_file_import.append(menu_func) bpy.types.TextCurve.notes = bpy.props.CollectionProperty(type=NoteSettingItem)def unregister(): bpy.utils.unregister_module(__name__) bpy.types.INFO_MT_file_import.remove(menu_func) del bpy.types.TextCurve.notes
... мне думается, что ксилофон уже должен содержать полный набор действий (action) и задача только их расставить во времени ...
class View3DPanel(): bl_space_type = 'VIEW_3D' bl_region_type = 'TOOLS'class VIEW3D_PT_lmms(View3DPanel, bpy.types.Panel): bl_category = "Animation" bl_context = "objectmode" bl_label = "Musicians Animation with LMMS" def draw(self, context): ob=context.object note = 0 if ob and ob.type == 'FONT' and len(ob.data.notes) > 0: layout = self.layout ctx = ob.data.notes[note] #develop layout.prop(ctx,"name") layout.prop(ctx,"volume") layout.prop(ctx,"position") layout.prop(ctx,"duration") layout.label('Hands:') layout.prop(ctx,"hands",expand = True) if ctx.hands in {'left','both'}: layout.label('Left hand:') layout.prop(ctx,"left_hand",expand = True) if ctx.left_hand in {'fingers'}: box = layout.box() box.label('Fingers left hand') row = box.row() row.prop(ctx,"finger_left_1",text="1") row.prop(ctx,"finger_left_1_connect",text="done") row = box.row() row.prop(ctx,"finger_left_2",text="2") row.prop(ctx,"finger_left_2_connect",text="done") row = box.row() row.prop(ctx,"finger_left_3",text="3") row.prop(ctx,"finger_left_3_connect",text="done") row = box.row() row.prop(ctx,"finger_left_4",text="4") row.prop(ctx,"finger_left_4_connect",text="done") row = box.row() row.prop(ctx,"finger_left_5",text="5") row.prop(ctx,"finger_left_5_connect",text="done") if ctx.hands in {'right','both'}: layout.label('Right hand:') layout.prop(ctx,"right_hand",expand = True) if ctx.right_hand in {'fingers'}: box = layout.box() box.label('Fingers right hand') row = box.row() row.prop(ctx,"finger_right_1",text="1") row.prop(ctx,"finger_right_1_connect",text="done") row = box.row() row.prop(ctx,"finger_right_2",text="2") row.prop(ctx,"finger_right_2_connect",text="done") row = box.row() row.prop(ctx,"finger_right_3",text="3") row.prop(ctx,"finger_right_3_connect",text="done") row = box.row() row.prop(ctx,"finger_right_4",text="4") row.prop(ctx,"finger_right_4_connect",text="done") row = box.row() row.prop(ctx,"finger_right_5",text="5") row.prop(ctx,"finger_right_5_connect",text="done")
... заморачиваться на коде интерфейса пользователя преждевременно ...... мне сейчас невидна вся оснастка, только некоторые её фрагменты ...... вот например такой фрагмент - представление ноток в nla элементов инструмента ...... допустим что есть связь (пряма или опосредованная) между "ноткой" и действием инструмента, при этом у инструмента прописаны все действия в виде "базовых" треков (на картинке это нижние треки 1 с невыделенными лентами note055, note067) ...... у базовых треков отключено влияние на канал, они служат только для хранения ленты, которая копируется в рабочие треки note055_gen , note067_gen ...... таким образом нужно скопировать и расставить в определённых местах рабочих треков действия из базовых треков ...... на мой взгляд это удобно и контролируемо ...