Chords Builder: Часть 1 - Моделирование грифа классической гитары на языке EXPRESS

Опубликовано crsm_admin - ср, 03/22/2023 - 23:50

В даной части учебника по Somorodina STEP мы создадим EXPRESS схему с названием CHORDS_BUILDER для моделирования грифов струнных инструментов, которая в дальнейшем станет основой приложения для отображения грифов на экране с возможностью построения табулатур для аккордов и их звукового воспроизведения, и создадим модель грифа 19-ладовой классической гитары с помощью Стандартного Интерфейса Доступа к Данным (СИДД) который предоставляет библиотека Smorodina STEP.

В любом удобном текстовом редакторе зададим набор требуемых типов на языке моделирования EXPRESS:

SCHEMA CHORD_BUILDER;

TYPE CBPositiveInteger = INTEGER;
 WHERE
  IsPositive: SELF > 0;
END_TYPE;

ENTITY CBInstrument;
  Name: STRING(64);
  Fretboard: CBFretboard;
END_ENTITY;

ENTITY CBFretboard;
  Id: OPTIONAL STRING(64);
  Name: STRING(64);
  NFrets: CBPositiveInteger;
  Strings: LIST [1:?] OF CBString;
 INVERSE
  OfInstrument: CBInstrument FOR Fretboard;
END_ENTITY;

ENTITY CBString;
  Name: OPTIONAL STRING(64);
  Symbol: STRING(2);
 INVERSE
  OfFretboard: CBFretboard FOR Strings;
END_ENTITY;

END_SCHEMA;

Следующий шаг - создание и наполнение модели с помощью Стандартного Интерфейса Доступа к Данным (СИДД, SDAI), исходный код для компилятора C++ и Smorodina STEP:

SdaiSession session = sdaiOpenSession(); // Открыть сеанс СИДД
SdaiRep repository{};
repository = sdaiOpenRepository(session, repository); // Открыть новый репозиторий
SdaiSchema schemaChordBuilder = sdaiGetSchema("CHORD_BUILDER"); // Загрузить схему с идентификатором CHORD_BUILDER
SdaiModel model = sdaiCreateModel(repository, "h:/Chords.cbf", schemaChordBuilder); // Создать пустую модель 
sdaiPromoteModel(model); // Переключить режим доступа к модели на редактирование

SdaiAppInstance fretboard = sdaiCreateInstanceBN(model, "cbfretboard"); // Создать сущность "гриф"
sdaiPutAttrBN(fretboard, "name", sdaiSTRING, "Classical"); // Классическая гитара
sdaiPutAttrBN(fretboard, "nfrets", sdaiINTEGER, 19); // 19 ладов
SdaiAggr strings = sdaiCreateAggrBN(fretboard, "strings"); // Создать пустой контейнер LIST для хранения сущностей струн гитары

  SdaiAppInstance string_e = sdaiCreateInstanceBN(model, "cbstring"); // Создать сущность "струна"
  sdaiPutAttrBN(string_e, "symbol", sdaiSTRING, "e"); // Определяется символом "e" - Ми первой октавы
  sdaiPutAggrByIndex(strings, 0, sdaiINSTANCE, string_e); // Добавить сущность в контейнер струн

  SdaiAppInstance string_B = sdaiCreateInstanceBN(model, "cbstring"); // И т.д. для всех остальных струн
  sdaiPutAttrBN(string_B, "symbol", sdaiSTRING, "B");
  sdaiPutAggrByIndex(strings, 1, sdaiINSTANCE, string_B);

  SdaiAppInstance string_G = sdaiCreateInstanceBN(model, "cbstring");
  sdaiPutAttrBN(string_G, "symbol", sdaiSTRING, "G");
  sdaiPutAggrByIndex(strings, 2, sdaiINSTANCE, string_G);

  SdaiAppInstance string_D = sdaiCreateInstanceBN(model, "cbstring");
  sdaiPutAttrBN(string_D, "symbol", sdaiSTRING, "D");
  sdaiPutAggrByIndex(strings, 3, sdaiINSTANCE, string_D);

  SdaiAppInstance string_A = sdaiCreateInstanceBN(model, "cbstring");
  sdaiPutAttrBN(string_A, "symbol", sdaiSTRING, "A");
  sdaiPutAggrByIndex(strings, 4, sdaiINSTANCE, string_A);

  SdaiAppInstance string_E = sdaiCreateInstanceBN(model, "cbstring");
  sdaiPutAttrBN(string_E, "symbol", sdaiSTRING, "E");
  sdaiPutAggrByIndex(strings, 5, sdaiINSTANCE, string_E);

SdaiAppInstance instrument = sdaiCreateInstanceBN(model, "cbinstrument"); // Создать сущность "инструмент"
sdaiPutAttrBN(instrument, "name", sdaiSTRING, "Guitar"); // Гитара
sdaiPutAttrBN(instrument, "fretboard", sdaiINSTANCE, fretboard); // С ранее созданным грифом

sdaiSaveChanges(model); // Сохранить содержимое модели в файл
sdaiDeleteModel(model); // Удалить модель из её репозитория
sdaiCloseRepository(repository); // Закрыть репозиторий
sdaiCloseSession(session); // Закрыть текущую сессию

В результате работы программы будет создан текстовой STEP-файл следующего содержания:

ISO-10303-21;

HEADER;
FILE_DESCRIPTION($,'2;1');
FILE_NAME('h:/Chords.cbf',$,$,$,'CRSM::Smorodina SDAI v.0.3',$,$);
FILE_SCHEMA(('CHORD_BUILDER'));
ENDSEC;

DATA;
#1=CBFRETBOARD($,'Classical',19,(#2,#3,#4,#5,#6,#7));
#2=CBSTRING($,'e');
#3=CBSTRING($,'B');
#4=CBSTRING($,'G');
#5=CBSTRING($,'D');
#6=CBSTRING($,'A');
#7=CBSTRING($,'E');
#8=CBINSTRUMENT('Guitar',#1);
ENDSEC;

END-ISO-10303-21;

В дальнейшем при наличии файла схемы CHORDS_BUILDER файл chords.cbf может быть открыт при помощи любой реализации СИДД (SDAI) для дальнейшей работы с моделью.

Chords.cbf в программе CRSM::Smorodina::STEP Navigator
Файл Chords.cbf в программе CRSM::Smorodina::STEP Navigator