diff --git a/_tutorials-FA/100_structure/100_Structure.md b/_tutorials-FA/100_structure/100_Structure.md new file mode 100644 index 00000000..af65785c --- /dev/null +++ b/_tutorials-FA/100_structure/100_Structure.md @@ -0,0 +1,7 @@ +--- +layout: tutorials +type: tutorial +name: "مبتدی:اصول پایه‌ای XML و ساختار مینیمال برای MEI" +fullname: "درسی کوتاه درباره اصول XML و MEI" +data: "100_structure.json" +--- diff --git a/_tutorials-FA/100_structure/100_structure.json b/_tutorials-FA/100_structure/100_structure.json new file mode 100644 index 00000000..e75c391f --- /dev/null +++ b/_tutorials-FA/100_structure/100_structure.json @@ -0,0 +1,81 @@ +{ + "steps": [ + { + "label":"به MEI خوش آمدید!", + "descFile": "100_structure_step-00-desc.html" + }, + { + "label": "المنت اصلی MEI", + "editorLines": 1, + "descFile": "100_structure_step-01-desc.html", + "prefillFile": "100_structure_step-01-prefill.xml", + "xmlFile": "100_structure_step-01.xml", + "xpaths": [ + {"rule": "count(//mei) = 1", "renderanyway": true, "hint": "یک المنت mei‌ کم دارید."} + ] + }, + { + "label": "نام‌حوزه‌ی MEI", + "editorLines": 1, + "descFile": "100_structure_step-02-desc.html", + "prefillFile": "100_structure_step-02-prefill.xml", + "xmlFile": "100_structure_step-02.xml", + "xpaths": [ + {"rule": "count(*[local-name()='mei']) = 1", "renderanyway": true, "hint": "یک المنت mei‌ کم دارید."}, + {"rule": "*[local-name()='mei' and namespace-uri()='http://www.music-encoding.org/ns/mei']", "renderanyway": true, "hint": "You need a @xmlns declaration with the mei namespace 'http://www.music-encoding.org/ns/mei'."} + ] + }, + { + "label": "دو فرزند اصلی المنت ریشه‌ای", + "editorLines": 4, + "descFile": "100_structure_step-03-desc.html", + "prefillFile": "100_structure_step-03-prefill.xml", + "xmlFile": "100_structure_step-03.xml", + "xpaths": [ + {"rule": "count(//*[local-name()='mei']) = 1", "renderanyway": false, "hint": "You need one mei element."}, + {"rule": "*[local-name()='mei' and namespace-uri()='http://www.music-encoding.org/ns/mei']", "renderanyway": true, "hint": "You need a @xmlns declaration with the mei namespace 'http://www.music-encoding.org/ns/mei' in the mei element."}, + {"rule": "count(//*[local-name()='meiHead']) = 1", "renderanyway": false, "hint": "You need one meiHead element."}, + {"rule": "//*[local-name()='mei']/*[local-name()='meiHead']", "renderanyway": false, "hint": "meiHead has to a be child of the mei element."}, + {"rule": "count(//*[local-name()='music']) = 1", "renderanyway": false, "hint": "You need one music element."}, + {"rule": "//*[local-name()='mei']/*[local-name()='music']", "renderanyway": false, "hint": "music has to a be child of the mei element."}, + {"rule": "//*[local-name()='mei']/*[local-name()='meiHead']/following-sibling::*[local-name()='music']", "renderanyway": false, "hint": "music has to follow the meiHead element."} + ] + }, + { + "label": "حداقل اطلاعات در سربرگ MEI", + "editorLines": 11, + "descFile": "100_structure_step-04-desc.html", + "prefillFile": "100_structure_step-04-prefill.xml", + "xmlFile": "100_structure_step-04.xml", + "xpaths": [ + {"rule": "count(//*[local-name()='mei']) = 1", "renderanyway": false, "hint": "یک المنت mei‌ کم دارید."}, + {"rule": "*[local-name()='mei' and namespace-uri()='http://www.music-encoding.org/ns/mei']", "renderanyway": true, "hint": "باید در المنت mei، یک اعلان @xmlns داشته باشید که نام‌حوزه‌ی mei را معرفی کند."}, + {"rule": "count(//*[local-name()='meiHead']) = 1", "renderanyway": false, "hint": "یک المنت meiHead کم دارید."}, + {"rule": "//*[local-name()='mei']/*[local-name()='meiHead']", "renderanyway": false, "hint": "meiHead باید فرزند المنت mei باشد."}, + {"rule": "count(//*[local-name()='music']) = 1", "renderanyway": false,"hint": "یک المنت music کم دارید."}, + {"rule": "//*[local-name()='mei']/*[local-name()='music']", "renderanyway": false,"hint": "music باید فرزند المنت mei باشد."}, + {"rule": "//*[local-name()='mei']/*[local-name()='meiHead']/following-sibling::*[local-name()='music']", "renderanyway": false, "hint": "music باید بعد از المنت meiHead بیاید."}, + {"rule": "count(//*[local-name()='fileDesc']) = 1", "renderanyway": false,"hint": "یک المنت fileDesc کم دارید."}, + {"rule": "//*[local-name()='meiHead']/*[local-name()='fileDesc']", "renderanyway": false, "hint":"fileDesc باید فرزند meiHead باشد." }, + {"rule": "count(//*[local-name()='titleStmt']) = 1", "renderanyway": false, "hint": "یک المنت titleStmt کم دارید."}, + {"rule": "//*[local-name()='fileDesc']/*[local-name()='titleStmt']", "renderanyway": false, "hint": "titleStmt باید فرزند fileDesc باشد."}, + {"rule": "count(//*[local-name()='pubStmt']) = 1", "renderanyway": false, "hint": "یک المنت pubStmt کم دارید."}, + {"rule": "//*[local-name()='fileDesc']/*[local-name()='pubStmt']", "renderanyway": false, "hint": "pubStmt باید فرزند fileDesc باشد."}, + {"rule": "//*[local-name()='fileDesc']/*[local-name()='titleStmt']/following-sibling::*[local-name()='pubStmt']", "renderanyway": false, "hint": "pubStmt باید بعد از titleStmt بیاید."}, + {"rule": "count(//*[local-name()='title']) = 1", "renderanyway": false, "hint": "یک المنت title کم دارید."}, + {"rule": "//*[local-name()='titleStmt']/*[local-name()='title']", "renderanyway": false, "hint": "title باید فرزند titleStmt باشد."} + ] + } + ], + "end": "100_structure_end.html", + "resp":[ + { + "name":"Stefan Münnich", + "affiliation":"Anton Webern Gesamtausgabe | University of Basel" + }, + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +} diff --git a/_tutorials-FA/100_structure/100_structure_end.html b/_tutorials-FA/100_structure/100_structure_end.html new file mode 100644 index 00000000..53bc2568 --- /dev/null +++ b/_tutorials-FA/100_structure/100_structure_end.html @@ -0,0 +1,20 @@ +
+

تبریک!

+

+ شما توانستید یک فایل MEI معتبر بنویسید و این آموزش را با موفقیت به پایان رسانده‌اید. اکنون باید بتوانید: +

+ +

+ از آنجا که مباحث مطرح شده در این درس به فصل المنت‌های ساختاری از دستورالعمل‌های MEI اشاره داشتند، توصیه می‌کنیم که این فصل را هروقت به اطلاعات دقیق‌تری نیاز داشتید، مطالعه کنید. +

+

+ البته برای داشتن یک فایل MEI جامع، به اطلاعات بیشتری نیاز است – ما تمامی اطلاعات مربوط به محتوای موسیقایی مانند میزان‌ها، خطوط حامل یا نت‌ها را کنار گذاشتیم و همینطور باید یاد بگیرید که چگونه میزان، کلید و حامل‌ها را تنظیم کنید. چند درس دیگر هم هستند که به عنوان مراحل بعدی آشنایی با MEI توصیه می‌کنیم. البته می‌توانید هر زمان که خواستید به این درس‌ها (یا حتی همین درس) بازگردید و مطالب را مرور کنید. +

+

+ وقتی تا حدودی با MEI آشنا شدید، از شما دعوت می‌کنیم تجربه خود را با جامعه MEI به اشتراک بگذارید و یک آموزش درباره جنبه‌ای از MEI که به آن علاقه‌مندید بنویسید. برای این کار لازم نیست حتماً متخصص باشید – خوب است درس‌ها را در سطوح متفاوتی داشته‌باشیم و خیلی وقت‌ها، پیش رفتن با آموزشی که یک تازه‌وارد نوشته، آسان‌تر از درسی است که یک متخصص نوشته چون ممکن است برای یک متخصص، الفبای موضوع آنقدر بدیهی باشد که اشاره‌ای به آن نکند. ما یک درس در مورد نحوه نوشتن آموزش‌ها داریم که در آن می‌توانید با الگوهای قراردادی نوشتن آموزش‌ها آشنا شده و به این راحتی عضو فعال جامعه MEI شوید :-) +

+
diff --git a/_tutorials-FA/100_structure/step-00/100_structure_step-00-desc.html b/_tutorials-FA/100_structure/step-00/100_structure_step-00-desc.html new file mode 100644 index 00000000..c63a42a0 --- /dev/null +++ b/_tutorials-FA/100_structure/step-00/100_structure_step-00-desc.html @@ -0,0 +1,16 @@ +
+

+ در این آموزش، با مبانی پایه‌ای XML آشنا خواهید شد و بیرونی‌ترین لایه‌های یک سند معتبر MEI را خواهید شناخت. +در پایان این آموزش، باید بتوانید بخش‌های مختلف یک فایل MEI را شناسایی کنید و بدانید در هر بخشی از فایل MEI چه نوع اطلاعاتی را می‌توان انتظار داشت. +

+

+ موضوعات مطرح شده در این آموزش به فصل اِلِمنت‌های ساختاری از راهنمای MEI اشاره دارد. پیشنهاد می‌شود برای اطلاعات دقیق‌تر به این فصل مراجعه کنید. +

+

+ لطفاً توجه داشته باشید کدی که در این آموزش می‌نویسید به دلیل نداشتن اطلاعات درباره محتوای واقعی موسیقایی، بلافاصله قابل رندر نخواهد بود. +

+

+ با این حال، پس از اتمام این آموزش، ممکن است بخواهید سایر آموزش‌ها را انجام دهید که جنبه‌های مهم دیگری از MEI را معرفی می‌کنند. (بسیاری از آن‌ها شامل کدهای قابل رندر برای موسیقی هستند.) این درس‌ها به عنوان مرجع ساده‌ای برای MEI هم عمل می‌کنند و شما همیشه می‌توانید به آن‌ها بازگردید. +

+

برای شروع، لطفاً روی دکمه "ادامه" در پایین سمت راست این پاراگراف کلیک کنید.

+
diff --git a/_tutorials-FA/100_structure/step-01/100_structure_step-01-desc.html b/_tutorials-FA/100_structure/step-01/100_structure_step-01-desc.html new file mode 100644 index 00000000..360919d9 --- /dev/null +++ b/_tutorials-FA/100_structure/step-01/100_structure_step-01-desc.html @@ -0,0 +1,21 @@ +
+

+ گام اول: آشنایی با مبانی پایه‌ای XML و یادگیری درباره المنت ریشه‌ای MEI. +

+

+ MEI از XML برای نمایش نت‌های موسیقی استفاده می‌کند. XML یک سیستم کدنویسی سلسله‌مراتبی است که اجزای اصلی آن، المنتها هستند. این المنتها با استفاده از چیزی به نام «تگ‌» نمایش داده می‌شوند. معمولاً این تگ‌ها شامل یک تگ آغاز (باز شونده - که نام آن در داخل براکت‌های زاویه‌ای مانند + <element>) و تگ پایان یا بسته‌شونده مربوطه (</element>) هستند. اگر محتوایی بین این دو تگ وجود نداشته باشد (مانند متن یا المنتهای دیگر)، المنت می‌تواند به شکل کوتاه‌شده‌ی <element /> نوشته شود. در هر صورت، هر تگی باز شده باشد، بعداً بسته شود. +

+

+ می‌توانید تصور کنید سند XML مثل درختی است که از یک المنت اصلی (مثل یک لایه‌ی بیرونی که عناصر دیگر را در بر گرفته) به المنتهای فرزند (لایه‌های داخلی‌تر) شاخه می‌شود. +المنت Root یا ریشه‌ای در یک سند MEI، المنتی به نام <mei> است (در گام بعدی توضیح خواهیم داد که نام المنتها، قراردادی است و هر نام دیگری میتوانست باشد.) +

+ +

یک المنت ریشه‌ای <mei> را در کادر زیر وارد کنید. فراموش نکنید که تگ آغاز را با تگ پایان مربوطه ببندید.

+ +

+ پی‌نوشت: ما اصول پایه‌ای XML بیشتری را در مراحل بعدی پوشش خواهیم داد. برای اطلاعات دقیق‌تر، به مطالبی در فضای وب در دسترس است نگاهی بیندازید، مثلاً + Gentle Introduction to XML + از Text Encoding Initiative (TEI). +

+
diff --git a/_tutorials-FA/100_structure/step-01/100_structure_step-01-prefill.xml b/_tutorials-FA/100_structure/step-01/100_structure_step-01-prefill.xml new file mode 100644 index 00000000..44fbfea5 --- /dev/null +++ b/_tutorials-FA/100_structure/step-01/100_structure_step-01-prefill.xml @@ -0,0 +1 @@ + diff --git a/_tutorials-FA/100_structure/step-01/100_structure_step-01.xml b/_tutorials-FA/100_structure/step-01/100_structure_step-01.xml new file mode 100644 index 00000000..42fb3cce --- /dev/null +++ b/_tutorials-FA/100_structure/step-01/100_structure_step-01.xml @@ -0,0 +1,4 @@ + + + + diff --git a/_tutorials-FA/100_structure/step-02/100_structure_step-02-desc.html b/_tutorials-FA/100_structure/step-02/100_structure_step-02-desc.html new file mode 100644 index 00000000..6292f079 --- /dev/null +++ b/_tutorials-FA/100_structure/step-02/100_structure_step-02-desc.html @@ -0,0 +1,20 @@ +
+

+ گام دوم: آشنایی با کاربرد و استفاده از نام‌حوزه‌ها (namespaces). +

+

+ بسیارخب! همان‌طور که در گام قبلی ذکر شد، نام المنتهای ریشه‌ای یک سند XML اساساً نامی دلخواه است که به خودی خود معنایی برای کامپیوتر ندارد. برای روشن کردن اینکه یک المنت در چه زمینه‌ای تعریف شده و برای جلوگیری از تداخل نام‌ها با المنت‌ها دیگر، XML از + نام‌حوزه‌ها استفاده می‌شود. + نام‌حوزه‌ها می‌توانند با افزودن اعلان نام‌حوزه‌ی @xmlns به المنت ریشه‌ای معرفی شوند. +

+

+ به عنوان مثال، نام‌حوزه‌ی MEI http://www.music-encoding.org/ns/mei است و می‌تواند به صورت زیر اعلان شود: xmlns="http://www.music-encoding.org/ns/mei" +

+

+ هرگاه در متن نشانه‌ای با علامت @ پیش‌نشسته را دیدید (مانند @xmlns بالا)، این به معنای اشاره به یک خصیصه (Attribute) درXML است. (این نوع اشاره متداولی است که از زبان + XPath نشأت می‌گیرد.) + خصیصه‌ها حاوی اطلاعات مشخص شده (مقادیر خصیصه) هستند که به المنت‌ها مربوط می‌شوند. با این حال، بر خلاف المنت‌ها، خصیصه‌های XML تگ‌های باز یا بسته خود را ندارند و تنها در داخل تگ باز المنت و در کنار نام المنت قرار می‌گیرند. آنها شامل نام خصیصه و علامت مساوی به همراه مقدار خصیصه هستند که همیشه باید درون گیومه (کوتاه یا بلند) قرار گیرد. خصیصه‌های متعدد با فضاهای خالی (space بین کلمات) از یکدیگر جدا می‌شوند. توجه داشته باشید که علامت @ تنها در توصیف‌های متنی قبل از نام خصیصه قرار می‌گیرد و در خود کدنویسی نمی‌آید. +

+ +

در کادر زیر، یک اعلان (Declaration) نام‌حوزه‌ی MEI به المنت ریشه‌ای MEI اضافه کنید.

+
diff --git a/_tutorials-FA/100_structure/step-02/100_structure_step-02-prefill.xml b/_tutorials-FA/100_structure/step-02/100_structure_step-02-prefill.xml new file mode 100644 index 00000000..3958eccf --- /dev/null +++ b/_tutorials-FA/100_structure/step-02/100_structure_step-02-prefill.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_tutorials-FA/100_structure/step-02/100_structure_step-02.xml b/_tutorials-FA/100_structure/step-02/100_structure_step-02.xml new file mode 100644 index 00000000..0936760f --- /dev/null +++ b/_tutorials-FA/100_structure/step-02/100_structure_step-02.xml @@ -0,0 +1,4 @@ + + + + diff --git a/_tutorials-FA/100_structure/step-03/100_structure_step-03-desc.html b/_tutorials-FA/100_structure/step-03/100_structure_step-03-desc.html new file mode 100644 index 00000000..b358fce1 --- /dev/null +++ b/_tutorials-FA/100_structure/step-03/100_structure_step-03-desc.html @@ -0,0 +1,23 @@ +
+

+ گام سوم: آشنایی با المنت‌های اصلی فرزندِ المنت ریشه‌ای <mei>: <meiHead> + و <music>. +

+

+ آفرین! حالا که نام‌حوزه را در المنت ریشه‌ای خود اعلان کرده‌ایم، تمامی المنت‌ها دیگر که در عنصر ریشه‌ای جاگذاری شده‌اند، می‌توانند بر اساس نام‌حوزه MEI توسط کامپیوتر شناسایی شوند. +

+

+ همان‌طور که قبلاً ذکر شد، می‌توانید به سند XML مانند درختی فکر کنید که از یک عنصر ریشه‌ای (بیرونی) به عناصر فرزند (درونی) شاخه می‌شود. یک فایل کدگذاری شده MEI حداقل شامل دو المنت درون المنتِ ریشه‌ای + <mei> است: +

+ + +

در ویرایشگر زیر، یک المنت <meiHead> و یک المنت <music> را درون المنت ریشه‌ای <mei> اضافه کنید.

+
diff --git a/_tutorials-FA/100_structure/step-03/100_structure_step-03-prefill.xml b/_tutorials-FA/100_structure/step-03/100_structure_step-03-prefill.xml new file mode 100644 index 00000000..9991eba5 --- /dev/null +++ b/_tutorials-FA/100_structure/step-03/100_structure_step-03-prefill.xml @@ -0,0 +1,3 @@ + + + diff --git a/_tutorials-FA/100_structure/step-03/100_structure_step-03.xml b/_tutorials-FA/100_structure/step-03/100_structure_step-03.xml new file mode 100644 index 00000000..4eed803b --- /dev/null +++ b/_tutorials-FA/100_structure/step-03/100_structure_step-03.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/_tutorials-FA/100_structure/step-04/100_structure_step-04-desc.html b/_tutorials-FA/100_structure/step-04/100_structure_step-04-desc.html new file mode 100644 index 00000000..5c80eec2 --- /dev/null +++ b/_tutorials-FA/100_structure/step-04/100_structure_step-04-desc.html @@ -0,0 +1,24 @@ +
+

+ گام چهارم: آشنایی با حداقل اطلاعات برای سربرگ یک فایلMEI . +

+

+ بسیارخب! اکنون به ساختار پایه‌ای یک سند MEI نزدیک شده‌اید. فقط مانده دو المنت ضروری در سربرگ فایل: +

+ +

+ هر دو این المنت‌ها بخشی از توصیف فایل (<fileDesc>) هستند، که المنت فرزند مستقیم <meiHead> است و توصیف کامل کتاب‌شناسی یک فایل MEI را ارائه می‌دهد. +

+

+ در کادر زیر، یک المنت <fileDesc> را درون <meiHead> اضافه کنید. + سپس المنت‌های ضروری <titleStmt> و <pubStmt> را به + <fileDesc> و یک المنت <title> را به <titleStmt> اضافه کنید. +

+
diff --git a/_tutorials-FA/100_structure/step-04/100_structure_step-04-prefill.xml b/_tutorials-FA/100_structure/step-04/100_structure_step-04-prefill.xml new file mode 100644 index 00000000..fe8543ac --- /dev/null +++ b/_tutorials-FA/100_structure/step-04/100_structure_step-04-prefill.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/_tutorials-FA/100_structure/step-04/100_structure_step-04.xml b/_tutorials-FA/100_structure/step-04/100_structure_step-04.xml new file mode 100644 index 00000000..8e1127cd --- /dev/null +++ b/_tutorials-FA/100_structure/step-04/100_structure_step-04.xml @@ -0,0 +1,13 @@ + + + + + + March + + + + + + + diff --git a/_tutorials-FA/101_quickstart/101_note-little-lamb.png b/_tutorials-FA/101_quickstart/101_note-little-lamb.png new file mode 100644 index 00000000..d30a110d Binary files /dev/null and b/_tutorials-FA/101_quickstart/101_note-little-lamb.png differ diff --git a/_tutorials-FA/101_quickstart/101_note-sequence.png b/_tutorials-FA/101_quickstart/101_note-sequence.png new file mode 100644 index 00000000..da31c5a3 Binary files /dev/null and b/_tutorials-FA/101_quickstart/101_note-sequence.png differ diff --git a/_tutorials-FA/101_quickstart/101_quickstart.json b/_tutorials-FA/101_quickstart/101_quickstart.json new file mode 100644 index 00000000..72e368e2 --- /dev/null +++ b/_tutorials-FA/101_quickstart/101_quickstart.json @@ -0,0 +1,95 @@ +{ + "steps": [ + { + "label":"به MEI خوش آمدید!", + "descFile": "101_quickstart_step-00-desc.html" + }, + { + "label":"نت اول", + "editorLines":1, + "descFile": "101_quickstart_step-01-desc.html", + "xmlFile": "101_quickstart_step-01.xml", + "prefillFile": "101_quickstart_step-01-prefill.xml", + "xpaths": [ + {"rule":"count(//mei:note) = 1", "renderanyway": false, "hint": "یک المنت note لازم دارید."}, + {"rule":"count(//mei:note/@*) = 3 and //mei:note/@pname and //mei:note/@oct and //mei:note/@dur", "renderanyway": false, "hint": "سه تا خصیصه برای المنت note نیاز دارید: @pname, @oct, و @dur."}, + {"rule":"//mei:note/@pname", "renderanyway": false, "hint": "خصیصه‌ی @pname مقادیر مجاز 'a' تا 'g' را می‌پذیرد."}, + {"rule":"//mei:note/@oct", "renderanyway": false, "hint": "خصیصه‌ی @oct به مقدار عددی نیاز دارد."}, + {"rule":"//mei:note/@dur", "renderanyway": false, "hint": "خصیصه‌ی @dur مقادیری مانند '1', '2', '4', '8' و... را می‌پذیرد."}, + {"rule":"//mei:note/@pname = 'e'", "renderanyway": true, "hint": "یک خصیصه‌ی @pnameنیاز دارید، با مقدار e."}, + {"rule":"//mei:note/@oct = '4'", "renderanyway": true, "hint": "یک خصیصه‌ی @octنیاز دارید، با مقدار 4."}, + {"rule":"//mei:note/@dur = '4'", "renderanyway": true, "hint": "یک خصیصه‌ی @durنیاز دارید، با مقدار 4."} + ] + }, + { + "label":"چند نت", + "editorLines":8, + "descFile": "101_quickstart_step-02-desc.html", + "xmlFile": "101_quickstart_step-02.xml", + "prefillFile": "101_quickstart_step-02-prefill.xml", + "xpaths": [ + {"rule":"count(//mei:note) = 7", "renderanyway": true}, + {"rule":"//mei:note[1]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[1]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[1]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[2]/@pname = 'd'", "renderanyway": true}, + {"rule":"//mei:note[2]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[2]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[3]/@pname = 'c'", "renderanyway": true}, + {"rule":"//mei:note[3]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[3]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[4]/@pname = 'd'", "renderanyway": true}, + {"rule":"//mei:note[4]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[4]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[5]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[5]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[5]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[6]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[6]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[6]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[7]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[7]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[7]/@dur = '4'", "renderanyway": true} + ] + }, + { + "label":"یک ملودی ساده", + "editorLines":8, + "descFile": "101_quickstart_step-03-desc.html", + "xmlFile": "101_quickstart_step-03.xml", + "prefillFile": "101_quickstart_step-03-prefill.xml", + "xpaths": [ + {"rule":"count(//mei:note) = 7", "renderanyway": true}, + {"rule":"//mei:note[1]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[1]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[1]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[1]/@dots = '1'", "renderanyway": true}, + {"rule":"//mei:note[2]/@pname = 'd'", "renderanyway": true}, + {"rule":"//mei:note[2]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[2]/@dur = '8'", "renderanyway": true}, + {"rule":"//mei:note[3]/@pname = 'c'", "renderanyway": true}, + {"rule":"//mei:note[3]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[3]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[4]/@pname = 'd'", "renderanyway": true}, + {"rule":"//mei:note[4]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[4]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[5]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[5]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[5]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[6]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[6]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[6]/@dur = '4'", "renderanyway": true}, + {"rule":"//mei:note[7]/@pname = 'e'", "renderanyway": true}, + {"rule":"//mei:note[7]/@oct = '4'", "renderanyway": true}, + {"rule":"//mei:note[7]/@dur = '2'", "renderanyway": true} + ] + } + ], + "end":"101_quickstart_end.html", + "resp":[ + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +} diff --git a/_tutorials-FA/101_quickstart/101_quickstart.md b/_tutorials-FA/101_quickstart/101_quickstart.md new file mode 100644 index 00000000..ca7e504c --- /dev/null +++ b/_tutorials-FA/101_quickstart/101_quickstart.md @@ -0,0 +1,7 @@ +--- +layout: tutorials +type: tutorial +name: "مقدماتی: شروع سریع" +fullname: "آموزش 5دقیقه‌ای مقدماتی MEI" +data: "101_quickstart.json" +--- diff --git a/_tutorials-FA/101_quickstart/101_quickstart_end.html b/_tutorials-FA/101_quickstart/101_quickstart_end.html new file mode 100644 index 00000000..333dab04 --- /dev/null +++ b/_tutorials-FA/101_quickstart/101_quickstart_end.html @@ -0,0 +1,14 @@ +
+

تبریک!

+

شما اولین آموزش خود درباره MEI را به پایان رساندید و حالا باید بتوانید یک ملودی بسیار ساده را با MEI رمزگذاری + کنید. البته، برای نوشتن یک فایل کامل MEI دانستن چیزهای بیشتری نیاز است – ما تمام اطلاعات ساختاری درباره میزان‌ها + و خطوط حامل را کنار گذاشتیم، و شما این را هم باید یاد بگیرید که چطور میزان‌نما، کلید و مایه‌نما (علائم سرکلید) + را تنظیم کنید. به عنوان مراحل بعدی در MEI، ما آموزش‌های خود را درباره + آکوردها یا + سکوت‌ها توصیه می‌کنیم. + البته، هر زمان خواستید می‌توانید به این آموزش‌ها (یا حتی همین آموزش) بازگردید و مطالب را مرور کنید. +

+

+ وقتی تا حدودی با MEI آشنا شدید، از شما دعوت می‌کنیم تجربه خود را با جامعه MEI به اشتراک بگذارید و یک آموزش درباره جنبه‌ای از MEI که به آن علاقه‌مندید بنویسید. برای این کار لازم نیست حتماً متخصص باشید – خوب است درس‌ها را در سطوح متفاوتی داشته‌باشیم و خیلی وقت‌ها، پیش رفتن با آموزشی که یک تازه‌وارد نوشته، آسان‌تر از درسی است که یک متخصص نوشته چون ممکن است برای یک متخصص، الفبای موضوع آنقدر بدیهی باشد که اشاره‌ای به آن نکند. ما یک درس در مورد نحوه نوشتن آموزش‌ها داریم که در آن می‌توانید با الگوهای قراردادی نوشتن آموزش‌ها آشنا شوید و به این راحتی عضو فعال جامعه MEI شوید :-) +

+
\ No newline at end of file diff --git a/_tutorials-FA/101_quickstart/101_quickstart_step-00-desc.html b/_tutorials-FA/101_quickstart/101_quickstart_step-00-desc.html new file mode 100644 index 00000000..7def8da4 --- /dev/null +++ b/_tutorials-FA/101_quickstart/101_quickstart_step-00-desc.html @@ -0,0 +1,12 @@ +
+

+ در این آموزش، خواهید آموخت که چگونه یک ملودی بسیار ساده را در MEI رمزگذاری کنید. شما یاد می‌گیرید که چگونه جنبه‌های ابتدایی نت‌نویسی موسیقی را به‌عنوان اطلاعات ساختاری توصیف کنید تا کامپیوتر بتواند کد شما را پردازش کند. +

+

+ کدی که می‌نویسید بلافاصله رندر می‌شود و رندر به تغییرات شما واکنش نشان می‌دهد. به این ترتیب، شما متوجه تعاملات پارامترهای مختلف خواهید شد. +

+

+ پس از اینکه این آموزش را به پایان رساندید، ممکن است بخواهید آموزش‌های دیگری را انجام دهید که جنبه‌های مهم دیگری از MEI را معرفی می‌کنند. این آموزش‌ها به‌عنوان مرجعی ساده برای MEI عمل می‌کنند – شما همیشه می‌توانید به آن‌ها بازگردید. +

+

برای شروع، لطفاً روی دکمه "ادامه" کلیک کنید.

+
\ No newline at end of file diff --git a/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01-desc.html b/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01-desc.html new file mode 100644 index 00000000..79850cb9 --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01-desc.html @@ -0,0 +1,17 @@ +
+

+ برای کدگذاری (encode) یک نت، تمام اطلاعات مربوطه باید طوری ثبت شوند که کامپیوتر بتواند آنها را بخواند. این که کدام جزئیات اهمیت بیشتری دارند، بسته به نیازهای یک پروژه ممکن است متفاوت باشد؛ اما برای پیش بردن این مقدمه، بیایید بر روی اطلاعات اساسی یک نت توافق کنیم: نام نت (written pitch) نوشته شده و مدت زمان آن (duration). برای بیان گام، MEI از + نشان‌گذاری علمی  نام نت استفاده می‌کند، که در آن، نت دو میانی به شکل "C4" بیان می‌شود. با این حال، آن را به دو بخش جداگانه از اطلاعات تقسیم می‌کند: نام نت (در MEI به عنوان @pname شناخته می‌شود) و اکتاو (@oct). این جداسازی دلایل مختلفی دارد که در اینجا به آنها نمی‌پردازیم. همچنین لازم به ذکر است که نام نت‌ها در MEI به صورت رشته‌های متنی با حروف کوچک نوشته می‌شوند. +

+

ویژگی مهم دیگر نت، کشش زمانی (@dur) است. در اینجا، اعداد صحیح برای نشان دادن مدت زمان یک نت استفاده می‌شوند. یک نت گرد مقداری برابر با 1 دارد، یک نت سفید: 2، نت سیاه 4 و به همین ترتیب. +

+

+ از شما می‌خواهیم که کد زیر را در کادر خالی وارد کنید: <note pname="e" oct="4" dur="4"/>. سپس باید ببینید که نت، رندِر می‌شود. می‌توانید کمی با مقادیر خصیصه‌ها بازی کنید تا ببینید چگونه رندر را تحت تأثیر قرار می‌دهند. همچنین راهنمایی‌هایی برای نوشتن کد صحیح خواهید دید. هر زمان که آماده بودید، مطمئن شوید که کد صحیح را در ویرایشگر نوشته‌اید و سپس دکمه "ادامه" را در پایین سمت راست فشار دهید. +

+

+ پی‌نوشت: اگر با XML خیلی آشنا نیستید: هر زمان که به خصیصه‌ها اشاره می‌کنیم، نام آنها را با علامت @ پیشوند می‌دهیم. این یک روش معمول است و از زبان + XPath + نشأت می‌گیرد. هنگام نوشتن آنها در XML، فقط نام خصیصه را (بدون @) بنویسید. برای اطلاعات بیشتر، به + آموزش مقدمات XML ما نگاهی بیندازید. +

+
diff --git a/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01-prefill.xml b/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01-prefill.xml new file mode 100644 index 00000000..b28124ba --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01-prefill.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01.xml b/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01.xml new file mode 100644 index 00000000..ea550c35 --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-01/101_quickstart_step-01.xml @@ -0,0 +1,32 @@ + + + + + + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?><note pname="e" oct="4" dur="4"/><?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02-desc.html b/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02-desc.html new file mode 100644 index 00000000..300cac7f --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02-desc.html @@ -0,0 +1,9 @@ +<div> + <p> + تبریک! شما <b>اولین نت</b> خود را در MEI رمزگذاری کردید. حالا با اضافه کردن چند نت دیگر، اولین توالی ساده نت‌ها را رمزگذاری کنید: + <img style="display: block; margin: .5rem auto; width: 240px;" src="./101_note-sequence.png" alt="توالی نت‌ها"> + </p> + <p class="tutorialTask"> + لطفاً سعی کنید توالی بالا را با MEI بنویسید. (می‌توانید المنت نت اول را به تعداد لازم کپی و جای‌گذاری کنید). هر نت به یک خصیصه <code>@pname</code>، <code>@oct</code> و <code>@dur</code> نیاز دارد. به یاد داشته باشید که نام‌های نت‌ها در MEI به صورت رشته‌های متنی با حروف کوچک (از <code>a</code> تا <code>g</code>) نوشته‌ می‌شوند. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02-prefill.xml b/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02-prefill.xml new file mode 100644 index 00000000..b4c58d1e --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02-prefill.xml @@ -0,0 +1 @@ +<note pname="e" oct="4" dur="4" /> diff --git a/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02.xml b/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02.xml new file mode 100644 index 00000000..24de607d --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-02/101_quickstart_step-02.xml @@ -0,0 +1,40 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?> + <note pname="e" oct="4" dur="4"/> + <note pname="d" oct="4" dur="4"/> + <note pname="c" oct="4" dur="4"/> + <note pname="d" oct="4" dur="4"/> + <note pname="e" oct="4" dur="4"/> + <note pname="e" oct="4" dur="4"/> + <note pname="e" oct="4" dur="4"/> + <?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03-desc.html b/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03-desc.html new file mode 100644 index 00000000..0fe0e984 --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03-desc.html @@ -0,0 +1,12 @@ +<div> + <p>تبریک! شما برای اولین بار، <b>توالی‌ای از نت‌ها</b> را در MEI رمزگذاری کردید. حالا با تنظیم مقادیر کشش زمانی نت‌ها، اولین ملودی ساده خود را رمزگذاری کنید – حتماً آهنگ "Mary had a little lamb" را می‌شناسید: + <img style="display: block; margin: .5rem auto; width: 240px;" src="./101_note-little-lamb.png" alt="Mary had a little lamb"></p> + <p class="tutorialTask"> + لطفاً سعی کنید ملودی بالا را با MEI بازتولید کنید. هر نت به خصیصه‌های <code>@pname</code>، <code>@oct</code> و <code>@dur</code> نیاز دارد. + </p> + <p> + به یاد داشته باشید که خصیصه <code>@dur</code> می‌تواند مقادیری مانند <code>"1"</code>، <code>"2"</code>، <code>"4"</code>، + <code>"8"</code> یا <code>"16"</code> داشته باشد تا ارزشهای زمانی مختلف را نشان دهد. + برای نت اول، شما به خصیصه اضافی <code>@dots</code> نیاز دارید، که باید تعداد نقطه‌ها را به عنوان یک عدد صحیح مشخص کنید – در این مورد، <code>dots="1"</code> است. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03-prefill.xml b/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03-prefill.xml new file mode 100644 index 00000000..441e8481 --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03-prefill.xml @@ -0,0 +1,7 @@ +<note pname="e" oct="4" dur="4"/> +<note pname="d" oct="4" dur="4"/> +<note pname="c" oct="4" dur="4"/> +<note pname="d" oct="4" dur="4"/> +<note pname="e" oct="4" dur="4"/> +<note pname="e" oct="4" dur="4"/> +<note pname="e" oct="4" dur="4"/> diff --git a/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03.xml b/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03.xml new file mode 100644 index 00000000..50503dfd --- /dev/null +++ b/_tutorials-FA/101_quickstart/step-03/101_quickstart_step-03.xml @@ -0,0 +1,40 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?> + <note pname="e" oct="4" dur="4" dots="1"/> + <note pname="d" oct="4" dur="8"/> + <note pname="c" oct="4" dur="4"/> + <note pname="d" oct="4" dur="4"/> + <note pname="e" oct="4" dur="4"/> + <note pname="e" oct="4" dur="4"/> + <note pname="e" oct="4" dur="2"/> + <?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/102_incipit/102_incipit.json b/_tutorials-FA/102_incipit/102_incipit.json new file mode 100644 index 00000000..5dc3026f --- /dev/null +++ b/_tutorials-FA/102_incipit/102_incipit.json @@ -0,0 +1,482 @@ +{ + "steps": [ + { + "label": "تعریف پارتیتور و حامل", + "editorLines": 7, + "descFile": "102_incipit_step-01-desc.html", + "prefillFile": "102_incipit_step-01-prefill.xml", + "xmlFile": "102_incipit_step-01.xml", + "xpaths": [ + {"rule": "count(//mei:scoreDef) = 1", "renderanyway": false, "hint": "یک المنت scoreDef نیاز دارید."}, + {"rule": "count(//mei:scoreDef/@*) = 0", "renderanyway": false, "hint": "برای المنت scoreDef به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "count(//mei:staffGrp) = 1", "renderanyway": false, "hint": "یک المنت staffGrp نیاز دارید."}, + {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "برای المنت staffGrp به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:scoreDef/mei:staffGrp", "renderanyway": false, "hint": "المنت staffGrp باید فرزند (زیرشاخه) المنت scoreDef باشد."}, + {"rule": "count(//mei:staffDef) = 1", "renderanyway": false, "hint": "یک المنت staffDef نیاز دارید."}, + {"rule": "count(//mei:staffDef/@*) = 0", "renderanyway": false, "hint": "برای المنت staffDef به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:staffGrp/mei:staffDef", "renderanyway": false, "hint": "المنت staffDef باید فرزند (زیرشاخه) المنت staffGrp باشد."} + ] + }, + { + "label": "خصیصه‌های پارتیتور و حامل", + "editorLines": 7, + "descFile": "102_incipit_step-02-desc.html", + "prefillFile": "102_incipit_step-02-prefill.xml", + "xmlFile": "102_incipit_step-02.xml", + "xpaths": [ + {"rule": "count(//mei:scoreDef) = 1", "renderanyway": false, "hint": "یک المنت scoreDef نیاز دارید."}, + {"rule": "count(//mei:staffGrp) = 1", "renderanyway": false, "hint": "یک المنت staffGroup نیاز دارید."}, + {"rule": "count(//mei:staffGrp/@*) = 0", "renderanyway": false, "hint": "برای المنت staffGrp به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:scoreDef/mei:staffGrp", "renderanyway": false, "hint": "المنت staffGrp باید فرزند (زیرشاخه) المنت scoreDef باشد."}, + {"rule": "count(//mei:staffDef) = 1", "renderanyway": false, "hint": "یک المنت staffDef نیاز دارید."}, + {"rule": "//mei:staffGrp/mei:staffDef", "renderanyway": false, "hint": "المنت staffDef باید فرزند (زیرشاخه) المنت staffGrp باشد."}, + {"rule": "count(//mei:scoreDef/@*) = 2", "renderanyway": false, "hint": "برای المنت scoreDef به دو خصیصه نیاز دارید (@key.sig & @meter.sym)."}, + {"rule": "//mei:scoreDef/@key.sig = '3f'", "renderanyway": false, "hint": "به یک خصیصه‌ی @key.sig با مقدار f نیاز دارید."}, + {"rule": "//mei:scoreDef/@meter.sym = 'cut'", "renderanyway": false, "hint": "به یک خصیصه‌ی @meter.sym با مقدار t نیاز دارید."}, + {"rule": "count(//mei:staffDef/@*) = 4", "renderanyway": false, "hint": "برای المنت staffDef نیاز به چهار خصیصه دارید (@n, @lines, @clef.shape & @clef.line)."}, + {"rule": "//mei:staffDef/@n = '1'", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 1 نیاز دارید."}, + {"rule": "//mei:staffDef/@lines = '5'", "renderanyway": false, "hint": "به یک خصیصه‌ی @lines با مقدار 5 نیاز دارید."}, + {"rule": "//mei:staffDef/@clef.shape = 'G'", "renderanyway": false, "hint": "به یک خصیصه‌ی @clef.shape با مقدار G نیاز دارید."}, + {"rule": "//mei:staffDef/@clef.line = '2'", "renderanyway": false, "hint": "به یک خصیصه‌ی @clef.line با مقدار 2 نیاز دارید."} + ] + }, + { + "label": "میزان، حامل و لایه‌ی صدایی", + "editorLines": 14, + "descFile": "102_incipit_step-03-desc.html", + "prefillFile": "102_incipit_step-03-prefill.xml", + "xmlFile": "102_incipit_step-03.xml", + "xpaths": [ + {"rule": "count(//mei:section) = 1", "renderanyway": false, "hint": "یک المنت section نیاز دارید."}, + {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "برای المنت section به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:score/mei:section", "renderanyway": false, "hint": "المنت section باید فرزند (زیرشاخه) المنت score باشد."}, + {"rule": "count(//mei:measure) = 1", "renderanyway": false, "hint": "یک المنت measure نیاز دارید."}, + {"rule": "//mei:section/mei:measure", "renderanyway": false, "hint": "المنت measure باید فرزند (زیرشاخه) المنت section باشد."}, + {"rule": "count(//mei:measure/@*) = 1", "renderanyway": false, "hint": "برای measure به یک اتریبیوت نیاز دارید (@n)."}, + {"rule": "//mei:measure/@n = '0'", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 0 نیاز دارید."}, + {"rule": "count(//mei:staff) = 1", "renderanyway": false, "hint": "یک المنت staff نیاز دارید."}, + {"rule": "//mei:measure/mei:staff", "renderanyway": false, "hint": "المنت staff باید فرزند (زیرشاخه) المنت measure باشد."}, + {"rule":"count(//mei:staff/@*) = 1", "renderanyway": false, "hint": "برای المنت staff نیاز به یک خصیصه دارید (@n)."}, + {"rule": "//mei:staff/@n = '1'", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 1 نیاز دارید."}, + {"rule": "count(//mei:layer) = 1", "renderanyway": false, "hint": "یک المنت layer نیاز دارید."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "برای المنت layer به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:staff/mei:layer", "renderanyway": false, "hint": "المنت layer باید فرزند (زیرشاخه) المنت staff باشد."} + ] + }, + { + "label": "اولین نت", + "editorLines": 15, + "descFile": "102_incipit_step-04-desc.html", + "prefillFile": "102_incipit_step-04-prefill.xml", + "xmlFile": "102_incipit_step-04.xml", + "xpaths": [ + {"rule": "count(//mei:note) = 1", "renderanyway": false, "hint": "یک المنت note نیاز دارید."}, + {"rule": "count(//mei:note/@*) = 3", "renderanyway": false, "hint": "برای المنت note به سه خصیصه نیاز دارید (@pname, @oct & @dur)."}, + {"rule": "//mei:note/@pname = 'b'", "renderanyway": false, "hint": "به یک خصیصه‌ی @pname با مقدار b نیاز دارید."}, + {"rule": "//mei:note/@oct = '3'", "renderanyway": false, "hint": "به یک خصیصه‌ی @oct با مقدار 3 نیاز دارید."}, + {"rule": "//mei:note/@dur = '4'", "renderanyway": false, "hint": "به یک خصیصه‌ی @dur با مقدار 4 نیاز دارید."} + ] + }, + { + "label": "دومین نت", + "editorLines": 18, + "descFile": "102_incipit_step-05-desc.html", + "prefillFile": "102_incipit_step-05-prefill.xml", + "xmlFile": "102_incipit_step-05.xml", + "xpaths": [ + {"rule": "count(//mei:section) = 1", "renderanyway": false, "hint": "یک المنت section نیاز دارید."}, + {"rule": "count(//mei:section/@*) = 0", "renderanyway": false, "hint": "برای المنت section به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "count(//mei:measure) = 2", "renderanyway": false, "hint": "به دو المنت measure نیاز دارید."}, + {"rule": "//mei:section/mei:measure", "renderanyway": false, "hint": "المنت measure باید فرزند المنت section باشد."}, + {"rule": "count(//mei:section/mei:measure) = 2", "renderanyway": false, "hint": "باید دو المنت measure درون section داشته باشید."}, + {"rule": "count(//mei:measure[1]/@*) = 1 and //mei:measure[1]/@n = 0", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 0 روی اولین measure نیاز دارید."}, + {"rule": "count(//mei:measure[2]/@*) = 1 and //mei:measure[2]/@n = 1", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 1 روی دومین measure نیاز دارید."}, + {"rule": "//mei:measure[1]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff در اولین measure داشته باشید."}, + {"rule": "//mei:measure[2]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff در دومین measure داشته باشید."}, + {"rule": "count(//mei:measure/mei:staff) = 2", "renderanyway": false, "hint": "باید یک المنت staff در هر measure داشته باشید."}, + {"rule": "count(//mei:measure[1]/mei:staff/@*) = 1", "renderanyway": false, "hint": "به یک خصیصه روی staff در اولین measure نیاز دارید (@n)."}, + {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "به یک خصیصه روی staff در دومین measure نیاز دارید (@n)."}, + {"rule": "//mei:measure[1]/mei:staff/@n = 1", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 1 روی اولین المنت staff نیاز دارید."}, + {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 1 روی دومین المنت staff نیاز دارید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer", "renderanyway": false, "hint": "به یک المنت layer در اولین المنت staff نیاز دارید."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "به یک المنت layer در دومین المنت staff نیاز دارید."}, + {"rule": "count(//mei:staff/mei:layer) = 2", "renderanyway": false, "hint": "باید یک المنت layer در هر المنت staff داشته باشید."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "برای المنت layer به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "باید یک المنت note در اولین layer داشته باشید."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "باید یک المنت note در دومین layer داشته باشید."}, + {"rule": "count(//mei:layer/mei:note) = 2", "renderanyway": false, "hint": "باید یک المنت note در هر المنت layer داشته باشید."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "به سه خصیصه روی اولین note نیاز دارید (@pname، @oct و @dur)."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "به سه خصیصه روی دومین note نیاز دارید (@pname، @oct و @dur)."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@pname = 'b'", "renderanyway": false, "hint": "به یک خصیصه‌ی @pname با مقدار b روی اولین note نیاز دارید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@oct = '3'", "renderanyway": false, "hint": "به یک خصیصه‌ی @oct با مقدار 3 روی اولین note نیاز دارید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "به یک خصیصه‌ی @dur با مقدار 4 روی اولین note نیاز دارید."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "به یک خصیصه‌ی @pname با مقدار e روی دومین note نیاز دارید."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note/@oct = '4'", "renderanyway": false, "hint": "به یک خصیصه‌ی @oct با مقدار 4 روی دومین note نیاز دارید."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "به یک خصیصه‌ی @dur با مقدار 4 روی دومین note نیاز دارید."} + ] + }, + + { + "label": "خطوط شاهین", + "editorLines": 12, + "descFile": "102_incipit_step-06-desc.html", + "prefillFile": "102_incipit_step-06-prefill.xml", + "xmlFile": "102_incipit_step-06.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 2", "renderanyway": false, "hint": "به دو المنت measure نیاز دارید."}, + {"rule": "count(//mei:measure[2]/@*) = 1", "renderanyway": false, "hint": "به یک خصیصه روی measure نیاز دارید (@n)."}, + {"rule": "//mei:measure[2]/@n = 1", "renderanyway": false, "hint": "به یک خصیصه‌ی @n با مقدار 1 روی measure نیاز دارید."}, + {"rule": "//mei:measure[2]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff در المنت measure وجود داشته باشد."}, + {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی staff وجود داشته باشد (@n)."}, + {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "باید یک خصیصه‌ی @n با مقدار 1 روی staff وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "باید یک المنت layer در المنت staff وجود داشته باشد."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "برای المنت layer به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "اولین المنت note باید فرزند المنت layer باشد."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی اولین note وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @pname با مقدار e روی اولین note وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @oct با مقدار 4 روی اولین note وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dur با مقدار 4 روی اولین note وجود داشته باشد."}, + {"rule": "count(//mei:beam) = '1'", "renderanyway": false, "hint": "باید یک المنت beam وجود داشته باشد."}, + {"rule": "//mei:layer/mei:beam", "renderanyway": false, "hint": "المنت beam باید فرزند المنت layer باشد."}, + {"rule": "//mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "المنت beam باید بعد از اولین نت (e flat) قرار بگیرد."}, + {"rule": "count(//mei:layer/mei:note/following-sibling::*) = 1", "renderanyway": false, "hint": "باید فقط یک المنت بعد از اولین نت (e flat) وجود داشته باشد."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "برای المنت beam به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "count(//mei:beam/mei:note) = 2", "renderanyway": false, "hint": "باید دو المنت note درون المنت beam وجود داشته باشد."}, + {"rule": "count(//mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی اولین نت به‌هم‌چسبیده وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @pname با مقدار e روی اولین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @oct با مقدار 4 روی اولین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dur با مقدار 8 روی اولین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "count(//mei:beam/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی دومین نت به‌هم‌چسبیده وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:beam/mei:note[2]/@pname = 'g'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @pname با مقدار g روی دومین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @oct با مقدار 4 روی دومین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dur با مقدار 8 روی دومین نت به‌هم‌چسبیده وجود داشته باشد."} + ] + } + , + { + "label": "ریتم نقطه‌دار", + "editorLines": 14, + "descFile": "102_incipit_step-07-desc.html", + "prefillFile": "102_incipit_step-07-prefill.xml", + "xmlFile": "102_incipit_step-07.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 2", "renderanyway": false, "hint": "باید یک المنت measure وجود داشته باشد."}, + {"rule": "count(//mei:measure[2]/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی measure وجود داشته باشد (@n)."}, + {"rule": "//mei:measure[2]/@n = 1", "renderanyway": false, "hint": "باید یک خصیصه‌ی @n با مقدار 1 روی measure وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff در المنت measure وجود داشته باشد."}, + {"rule": "count(//mei:measure[2]/mei:staff/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی staff وجود داشته باشد (@n)."}, + {"rule": "//mei:measure[2]/mei:staff/@n = 1", "renderanyway": false, "hint": "باید یک خصیصه‌ی @n با مقدار 1 روی staff وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer", "renderanyway": false, "hint": "باید یک المنت layer در المنت staff وجود داشته باشد."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "برای المنت layer به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "اولین المنت note باید فرزند المنت layer باشد."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی اولین note وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @pname با مقدار e روی اولین note وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @oct با مقدار 4 روی اولین note وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dur با مقدار 4 روی اولین note وجود داشته باشد."}, + {"rule": "count(//mei:beam) = '1'", "renderanyway": false, "hint": "باید یک المنت beam وجود داشته باشد."}, + {"rule": "//mei:layer/mei:beam", "renderanyway": false, "hint": "المنت beam باید فرزند المنت layer باشد."}, + {"rule": "//mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "المنت beam باید بعد از اولین نت (e flat) بیافتد."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "برای المنت beam به هیچ خصیصه‌ای نیاز ندارید."}, + {"rule": "count(//mei:beam/mei:note) = 2", "renderanyway": false, "hint": "باید دو المنت note درون المنت beam وجود داشته باشد."}, + {"rule": "count(//mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی اولین نت به‌هم‌چسبیده وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @pname با مقدار e روی اولین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @oct با مقدار 4 روی اولین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dur با مقدار 8 روی اولین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "count(//mei:beam/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی دومین نت به‌هم‌چسبیده وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:beam/mei:note[2]/@pname = 'g'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @pname با مقدار g روی دومین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @oct با مقدار 4 روی دومین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:beam/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dur با مقدار 8 روی دومین نت به‌هم‌چسبیده وجود داشته باشد."}, + {"rule": "//mei:layer/mei:beam/following-sibling::mei:note", "renderanyway": false, "hint": "یک نت باید بعد از المنت beam بیافتد."}, + {"rule": "//mei:layer/mei:beam/following-sibling::mei:note/following-sibling::mei:note", "renderanyway": false, "hint": "یک نت دیگر باید بعد از نت بعد از المنت beam بیافتد."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note) = 3", "renderanyway": false, "hint": "باید مجموعاً سه نت به‌عنوان فرزند مستقیم این لایه وجود داشته باشد."}, + {"rule": "count(//mei:layer/mei:note/following-sibling::*) = 3", "renderanyway": false, "hint": "باید سه المنت بعد از اولین نت وجود داشته باشد."}, + {"rule": "count(//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@*) = 4", "renderanyway": false, "hint": "باید چهار خصیصه روی نت نقطه‌دار (سیاه نقطه‌دار) وجود داشته باشد (@pname، @oct، @dur و @dots)."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@pname = 'f'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @pname با مقدار f روی نت نقطه‌دار (سیاه نقطه‌دار) وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @oct با مقدار 4 روی نت نقطه‌دار (سیاه نقطه‌دار) وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@dur = '4'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dur با مقدار 4 روی نت نقطه‌دار (سیاه نقطه‌دار) وجود داشته باشد."}, + {"rule": "//mei:measure[2]/mei:staff/mei:layer/mei:note[2]/@dots = '1'", "renderanyway": false, "hint": "باید یک خصیصه‌ی @dots با مقدار 1 روی نت نقطه‌دار (سیاه نقطه‌دار) وجود داشته"} + ] + }, + { + "label": "یک میزان کامل", + "editorLines": 14, + "descFile": "102_incipit_step-08-desc.html", + "prefillFile": "102_incipit_step-08-prefill.xml", + "xmlFile": "102_incipit_step-08.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 3", "renderanyway": false, "hint": "یک المنت measure نیاز دارید."}, + {"rule": "count(//mei:measure[3]/@*) = 1", "renderanyway": false, "hint": "یک خصیصه روی المنت measure (@n) نیاز دارید."}, + {"rule": "//mei:measure[3]/@n = 2", "renderanyway": false, "hint": "یک خصیصه @n با مقدار 2 روی المنت measure نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff", "renderanyway": false, "hint": "در المنت measure باید یک المنت staff باشد."}, + {"rule": "count(//mei:measure[3]/mei:staff/@*) = 1", "renderanyway": false, "hint": "یک خصیصه روی المنت staff (@n) نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/@n = 1", "renderanyway": false, "hint": "یک خصیصه @n با مقدار 1 روی المنت staff نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer", "renderanyway": false, "hint": "در المنت staff باید یک المنت layer باشد."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "در المنت layer هیچ خصیصه‌ای نیاز نیست."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]", "renderanyway": false, "hint": "المنت اول note باید فرزند المنت layer باشد."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "سه خصیصه روی المنت اول note (@pname, @oct & @dur) نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "یک خصیصه @pname با مقدار e روی المنت اول note نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "یک خصیصه @oct با مقدار 4 روی المنت اول note نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "یک خصیصه @dur با مقدار 4 روی المنت اول note نیاز دارید."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam) = '1'", "renderanyway": false, "hint": "یک المنت beam نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam", "renderanyway": false, "hint": "المنت beam باید فرزند المنت layer باشد."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "المنت beam باید بعد از المنت اول note بیاید."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "در المنت beam هیچ خصیصه‌ای نیاز نیست."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note) = 2", "renderanyway": false, "hint": "دو المنت note باید درون المنت beam باشد."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "سه خصیصه روی المنت اول note در beam (@pname, @oct & @dur) نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "یک خصیصه @pname با مقدار e روی المنت اول note در beam نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "یک خصیصه @oct با مقدار 4 روی المنت اول note در beam نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "یک خصیصه @dur با مقدار 8 روی المنت اول note در beam نیاز دارید."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "سه خصیصه روی المنت دوم note در beam (@pname, @oct & @dur) نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@pname = 'g'", "renderanyway": false, "hint": "یک خصیصه @pname با مقدار g روی المنت دوم note در beam نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "یک خصیصه @oct با مقدار 4 روی المنت دوم note در beam نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "یک خصیصه @dur با مقدار 8 روی المنت دوم note در beam نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/following-sibling::mei:note", "renderanyway": false, "hint": "یک المنت note باید بعد از المنت beam بیاید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:beam/following-sibling::mei:note/following-sibling::mei:note", "renderanyway": false, "hint": "یک المنت دیگر note باید بعد از note بعد از المنت beam بیاید."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note) = 3", "renderanyway": false, "hint": "باید سه المنت note به عنوان فرزندان layer این measure وجود داشته باشد."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note/following-sibling::*) = 3", "renderanyway": false, "hint": "باید سه المنت به عنوان فرزندان note اول وجود داشته باشد."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@*) = 4", "renderanyway": false, "hint": "باید چهار خصیصه روی نت سیاه نقطه‌دار (@pname, @oct, @dur & @dots) وجود داشته باشد."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "یک خصیصه @pname با مقدار b روی نت سیاه نقطه‌دار نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "یک خصیصه @oct با مقدار 4 روی نت سیاه نقطه‌دار نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@dur = '4'", "renderanyway": false, "hint": "یک خصیصه @dur با مقدار 4 روی نت سیاه نقطه‌دار نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[2]/@dots = '1'", "renderanyway": false, "hint": "یک خصیصه @dots با مقدار 1 روی نت سیاه نقطه‌دار نیاز دارید."}, + {"rule": "count(//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی نت چنگ (@pname, @oct & @dur) وجود داشته باشد."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@pname = 'g'", "renderanyway": false, "hint": "یک خصیصه @pname با مقدار g روی نت چنگ نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@oct = '4'", "renderanyway": false, "hint": "یک خصیصه @oct با مقدار 4 روی نت چنگ نیاز دارید."}, + {"rule": "//mei:measure[3]/mei:staff/mei:layer/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "یک خصیصه @dur با مقدار 8 روی نت چنگ نیاز دارید."} + ] + }, + + + { + "label": "دو میزان پایانی", + "editorLines": 14, + "descFile": "102_incipit_step-09-desc.html", + "prefillFile": "102_incipit_step-09-prefill.xml", + "xmlFile": "102_incipit_step-09.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 5", "renderanyway": false, "hint": "به دو المنت measure نیاز دارید."}, + {"rule": "//mei:measure[4]/following-sibling::mei:measure", "renderanyway": false, "hint": "میزان‌ها باید پی در پی باشند."}, + {"rule": "count(//mei:measure[4]/@*) = 1", "renderanyway": false, "hint": "به یک خصیصه در المنت measure اول (@n) نیاز دارید."}, + {"rule": "//mei:measure[4]/@n = 3", "renderanyway": false, "hint": "به یک خصیصه @n با مقدار 3 در المنت measure اول نیاز دارید."}, + {"rule": "count(//mei:measure[5]/@*) = 1", "renderanyway": false, "hint": "به یک خصیصه در المنت measure دوم (@n) نیاز دارید."}, + {"rule": "//mei:measure[5]/@n = 4", "renderanyway": false, "hint": "به یک خصیصه @n با مقدار 4 در المنت measure دوم نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff", "renderanyway": false, "hint": "میزان n=3: به یک المنت staff درون المنت measure نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/@*) = 1", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه در staff (@n) نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/@n = 1", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @n با مقدار 1 در staff نیاز دارید."}, + {"rule": "//mei:measure[5]/mei:staff", "renderanyway": false, "hint": "میزان n=4: به یک المنت staff درون المنت measure نیاز دارید."}, + {"rule": "count(//mei:measure[5]/mei:staff/@*) = 1", "renderanyway": false, "hint": "میزان n=4: به یک خصیصه در staff (@n) نیاز دارید."}, + {"rule": "//mei:measure[5]/mei:staff/@n = 1", "renderanyway": false, "hint": "میزان n=4: به یک خصیصه @n با مقدار 1 در staff نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "میزان n=3: به یک المنت layer درون staff نیاز دارید."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "به هیچ خصیصه‌ای در المنت‌های layer نیاز ندارید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer", "renderanyway": false, "hint": "میزان n=4: به یک المنت layer درون staff نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "میزان n=3: به دو المنت beam به عنوان فرزندان مستقیم layer نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "میزان n=3: به یک المنت note به عنوان فرزند مستقیم layer نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "میزان n=3: المنت note باید بین دو المنت beam قرار گیرد."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/*) = '3'", "renderanyway": false, "hint": "میزان n=3: به مجموع 3 المنت به عنوان فرزندان layer نیاز دارید."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "به هیچ خصیصه‌ای در المنت‌های beam نیاز ندارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "میزان n=3: به سه خصیصه در المنت note نیاز دارید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @pname با مقدار e در المنت note نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @oct با مقدار 5 در المنت note نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @dur با مقدار 4 در المنت note نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note) = 4", "renderanyway": false, "hint": "میزان n=3: به چهار المنت note درون المنت beam اول نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "میزان n=3: به سه خصیصه در اولین نت دارای beam نیاز دارید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@pname = 'a'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @pname با مقدار a در اولین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @oct با مقدار 4 در اولین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @dur با مقدار 8 در اولین نت دارای beam نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "میزان n=3: به سه خصیصه در دومین نت دارای beam نیاز دارید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @pname با مقدار b در دومین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @oct با مقدار 4 در دومین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @dur با مقدار 8 در دومین نت دارای beam نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "میزان n=3: به سه خصیصه در سومین نت دارای beam نیاز دارید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@pname = 'g'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @pname با مقدار g در سومین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@oct = '4'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @oct با مقدار 4 در سومین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @dur با مقدار 8 در سومین نت دارای beam نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@*) = 3", "renderanyway": false, "hint": "میزان n=3: به سه خصیصه در چهارمین نت دارای beam نیاز دارید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@pname = 'f'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @pname با مقدار f در چهارمین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@oct = '4'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @oct با مقدار 4 در چهارمین نت دارای beam نیاز دارید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "میزان n=3: به یک خصیصه @dur با مقدار 8 در چهارمین نت دارای beam نیاز دارید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/@*) = 0", "renderanyway": false, "hint": "میزان n=3: به هیچ خصیصه‌ای در المنت beam دوم نیاز ندارید."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/*) = '3'", "renderanyway": false, "hint": "میزان n=4: به مجموع 3 المنت به عنوان فرزندان layer نیاز دارید."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "میزان n=4: به سه خصیصه در المنت note نیاز دارید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note/@pname = 'c'", "renderanyway": false, "hint": "میزان n=4: به یک خصیصه @pname با مقدار c در المنت note نیاز دارید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note/@oct = '4'", "renderanyway": false, "hint": "میزان n=4: به یک خصیصه @oct با مقدار 4 در المنت note نیاز دارید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "میزان n=4: به یک خصیصه @dur با مقدار 4 در المنت note نیاز دارید."} + ] + }, + + { + "label": "آرتیکولاسیون‌ها", + "editorLines": 50, + "descFile": "102_incipit_step-10-desc.html", + "prefillFile": "102_incipit_step-10-prefill.xml", + "xmlFile": "102_incipit_step-10.xml", + "xpaths": [ + {"rule": "count(//mei:measure) = 5", "renderanyway": false, "hint": "باید سه المنت measure داشته باشید."}, + {"rule": "//mei:measure[4]/following-sibling::mei:measure", "renderanyway": false, "hint": "المنت‌های measure باید به‌دنبال هم بیایند."}, + {"rule": "count(//mei:measure[4]/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی اولین المنت measure (@n) داشته باشید."}, + {"rule": "//mei:measure[4]/@n = 3", "renderanyway": false, "hint": "باید یک خصیصه @n با مقدار 3 روی اولین المنت measure داشته باشید."}, + {"rule": "count(//mei:measure[5]/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی دومین المنت measure (@n) داشته باشید."}, + {"rule": "//mei:measure[5]/@n = 4", "renderanyway": false, "hint": "باید یک خصیصه @n با مقدار 4 روی دومین المنت measure داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff درون اولین المنت measure داشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی staff (@n) داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/@n = 1", "renderanyway": false, "hint": "باید یک خصیصه @n با مقدار 1 روی staff داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff درون دومین المنت measure داشته باشید."}, + {"rule": "count(//mei:measure[5]/mei:staff/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی staff (@n) داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/@n = 1", "renderanyway": false, "hint": "باید یک خصیصه @n با مقدار 1 روی staff داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "در المنت measure n=3: باید یک المنت layer درون staff داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer", "renderanyway": false, "hint": "در المنت measure n=4: باید یک المنت layer درون staff داشته باشید."}, + {"rule": "count(//mei:layer/@*) = 0", "renderanyway": false, "hint": "باید هیچ خصیصه‌ای روی المنت‌های layer نداشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "در المنت measure n=3: باید دو المنت beam به‌عنوان فرزند layer داشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک المنت note به‌عنوان فرزند layer داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "در المنت measure n=3: المنت note باید بین دو المنت beam قرار گیرد."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "باید هیچ خصیصه‌ای روی المنت‌های beam نداشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=3: باید سه خصیصه روی المنت note داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @pname با مقدار e روی المنت note داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @oct با مقدار 5 روی المنت note داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @dur با مقدار 4 روی المنت note داشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note) = 4", "renderanyway": false, "hint": "در المنت measure n=3: باید چهار المنت note درون اولین المنت beam داشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=3: باید سه خصیصه روی اولین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@pname = 'a'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @pname با مقدار a روی اولین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @oct با مقدار 4 روی اولین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @dur با مقدار 8 روی اولین note به‌صورت beamed داشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=3: باید سه خصیصه روی دومین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @pname با مقدار b روی دومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @oct با مقدار 4 روی دومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @dur با مقدار 8 روی دومین note به‌صورت beamed داشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=3: باید سه خصیصه روی سومین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@pname = 'c'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @pname با مقدار c روی سومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @oct با مقدار 4 روی سومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @dur با مقدار 8 روی سومین note به‌صورت beamed داشته باشید."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=3: باید سه خصیصه روی چهارمین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@pname = 'd'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @pname با مقدار d روی چهارمین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @oct با مقدار 4 روی چهارمین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=3: باید یک خصیصه @dur با مقدار 8 روی چهارمین note به‌صورت beamed داشته باشید."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note) = 4", "renderanyway": false, "hint": "در المنت measure n=4: باید چهار المنت note درون اولین المنت beam داشته باشید."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=4: باید سه خصیصه روی اولین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @pname با مقدار e روی اولین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @oct با مقدار 4 روی اولین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @dur با مقدار 8 روی اولین note به‌صورت beamed داشته باشید."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=4: باید سه خصیصه روی دومین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@pname = 'f'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @pname با مقدار f روی دومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @oct با مقدار 4 روی دومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @dur با مقدار 8 روی دومین note به‌صورت beamed داشته باشید."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=4: باید سه خصیصه روی سومین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@pname = 'g'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @pname با مقدار g روی سومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @oct با مقدار 4 روی سومین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @dur با مقدار 8 روی سومین note به‌صورت beamed داشته باشید."}, + {"rule": "count(//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@*) = 3", "renderanyway": false, "hint": "در المنت measure n=4: باید سه خصیصه روی چهارمین note به‌صورت beamed داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@pname = 'g'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @pname با مقدار g روی چهارمین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@oct = '4'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @oct با مقدار 4 روی چهارمین note به‌صورت beamed داشته باشید."}, + {"rule": "//mei:measure[5]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "در المنت measure n=4: باید یک خصیصه @dur با مقدار 8 روی چهارمین note به‌صورت beamed داشته باشید."} + ] + }, + + { + "label": "نوانس (ارجاع به tstamps)", + "editorLines": 10, + "descFile": "102_incipit_step-11-desc.html", + "prefillFile": "102_incipit_step-11-prefill.xml", + "xmlFile": "102_incipit_step-11.xml", + "xpaths": [ + {"rule": "count(//mei:measure[@n=0]) = 1", "renderanyway": false, "hint": "باید یک المنت measure با n = 0 داشته باشید."}, + {"rule": "//mei:measure[1]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff درون المنت measure داشته باشید."}, + {"rule": "count(//mei:measure[1]/mei:staff/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه روی staff (@n) داشته باشید."}, + {"rule": "//mei:measure[1]/mei:staff/@n = 1", "renderanyway": false, "hint": "باید یک خصیصه @n با مقدار 1 روی staff داشته باشید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer", "renderanyway": false, "hint": "باید یک المنت layer درون staff داشته باشید."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "باید هیچ خصیصه‌ای روی المنت layer نداشته باشید."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note) = 1", "renderanyway": false, "hint": "باید یک المنت note داشته باشید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note", "renderanyway": false, "hint": "المنت note باید فرزند المنت layer باشد."}, + {"rule": "count(//mei:measure[1]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی المنت note داشته باشید (@pname, @oct & @dur)."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@pname = 'b'", "renderanyway": false, "hint": "باید یک خصیصه @pname با مقدار b روی المنت note داشته باشید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@oct = '3'", "renderanyway": false, "hint": "باید یک خصیصه @oct با مقدار 3 روی المنت note داشته باشید."}, + {"rule": "//mei:measure[1]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "باید یک خصیصه @dur با مقدار 4 روی المنت note داشته باشید."}, + {"rule": "count(//mei:measure[1]/mei:dynam) = '1'", "renderanyway": false, "hint": "باید یک المنت dynam به‌عنوان فرزند measure داشته باشید."}, + {"rule": "//mei:measure[1]/mei:staff/following-sibling::mei:dynam", "renderanyway": false, "hint": "المنت dynam باید پس از المنت staff بیاید."}, + {"rule": "count(//mei:measure[1]/mei:dynam/@*) = 3", "renderanyway": false, "hint": "باید سه خصیصه روی المنت dynam داشته باشید (@staff, @tstamp & @place)."}, + {"rule": "//mei:measure[1]/mei:dynam/@staff = '1'", "renderanyway": false, "hint": "باید یک خصیصه @staff با مقدار 1 روی المنت dynam داشته باشید."}, + {"rule": "//mei:measure[1]/mei:dynam/@tstamp = '1'", "renderanyway": false, "hint": "باید یک خصیصه @tstamp با مقدار 1 روی المنت dynam داشته باشید."}, + {"rule": "//mei:measure[1]/mei:dynam/@place = 'below'", "renderanyway": false, "hint": "باید یک خصیصه @place با مقدار below روی المنت dynam داشته باشید."}, + {"rule": "//mei:measure[1]/mei:dynam/text() = 'ff'", "renderanyway": false, "hint": "باید مقدار متنی ff به‌عنوان محتوای المنت dynam داشته باشید."} + ] + }, + { + "label": "اسلرها (ارجاع به xml:id)", + "editorLines": 25, + "descFile": "102_incipit_step-12-desc.html", + "prefillFile": "102_incipit_step-12-prefill.xml", + "xmlFile": "102_incipit_step-12.xml", + "xpaths": [ + {"rule": "count(//mei:measure[@n=3]) = 1", "renderanyway": false, "hint": "باید یک المنت measure با n = 3 وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff", "renderanyway": false, "hint": "باید یک المنت staff درون المنت measure وجود داشته باشد."}, + {"rule": "count(//mei:measure[4]/mei:staff/@*) = 1", "renderanyway": false, "hint": "باید یک خصیصه بر روی staff (@n) وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/@n = 1", "renderanyway": false, "hint": "باید یک خصیصه @n با مقدار 1 بر روی staff وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer", "renderanyway": false, "hint": "باید یک المنت layer درون staff وجود داشته باشد."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/@*) = 0", "renderanyway": false, "hint": "نیاز به هیچ خصیصه‌ای بر روی المنت layer نیست."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam) = '2'", "renderanyway": false, "hint": "در measure n=3 باید دو المنت beam به عنوان فرزند layer وجود داشته باشد."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note) = '1'", "renderanyway": false, "hint": "در measure n=3 باید یک المنت note به عنوان فرزند layer وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/following-sibling::mei:note/following-sibling::mei:beam", "renderanyway": false, "hint": "در measure n=3، المنت note باید بین دو المنت beam قرار گیرد."}, + {"rule": "count(//mei:beam/@*) = 0", "renderanyway": false, "hint": "نیاز به هیچ خصیصه‌ای بر روی المنت‌های beam نیست."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:note/@*) = 3", "renderanyway": false, "hint": "در measure n=3 باید سه خصیصه بر روی المنت note وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@pname = 'e'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار e بر روی المنت note وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@oct = '5'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 5 بر روی المنت note وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:note/@dur = '4'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 4 بر روی المنت note وجود داشته باشد."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note) = 4", "renderanyway": false, "hint": "در measure n=3 باید چهار المنت note در داخل اولین المنت beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@pname = 'a'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار a بر روی اولین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@oct = '4'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 4 بر روی اولین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[1]/@dur = '8'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 8 بر روی اولین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@pname = 'b'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار b بر روی دومین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 4 بر روی دومین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 8 بر روی دومین note از اولین beam وجود داشته باشد."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@*) = 3", "renderanyway": false, "hint": "در measure n=3 باید سه خصیصه بر روی سومین note از اولین beam وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@pname = 'c'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار c بر روی سومین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@oct = '5'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 5 بر روی سومین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 8 بر روی سومین note از اولین beam وجود داشته باشد."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@*) = 3", "renderanyway": false, "hint": "در measure n=3 باید سه خصیصه بر روی چهارمین note از اولین beam وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@pname = 'd'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار d بر روی چهارمین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@oct = '5'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 5 بر روی چهارمین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[1]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 8 بر روی چهارمین note از اولین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@pname = 'e'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار e بر روی اولین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@oct = '5'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 5 بر روی اولین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[1]/@dur = '4'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 4 بر روی اولین note از دومین beam وجود داشته باشد."}, + {"rule": "count(//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@*) = 3", "renderanyway": false, "hint": "در measure n=3 باید سه خصیصه بر روی دومین note از دومین beam وجود داشته باشد (@pname، @oct و @dur)."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@pname = 'd'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار d بر روی دومین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@oct = '4'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 4 بر روی دومین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[2]/@dur = '8'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 8 بر روی دومین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[3]/@pname = 'c'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار c بر روی سومین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[3]/@oct = '5'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 5 بر روی سومین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[3]/@dur = '8'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 8 بر روی سومین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[4]/@pname = 'b'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @pname با مقدار b بر روی چهارمین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[4]/@oct = '5'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @oct با مقدار 5 بر روی چهارمین note از دومین beam وجود داشته باشد."}, + {"rule": "//mei:measure[4]/mei:staff/mei:layer/mei:beam[2]/mei:note[4]/@dur = '8'", "renderanyway": false, "hint": "در measure n=3 باید یک خصیصه @dur با مقدار 8 بر روی چهارمین note از دومین beam وجود داشته باشد."} + ] + } + + ], + "end": "102_incipit_end.html", + "resp": [ + { + "name": "Margrethe S. Bue", + "affiliation": "National Library of Norway" + }, + { + "name": "Sonja Wronkowska", + "affiliation": "RISM Poland | National Library of Poland" + }, + { + "name": "Debra Nakos", + "affiliation": "University of Maryland, College Park" + }, + { + "name": "Johannes Kepper", + "affiliation": "Beethovens Werkstatt | Universität Paderborn" + }, + { + "name": "Andrew Hankinson", + "affiliation": "Bodleian Libraries | University of Oxford" + }, + { + "name": "Stefan Münnich", + "affiliation": "Anton Webern Gesamtausgabe | University of Basel" + } + ] +} diff --git a/_tutorials-FA/102_incipit/102_incipit.md b/_tutorials-FA/102_incipit/102_incipit.md new file mode 100644 index 00000000..f57d4758 --- /dev/null +++ b/_tutorials-FA/102_incipit/102_incipit.md @@ -0,0 +1,12 @@ +--- +layout: tutorials +type: tutorial +name: "سطح پیشرفته: کدگذاری incipit" +fullname: "درس پیشرفته درباره کدگذاری نتهای ابتدایی در MEI" +data: "102_incipit.json" +--- +خوش آمدید! در این درس خواهید آموخت که چطور نتهای اول یک قطعه موسیقی (بعنوان مثال، تصویر زیر) را در MEI کدگذاری کنید. + +![Hallingdal Bataljons Marsch](./102_incipit.png) + +ضمناً این ملودی، ابتدای قطعه _Hallingdal Bataljons Marsch_، opus 1 از آهنگساز نروژی، [Johan Halvorsen](https://en.wikipedia.org/wiki/Johan_Halvorsen) (1864–1935) است. diff --git a/_tutorials-FA/102_incipit/102_incipit.png b/_tutorials-FA/102_incipit/102_incipit.png new file mode 100644 index 00000000..acd2087a Binary files /dev/null and b/_tutorials-FA/102_incipit/102_incipit.png differ diff --git a/_tutorials-FA/102_incipit/102_incipit_end.html b/_tutorials-FA/102_incipit/102_incipit_end.html new file mode 100644 index 00000000..e5160e38 --- /dev/null +++ b/_tutorials-FA/102_incipit/102_incipit_end.html @@ -0,0 +1,10 @@ +<div> + <h3>تبریک!</h3> + <p>حالا شما با موفقیت این درس پیشرفته را به پایان رسانده‌اید و باید بتوانید یک ملودی تک‌صدایی با چند میزان، نت‌ها و سکوت‌ها با ارزش‌های زمانی مختلف، خطوط شاهین، اسلر و دینامیک‌ها را کدگذاری کنید.</p> + + <p>چند آموزش دیگر هست که ما به عنوان گام‌های بعدی در MEI توصیه می‌کنیم. البته، شما همیشه می‌توانید به این آموزش‌ها (یا حتی همین یکی) بازگردید وقتی که می‌خواهید خودتان را در انجام کارهای خاصی در MEI یادآوری کنید.</p> + + <p> + وقتی تا حدودی با MEI آشنا شدید، از شما دعوت می‌کنیم تجربه خود را با <a href="/community/community-contacts.html" target="_blank" rel="noopener, noreferrer">جامعه MEI</a> به اشتراک بگذارید و یک آموزش درباره جنبه‌ای از MEI که به آن علاقه‌مندید بنویسید. برای این کار لازم نیست حتماً متخصص باشید – خوب است درس‌ها را در سطوح متفاوتی داشته‌باشیم و خیلی وقت‌ها، پیش رفتن با آموزشی که یک تازه‌وارد نوشته، آسان‌تر از درسی است که یک متخصص نوشته چون ممکن است برای یک متخصص، الفبای موضوع آنقدر بدیهی باشد که اشاره‌ای به آن نکند. ما یک <a href="./199-writing-tutorials.html" target="_blank" rel="noopener, noreferrer"> درس در مورد نحوه نوشتن آموزش‌ها</a> داریم که در آن می‌توانید با الگوهای قراردادی نوشتن آموزش‌ها آشنا شوید و به این راحتی عضو فعال جامعه MEI شوید :-) + </p> +</div> diff --git a/_tutorials-FA/102_incipit/step-01/102_incipit_step-01-desc.html b/_tutorials-FA/102_incipit/step-01/102_incipit_step-01-desc.html new file mode 100644 index 00000000..650d06ea --- /dev/null +++ b/_tutorials-FA/102_incipit/step-01/102_incipit_step-01-desc.html @@ -0,0 +1,8 @@ +<div > + <p class="tutorialGoal">گام اول: کدگذاری اسکلت اصلی عبارت آغازین</p> + <p>برای کدگذاری خط ملودی این مثال، باید درباره اینکه پارتیتور و خطوط حامل در این قطعه چطور سازماندهی شده‌اند اطلاعاتی را اضافه کنیم. در MEI، این نوع اطلاعات از طریق المنت‌های <code><scoreDef></code> (تعریف پارتیتور)، <code><staffGrp></code> (گروه خطوط حامل) و <code><staffDef></code> (تعریف خط حامل) داده می‌شود. در اینجا، <code><scoreDef></code> برای مشخص کردن پارامترهای عمومی پارتیتور استفاده می‌شود، <code><staffGrp></code> اطلاعاتی در مورد گروه‌بندی خطوط حامل ارائه می‌دهد (اینکه در هر سیستم، چه حامل‌هایی داریم، و اطلاعات کلی‌ای از هرکدام از این حامل‌ها) و <code><staffDef></code> شامل تمام اطلاعات مربوط به یک خط حامل خاص است. به طور کلی، این المنت‌ها زمینه ساختاری برای محتوای موسیقی ارائه می‌دهند، مثلاً اطلاعاتی درباره تعداد، گروه‌بندی یا ترتیب خطوط حامل، کلید، علائم تغییردهنده سرکلید (مایه‌نما) یا میزان‌نما.</p> + <!-- TODO: add link to structure tutorial here --> + <p>فعلاً با اسکلت ساختاری شروع کنیم.</p> + <p class="tutorialTask">در ویرایشگر زیر، لطفاً یک المنت <code><scoreDef></code> ایجاد کنید که شامل یک المنت فرزند <code><staffGrp></code> و المنت فرزند آن <code><staffDef></code> باشد. برای دیدن خروجی بصری (رندر) کدگذاری، نیاز داریم در مراحل بعدی اطلاعات بیشتری را اضافه کنیم.</p> + </div> + diff --git a/_tutorials-FA/102_incipit/step-01/102_incipit_step-01-prefill.xml b/_tutorials-FA/102_incipit/step-01/102_incipit_step-01-prefill.xml new file mode 100644 index 00000000..44fbfea5 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-01/102_incipit_step-01-prefill.xml @@ -0,0 +1 @@ +<!-- Your encoding should replace this line --> diff --git a/_tutorials-FA/102_incipit/step-01/102_incipit_step-01.xml b/_tutorials-FA/102_incipit/step-01/102_incipit_step-01.xml new file mode 100644 index 00000000..e516e1e3 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-01/102_incipit_step-01.xml @@ -0,0 +1,25 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title type="main">March + + + + + + + + + + + + + + + + + + + + diff --git a/_tutorials-FA/102_incipit/step-02/102_incipit_step-02-desc.html b/_tutorials-FA/102_incipit/step-02/102_incipit_step-02-desc.html new file mode 100644 index 00000000..bc9b78d0 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-02/102_incipit_step-02-desc.html @@ -0,0 +1,19 @@ + +
+

گام دوم: افزودن چند خصیصه به اسکلت اصلی که در مرحله قبلی ایجاد کردید. این خصیصه‌ها اطلاعات پایه‌ای در مورد خط حامل، کلید و مایه‌نمای ملودی نمونه ارائه می‌دهند.

+

شما در مرحله قبل یاد گرفتید که المنت <scoreDef> برای مشخص کردن پارامترهای عمومی پارتیتور استفاده می‌شود، و <staffDef> شامل تمام اطلاعات مربوط به یک خط حامل خاص است. فقط یک حامل در این عبارت آغازین (incipit) مثال وجود دارد، بنابراین می‌توانید مایه‌نما (۳ بمل) و میزان‌نما (cut time - دو دو) را در <staffDef> اعلام کنید. اما بیایید این اطلاعات را به <scoreDef> منتقل کنیم، با این فرض که کلید، تنالیته و میزان‌نما برای تمامی سازها یا بخش‌های دیگر پارتیتور کامل Opus 1 Halvorsen یکسان باشد. برای مشخص کردن یک کلید یا میزان‌نمای خاص، باید از خصیصه‌های زیر در <scoreDef> استفاده کرده و آنها را به المنت <scoreDef> اضافه کنید:

+ +

درباره «کلید»، بعدتر هنگام آشنایی با المنت <staffDef> بیشتر خواهیم آموخت، زیرا برای هرکدام از حامل‌های پارتیتور، بطور جداگانه تعریف میشود (سازهای دیگر ممکن است کلیدهای دیگری داشته باشند). شما باید از خصیصه‌های زیر در <staffDef> استفاده کنید:

+ +

خصیصه‌های توضیح داده شده در بالا و مقادیر مربوطه را به <scoreDef> و <staffDef> در ویرایشگر زیر اضافه کنید. (برای رندر کردن، هنوز اطلاعات بیشتری نیاز است. با ما همراه باشید!)

+

پی‌نوشت: اگرچه ما در متن درس‌ها، خصیصه‌ها را با علامت @ نشان می‌دهیم، نباید این علامت را در کدگذاری استفاده کنیم.

+
+ diff --git a/_tutorials-FA/102_incipit/step-02/102_incipit_step-02-prefill.xml b/_tutorials-FA/102_incipit/step-02/102_incipit_step-02-prefill.xml new file mode 100644 index 00000000..fa186612 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-02/102_incipit_step-02-prefill.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/_tutorials-FA/102_incipit/step-02/102_incipit_step-02.xml b/_tutorials-FA/102_incipit/step-02/102_incipit_step-02.xml new file mode 100644 index 00000000..1b67c1a4 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-02/102_incipit_step-02.xml @@ -0,0 +1,25 @@ + + + + + March + + + + + + + + + + + + + + + + + + + + diff --git a/_tutorials-FA/102_incipit/step-03/102_incipit_step-03-desc.html b/_tutorials-FA/102_incipit/step-03/102_incipit_step-03-desc.html new file mode 100644 index 00000000..6654eda4 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-03/102_incipit_step-03-desc.html @@ -0,0 +1,9 @@ + +
+

گام سوم: تنظیم یک <measure> (میزان) با یک <staff> و <layer> خالی.

+

آفرین! شما اطلاعات فراداده لازم درباره سازماندهی پارتیتور و خط حامل را تعریف کردید. در راه کدگذاری اولین نت ملودی‌مان، باید "محیط" مناسب برای آن نت را آماده کنید؛ یعنی میزان، خط حامل و لایه (بخش صدایی).

+

در MEI، المنت <section> به عنوان ظرفی برای المنت‌های <measure> عمل می‌کند و دقیقاً بعد از تعریف پارتیتور (<scoreDef>) قرار می‌گیرد. المنت‌های <measure> می‌توانند حاوی خطوط حامل متعدد (<staff>) باشند که هر یک می‌توانند لایه‌ها (بخش‌های صدایی) متعدد (<layer>) داشته باشند. المنت <layer> به عنوان المنت والد برای المنت‌های <note> در مرحله بعدی خواهد بود.

+

برای نشان دادن موقعیت شماره‌گذاری شده میزان‌ها، خطوط حامل یا لایه‌ها، می‌توان از خصیصه @n استفاده کرد.

+

میزان آفتاکت را بنویسید: در ویرایشگر، یک المنت <section> وارد کنید. داخل <section>، یک المنت <measure> خالی اضافه کنید و شماره میزان آفتاکت را "0" بگذارید. یک المنت فرزند <staff> به المنت <measure> اضافه کنید و شماره آن را "1" بگذارید (اولین خط حامل در میزان ۰). سپس یک المنت فرزند <layer> بدون شماره به المنت <staff> اضافه کنید.

+

پی‌نوشت: با توجه به اطلاعات لازم در scoreDef و section/measure، حالا فایل میتواند رندر شود. شما می‌توانید با مقادیر خصیصه‌های <scoreDef> و <staffDef> بازی کنید تا ببینید که چگونه بر رندر تاثیر می‌گذارند.

+
diff --git a/_tutorials-FA/102_incipit/step-03/102_incipit_step-03-prefill.xml b/_tutorials-FA/102_incipit/step-03/102_incipit_step-03-prefill.xml new file mode 100644 index 00000000..4d45ca5c --- /dev/null +++ b/_tutorials-FA/102_incipit/step-03/102_incipit_step-03-prefill.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/_tutorials-FA/102_incipit/step-03/102_incipit_step-03.xml b/_tutorials-FA/102_incipit/step-03/102_incipit_step-03.xml new file mode 100644 index 00000000..4d2d6c2a --- /dev/null +++ b/_tutorials-FA/102_incipit/step-03/102_incipit_step-03.xml @@ -0,0 +1,32 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + +
+ +
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-04/102_incipit_step-04-desc.html b/_tutorials-FA/102_incipit/step-04/102_incipit_step-04-desc.html new file mode 100644 index 00000000..3afbaf4f --- /dev/null +++ b/_tutorials-FA/102_incipit/step-04/102_incipit_step-04-desc.html @@ -0,0 +1,16 @@ + +
+

گام چهارم: کدگذاری اولین نت عبارت آغازین.

+

پس از آماده‌سازی ساختار میزان آفتاکت در مرحله قبل، اکنون آماده هستید تا اولین نت این ملودی را کدگذاری کنید. در MEI، نت‌ها قرار است رویدادی را با زیروبمی بخصوص توصیف کنند. که در المنت‌های <note> کدگذاری می‌شوند. المنت‌های <note> می‌توانند فرزندان المنت <layer> باشند. شما می‌توانید ویژگی‌های اصلی نت مانند نام نت و کشش زمانی را با استفاده از خصیصه‌های زیر در <note> مشخص کنید:

+ +

در ویرایشگر زیر، اولین نت این مثال را در لایه خالی آفتاکت که در مرحله قبل ایجاد کرده‌اید، اضافه کنید. اولین نت، G4 (مقدار pname: “g”، oct: “4”) با ارزش زمانی چنگ (مقدار dur: “8”) است. اگر نیاز بود، می‌توانید پیش‌نمایش رندر فعلی را بررسی کنید.

+
diff --git a/_tutorials-FA/102_incipit/step-04/102_incipit_step-04-prefill.xml b/_tutorials-FA/102_incipit/step-04/102_incipit_step-04-prefill.xml new file mode 100644 index 00000000..1da358e9 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-04/102_incipit_step-04-prefill.xml @@ -0,0 +1,14 @@ + + + + + +
+ + + + + + + +
diff --git a/_tutorials-FA/102_incipit/step-04/102_incipit_step-04.xml b/_tutorials-FA/102_incipit/step-04/102_incipit_step-04.xml new file mode 100644 index 00000000..5942f237 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-04/102_incipit_step-04.xml @@ -0,0 +1,34 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-05/102_incipit_step-05-desc.html b/_tutorials-FA/102_incipit/step-05/102_incipit_step-05-desc.html new file mode 100644 index 00000000..54e15b32 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-05/102_incipit_step-05-desc.html @@ -0,0 +1,8 @@ +
+

مرحله پنجم: در این مرحله برای تلفیق آنچه در دو مرحله گذشته یاد گرفته‌اید،  هم ساختار میزان بعدی و هم نت دوم ملودی نمونه را رمزگذاری خواهید کرد.

+ +

در ویرایشگر زیر، بعد از میزانی که تابحال نوشته اید، یک المنت <measure> دیگر اضافه کنید + (@n="1") به همراه حامل (برای حامل هم: @n="1") با یک لایه صدایی (<layer>). نت دوم مثال (یک نت می‌بمل سیاه E-flat 4) را به این میزان جدید اضافه کنید. نگران ناقص بودن این میزان (باتوجه به میزان‌نما) نباشید –در مراحل بعدی کامل خواهد شد.

+ +

پ.ن: رمزگذاری به محض وارد کردن نت جدید نمایش داده می‌شود.

+
diff --git a/_tutorials-FA/102_incipit/step-05/102_incipit_step-05-prefill.xml b/_tutorials-FA/102_incipit/step-05/102_incipit_step-05-prefill.xml new file mode 100644 index 00000000..d09d6236 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-05/102_incipit_step-05-prefill.xml @@ -0,0 +1,10 @@ +
+ + + + + + + + +
diff --git a/_tutorials-FA/102_incipit/step-05/102_incipit_step-05.xml b/_tutorials-FA/102_incipit/step-05/102_incipit_step-05.xml new file mode 100644 index 00000000..af06f205 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-05/102_incipit_step-05.xml @@ -0,0 +1,41 @@ + + + + + March + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-06/102_incipit_step-06-desc.html b/_tutorials-FA/102_incipit/step-06/102_incipit_step-06-desc.html new file mode 100644 index 00000000..e119e850 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-06/102_incipit_step-06-desc.html @@ -0,0 +1,8 @@ +
+

مرحله ششم: رمزگذاری گروهی از نت‌های به هم پیوسته.

+ +

عالی! شما نت اول از اولین میزان کامل را رمزگذاری کردید. دو نت بعدی ملودی، با یک خط شاهین (beam) به هم وصل شده‌اند. برای بیان این در MEI، باید از المنت <beam> استفاده کنید. + <beam> یک ظرف برای مجموعه‌ای از رویدادهای صریحا بهم پیوسته (مانند نت‌ها، سکوت‌ها یا آکوردها) است که در بازه‌ی یک میزان میزان شروع می‌شوند و پایان می‌یابند.

+ +

در ویرایشگر زیر، لطفاً یک المنت <beam> در محل مشخص شده اضافه کنید و سپس دو المنت فرزند <note> (می‌بمل و سل) را جداگانه -داخل آن- اضافه کنید. حتماً مقادیر ویژگی‌های مربوطه را بر روی المنت‌های <note> قرار دهید.

+
\ No newline at end of file diff --git a/_tutorials-FA/102_incipit/step-06/102_incipit_step-06-prefill.xml b/_tutorials-FA/102_incipit/step-06/102_incipit_step-06-prefill.xml new file mode 100644 index 00000000..0d79010f --- /dev/null +++ b/_tutorials-FA/102_incipit/step-06/102_incipit_step-06-prefill.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_tutorials-FA/102_incipit/step-06/102_incipit_step-06.xml b/_tutorials-FA/102_incipit/step-06/102_incipit_step-06.xml new file mode 100644 index 00000000..99f4ad15 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-06/102_incipit_step-06.xml @@ -0,0 +1,45 @@ + + + + + March + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-07/102_incipit_step-07-desc.html b/_tutorials-FA/102_incipit/step-07/102_incipit_step-07-desc.html new file mode 100644 index 00000000..567ac24e --- /dev/null +++ b/_tutorials-FA/102_incipit/step-07/102_incipit_step-07-desc.html @@ -0,0 +1,8 @@ +
+

مرحله هفتم: رمزگذاری نت‌های نقطه‌دار.

+ +

دو نت بعدی در ملودی، الگوی ریتمیک جدیدی دارند: یک نت سیاه نقطه‌دار و یک چنگ. برای رمزگذاری یک نت نقطه‌دار، باید از خصیصه @dots در المنت + <note> استفاده کنید و تعداد نقاط را به عنوان مقدار خصیصه قرار دهید، به عنوان مثال برای یک نقطه:“1” یا برای دو نقطه:;“2” +

+

لطفاً بقیه میزان (@n=1) را در ویرایشگر زیر رمزگذاری کنید و دو المنت <note> با ارزشهای زمانی مختلف (سیاه نقطه‌دار، چنگ) را درون المنت <beam> که در مرحله قبل اضافه کرده‌اید، اضافه کنید.

+
diff --git a/_tutorials-FA/102_incipit/step-07/102_incipit_step-07-prefill.xml b/_tutorials-FA/102_incipit/step-07/102_incipit_step-07-prefill.xml new file mode 100644 index 00000000..b04174a0 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-07/102_incipit_step-07-prefill.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/_tutorials-FA/102_incipit/step-07/102_incipit_step-07.xml b/_tutorials-FA/102_incipit/step-07/102_incipit_step-07.xml new file mode 100644 index 00000000..af6e2059 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-07/102_incipit_step-07.xml @@ -0,0 +1,47 @@ + + + + + March + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-08/102_incipit_step-08-desc.html b/_tutorials-FA/102_incipit/step-08/102_incipit_step-08-desc.html new file mode 100644 index 00000000..872c9d1d --- /dev/null +++ b/_tutorials-FA/102_incipit/step-08/102_incipit_step-08-desc.html @@ -0,0 +1,10 @@ +direction: rtl
+

مرحله هشتم: رمزگذاری کامل میزان بعدی برای مرور همه نکاتی که در این مراحل آموخته‌اید.

+ +

لطفاً میزان بعدی را (@n=2) در ویرایشگر زیر رمزگذاری کنید. یک المنت + <measure> و المنت <staff> و یک المنت <layer> که شامل چهار المنت فرزند است: یک نت سیاه <note> (E-flat 4)، یک + <beam> با دو نت چنگ <note> (E-flat 4، G4) و یک نت سیاه نقطه‌دار + <note> (B-flat 4) با یک نت چنگ <note> (G4).

+ +

به‌عنوان یک چالش بیشتر، این بار کادر ویرایشگر هیچ محتوای پیش‌فرضی ندارد، بنابراین شما هیچ راهنمایی از رمزگذاری میزان‌های قبلی دریافت نمی‌کنید. البته اگر مطئن نبودید، می‌توانید به نکات راهنما که در زیر کادر ویرایشگر نمایش داده می‌شود توجه کنید.

+
diff --git a/_tutorials-FA/102_incipit/step-08/102_incipit_step-08-prefill.xml b/_tutorials-FA/102_incipit/step-08/102_incipit_step-08-prefill.xml new file mode 100644 index 00000000..44fbfea5 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-08/102_incipit_step-08-prefill.xml @@ -0,0 +1 @@ + diff --git a/_tutorials-FA/102_incipit/step-08/102_incipit_step-08.xml b/_tutorials-FA/102_incipit/step-08/102_incipit_step-08.xml new file mode 100644 index 00000000..a8c8ae33 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-08/102_incipit_step-08.xml @@ -0,0 +1,60 @@ + + + + + March + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-09/102_incipit_step-09-desc.html b/_tutorials-FA/102_incipit/step-09/102_incipit_step-09-desc.html new file mode 100644 index 00000000..2898704f --- /dev/null +++ b/_tutorials-FA/102_incipit/step-09/102_incipit_step-09-desc.html @@ -0,0 +1,15 @@ + +
+

مرحله نهم: رمزگذاری نت‌های دو میزان آخر ملودی.

+ +

عالی، شما میزان دوم را رمزگذاری کردید! حالا کار را کمی سخت‌تر می‌کنیم: دو میزان آخر منتظر شما هستند! اما نگران نباشید: این درس دیگر از این مرحله سخت‌تر نخواهد شد. قول!

+ +

برای رمزگذاری دو میزان آخر، باید یک المنت دیگر را بشناسید: سکوت، با المنت <rest> و ویژگی @dur مشابه المنت + <note> رمزگذاری می‌شود. اما، بدیهی است که<rest>  خصیصه‌های @pname و @oct را ندارد. شما می‌توانید المنت‌های اضافی، مانند دینامیک، خطوط اتصال یا تاکیدها را در این مرحله نادیده بگیرید زیرا به صورت جداگانه در مراحل نهایی بعدی بررسی خواهند شد.

+ +

لطفاً دو میزان نهایی را (@n=3 & @n=4) در ویرایشگر زیر رمزگذاری کنید. المنت‌های <measure>، <staff> و + <layer> و همچنین المنت‌های متناظر <note>، + <beam> یا <rest> را اضافه کنید. یادتان باشد که المنت <beam> میتواند المنت‌های <note> را گروه‌بندی کند.

+ +

در این مرحله هم هیچ محتوای پیش‌فرضی در کادر ویرایشگر وجود ندارد. هروقت احساس کردید گیج شده‌اید، سعی کنید به نکات راهنما (زیر کادر ویرایشگر) توجه کنید. 

+
diff --git a/_tutorials-FA/102_incipit/step-09/102_incipit_step-09-prefill.xml b/_tutorials-FA/102_incipit/step-09/102_incipit_step-09-prefill.xml new file mode 100644 index 00000000..44fbfea5 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-09/102_incipit_step-09-prefill.xml @@ -0,0 +1 @@ + diff --git a/_tutorials-FA/102_incipit/step-09/102_incipit_step-09.xml b/_tutorials-FA/102_incipit/step-09/102_incipit_step-09.xml new file mode 100644 index 00000000..bc8a5e4e --- /dev/null +++ b/_tutorials-FA/102_incipit/step-09/102_incipit_step-09.xml @@ -0,0 +1,86 @@ + + + + + March + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-10/102_incipit_step-10-desc.html b/_tutorials-FA/102_incipit/step-10/102_incipit_step-10-desc.html new file mode 100644 index 00000000..969e5117 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-10/102_incipit_step-10-desc.html @@ -0,0 +1,17 @@ +
+

مرحله دهم: افزودن علامت‌های اجرایی (آرتیکولاسیون).

+ +

عالی! شما کل خط ملودی را رمزگذاری کرده‌اید. حالا، بیایید المنت‌های اضافی را که جا مانده‌اند (مانند دینامیک‌، خطوط اتصال یا تاکیدها) مرحله به مرحله بررسی کنیم.

+ +

علائم اجرایی، یعنی نشانه‌هایی از چگونگی اجرای یک نت یا آکورد، می‌توانند با المنت‌های <artic> که به عنوان فرزندهای المنت‌های <note> اعمال می‌شوند، رمزگذاری شوند. + خصیصه‌های زیر در المنت <artic> باید در این مرحله از درس استفاده شود:

+ + +

لطفاً المنت‌های <note> را که در ملودی علامت‌های اجرایی به آنها اختصاص داده شده است پیدا کنید. (آکسان‌ها بر روی نت‌های چنگ نقطه‌دار در میزان 1 و 2 و همچنین بر روی نت چنگ در میزان 3)، و سپس هر علامت اجرایی را با استفاده از المنت <artic> و ویژگی‌های متناظر رمزگذاری کنید.

+ +
diff --git a/_tutorials-FA/102_incipit/step-10/102_incipit_step-10-prefill.xml b/_tutorials-FA/102_incipit/step-10/102_incipit_step-10-prefill.xml new file mode 100644 index 00000000..42e4a767 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-10/102_incipit_step-10-prefill.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_tutorials-FA/102_incipit/step-10/102_incipit_step-10.xml b/_tutorials-FA/102_incipit/step-10/102_incipit_step-10.xml new file mode 100644 index 00000000..6046bdb6 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-10/102_incipit_step-10.xml @@ -0,0 +1,92 @@ + + + + + March + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-11/102_incipit_step-11-desc.html b/_tutorials-FA/102_incipit/step-11/102_incipit_step-11-desc.html new file mode 100644 index 00000000..6d32b826 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-11/102_incipit_step-11-desc.html @@ -0,0 +1,42 @@ +
+

گام یازدهم: اضافه کردن علامت دینامیک به کدگذاری عبارت آغازین نمونه.

+ +

علائم مربوط به دینامیک (نوانس) با المنت <dynam> تعریف می‌شوند. المنت + <dynam> می‌تواند برای علائم متنی دینامیک ناگهانی یا پیوسته مانند “p”، + “mf”، یا “cresc. poco a poco” استفاده شود. این مقادیر به صورت متن ساده بین تگ‌های باز + و بسته المنت <dynam> قرار می‌گیرند، مانند <dynam>pp</dynam>.

+ +

برخلاف علائم آرتیکولاسیون، المنت <dynam> یک "رویدادِ کنترل‌گر" است (مانند المنتهایی چون + دینامیک‌ها، کشش‌ها، علائم فراز، علائم پدال و غیره) که وابسته به رویدادهای دیگر (مانند نت‌ها یا سکوت‌ها) هستند. در کل، + رویدادهای کنترل‌گر به عنوان فرزند المنتهایی که برای کنترل آنها طراحی شده‌اند کدگذاری نمی‌شوند. به عبارت + ساده‌تر، در بیشتر موارد این رویدادها خارج از المنت staff قرار می‌گیرند.

+ +

روش‌های مختلفی برای اشاره به المنت‌های <note> یا <rest> (یا هر رویداد دیگر) + از یک "رویدادِ کنترل‌گر" مانند <dynam> وجود دارد:

+ + + +

در این مثال، خصیصه @tstamp برای مشخص کردن موقعیت شروع علامت دینامیک استفاده شده است. + @tstamp می‌تواند برای کدگذاری زمان آغاز در قالب زمان موسیقی، یعنی ضرب‌ها که در میزان‌نما نوشته شده + است، استفاده شود.

+ +

خصیصه‌های زیر باید در المنت <dynam> استفاده شوند:

+ + +

لطفاً المنت‌های <note> را در نمونه‌ای که دینامیک‌ها به آن‌ها اختصاص داده + شده است پیدا کنید. یک المنت هم‌رده <dynam> به المنت <staff> مربوطه بیفزایید و خصیصه‌های مورد نظر (@staff، @tstamp، @place) را اعمال کنید. فراموش + نکنید که علامت ff باید بین تگ‌های باز و بسته <dynam> درج شود.

+
diff --git a/_tutorials-FA/102_incipit/step-11/102_incipit_step-11-prefill.xml b/_tutorials-FA/102_incipit/step-11/102_incipit_step-11-prefill.xml new file mode 100644 index 00000000..5e928f44 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-11/102_incipit_step-11-prefill.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_tutorials-FA/102_incipit/step-11/102_incipit_step-11.xml b/_tutorials-FA/102_incipit/step-11/102_incipit_step-11.xml new file mode 100644 index 00000000..68b79953 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-11/102_incipit_step-11.xml @@ -0,0 +1,93 @@ + + + + + March + + + + + + + + + + + + + +
+ + + + + + + + ff + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
diff --git a/_tutorials-FA/102_incipit/step-12/102_incipit_step-12-desc.html b/_tutorials-FA/102_incipit/step-12/102_incipit_step-12-desc.html new file mode 100644 index 00000000..a9a59195 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-12/102_incipit_step-12-desc.html @@ -0,0 +1,40 @@ + +
+

گام دوازدهم: اضافه کردن آخرین جزئیات جامانده در ملودی: اسلر در میزان سوم.

+ +

دو روش مختلف برای کدگذاری اسلر در MEI وجود دارد:

+
    +
  1. خصیصه @slur روی المنت <note> یا <chord> با مقدار + i=initial، m=medial یا t=terminal.
  2. +
  3. یک المنت جداگانه <slur>.
  4. +
+ +

در این گام آخر، از روش دوم استفاده خواهید کرد: مانند دینامیک‌ها، المنت‌های <slur> رویدادهای + کنترل‌گر هستند. آنها فرزندان رویدادهای مربوطه‌ای که باید کنترل کنند نیستند؛ بلکه در اکثر موارد خارج از المنت‌های + staff قرار می‌گیرند.

+ +

برای مشخص کردن نقطه شروع و پایان اسلر، می‌توان به @xml:id المنت مربوطه، مانند + <note> یا <chord>، ارجاع داد. خصیصه @xml:id شناسه‌ای است که + شامل یک رشته‌ی متنی دلخواه ولی منحصربه‌فرد است و نام‌گذاری یک المنت را در سراسر سند تنظیم می‌کند و به این ترتیب + امکان ایجاد پیوند بین المنت‌ها و منابع دیگر را فراهم می‌کند. برای المنت‌های <slur>، می‌توان + با استفاده از خصیصه‌های @startid و @endid به @xml:id یک المنت ارجاع داد. +

+ +

علاوه بر @startid و @endid، خصیصه‌های زیر باید در این مرحله استفاده شوند:

+ + +

لطفاً اولین و آخرین نت را که اسلر به آنها متصل است (در داخل اولین المنت + <beam> میزان سوم) شناسایی کنید و @xml:id به هر دو المنت + <note> اضافه کنید. برای این مثال می‌توانید از مقادیر “d1e4614” و + “d1e4615” استفاده کنید. یک المنت <slur> بعد از تگ بسته المنت + <staff> اضافه کرده و خصیصه‌های مربوطه را اعمال کنید.

+
\ No newline at end of file diff --git a/_tutorials-FA/102_incipit/step-12/102_incipit_step-12-prefill.xml b/_tutorials-FA/102_incipit/step-12/102_incipit_step-12-prefill.xml new file mode 100644 index 00000000..e2b89b37 --- /dev/null +++ b/_tutorials-FA/102_incipit/step-12/102_incipit_step-12-prefill.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/_tutorials-FA/102_incipit/step-12/102_incipit_step-12.xml b/_tutorials-FA/102_incipit/step-12/102_incipit_step-12.xml new file mode 100644 index 00000000..2f379bfb --- /dev/null +++ b/_tutorials-FA/102_incipit/step-12/102_incipit_step-12.xml @@ -0,0 +1,94 @@ + + + + + March + + + + + + + + + + + + + +
+ + + + + + + ff + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
diff --git a/_tutorials-FA/103_chords/103_Chords.md b/_tutorials-FA/103_chords/103_Chords.md new file mode 100644 index 00000000..22013a9b --- /dev/null +++ b/_tutorials-FA/103_chords/103_Chords.md @@ -0,0 +1,7 @@ +--- +layout: tutorials +type: tutorial +name: "مقدماتی: آکوردها" +fullname: "درسی مختصر درباره آکوردها در MEI" +data: "103_chords.json" +--- diff --git a/_tutorials-FA/103_chords/103_chord-little-lamb.png b/_tutorials-FA/103_chords/103_chord-little-lamb.png new file mode 100644 index 00000000..4ed53a35 Binary files /dev/null and b/_tutorials-FA/103_chords/103_chord-little-lamb.png differ diff --git a/_tutorials-FA/103_chords/103_chord-sequence.png b/_tutorials-FA/103_chords/103_chord-sequence.png new file mode 100644 index 00000000..60f1e924 Binary files /dev/null and b/_tutorials-FA/103_chords/103_chord-sequence.png differ diff --git a/_tutorials-FA/103_chords/103_chords.json b/_tutorials-FA/103_chords/103_chords.json new file mode 100644 index 00000000..60c137bb --- /dev/null +++ b/_tutorials-FA/103_chords/103_chords.json @@ -0,0 +1,155 @@ +{ + "steps": [ + { + "label":"به MEI خوش آمدید!", + "descFile": "103_chords_step-00-desc.html" + }, + { + "label": "آماده سازی", + "editorLines": 3, + "descFile": "103_chords_step-01-desc.html", + "prefillFile": "103_chords_step-01-prefill.xml", + "xmlFile": "103_chords_step-01.xml", + "xpaths": [ + {"rule": "count(//mei:note) = 3", "renderanyway": false, "hint": "به سه المنت note نیاز دارید."}, + {"rule": "count(//mei:note[1]/@*) = 3 and //mei:note[1]/@pname and //mei:note[1]/@oct and //mei:note[1]/@dur", "renderanyway": false, "hint": "به سه خصیصه روی اولین note نیاز دارید (@pname, @oct, و @dur)."}, + {"rule": "count(//mei:note[2]/@*) = 3 and //mei:note[2]/@pname and //mei:note[2]/@oct and //mei:note[2]/@dur", "renderanyway": false, "hint": "به سه خصیصه روی دومین note نیاز دارید (@pname, @oct، و @dur)."}, + {"rule": "count(//mei:note[3]/@*) = 3 and //mei:note[3]/@pname and //mei:note[3]/@oct and //mei:note[3]/@dur", "renderanyway": false, "hint": "به سه خصیصه روی سومین note نیاز دارید (@pname, @oct، و @dur)."}, + {"rule": "//mei:note/@pname", "renderanyway": false, "hint": "خصیصه @pname مقادیر بین 'a' تا 'g' را می‌پذیرد."}, + {"rule": "//mei:note/@oct", "renderanyway": false, "hint": "خصیصه @oct به مقادیر عددی نیاز دارد."}, + {"rule": "//mei:note/@dur", "renderanyway": false, "hint": "خصیصه @dur مقادیری مانند '1', '2', '4', '8'… را می‌پذیرد."}, + {"rule": "//mei:note[1]/@pname = 'e'", "renderanyway": true, "hint": "خصیصه @pname با مقدار 'e' روی اولین المنت note لازم است."}, + {"rule": "//mei:note[1]/@oct = '4'", "renderanyway": true, "hint": "خصیصه @oct با مقدار '4' روی اولین المنت note لازم است."}, + {"rule": "//mei:note[1]/@dur = '4'", "renderanyway": true, "hint": "خصیصه @dur با مقدار '4' روی اولین المنت note لازم است."}, + {"rule": "//mei:note[2]/@pname = 'g'", "renderanyway": true, "hint": "خصیصه @pname با مقدار 'g' روی دومین المنت note لازم است."}, + {"rule": "//mei:note[2]/@oct = '4'", "renderanyway": true, "hint": "خصیصه @oct با مقدار '4' روی دومین المنت note لازم است."}, + {"rule": "//mei:note[2]/@dur = '4'", "renderanyway": true, "hint": "خصیصه @dur با مقدار '4' روی دومین المنت note لازم است."}, + {"rule": "//mei:note[3]/@pname = 'c'", "renderanyway": true, "hint": "خصیصه @pname با مقدار 'c' روی سومین المنت note لازم است."}, + {"rule": "//mei:note[3]/@oct = '5'", "renderanyway": true, "hint": "خصیصه @oct با مقدار '5' روی سومین المنت note لازم است."}, + {"rule": "//mei:note[3]/@dur = '4'", "renderanyway": true, "hint": "خصیصه @dur با مقدار '4' روی سومین المنت note لازم است."} + ] + } + , + { + "label":"اولین آکورد", + "editorLines": 5, + "descFile": "103_chords_step-02-desc.html", + "prefillFile": "103_chords_step-02-prefill.xml", + "xmlFile": "103_chords_step-02.xml", + "xpaths": [ + {"rule": "count(//mei:note) = 3", "renderanyway": false, "hint": "به سه المنت note نیاز دارید."}, + {"rule": "//mei:note[1]/@pname and //mei:note[1]/@oct", "renderanyway": true, "hint": "دو خصیصه روی اولین note لازم است (@pname, @oct)."}, + {"rule": "//mei:note[2]/@pname and //mei:note[2]/@oct", "renderanyway": true, "hint": "دو خصیصه روی دومین note لازم است (@pname, @oct)."}, + {"rule": "//mei:note[3]/@pname and //mei:note[3]/@oct", "renderanyway": true, "hint": "دو خصیصه روی سومین note لازم است (@pname, @oct)."}, + {"rule": "//mei:note/@pname", "renderanyway": false, "hint": "خصیصه @pname مقادیر بین 'a' تا 'g' را می‌پذیرد."}, + {"rule": "//mei:note/@oct", "renderanyway": false, "hint": "خصیصه @oct به مقادیر عددی نیاز دارد."}, + {"rule": "//mei:note[@pname = 'e' and @oct = '4']", "renderanyway": true, "hint": "یک note نیاز دارید که خصیصه @pname مقدار 'e' و خصیصه @oct مقدار '4' داشته باشد."}, + {"rule": "//mei:note[@pname = 'g' and @oct = '4']", "renderanyway": true, "hint": "یک note نیاز دارید که خصیصه @pname مقدار 'g' و خصیصه @oct مقدار '4' داشته باشد."}, + {"rule": "//mei:note[@pname = 'c' and @oct = '5']", "renderanyway": true, "hint": "یک note نیاز دارید که خصیصه @pname مقدار 'c' و خصیصه @oct مقدار '5' داشته باشد."}, + {"rule": "count(//mei:chord) = 1", "renderanyway": false, "hint": "به یک المنت chord نیاز دارید."}, + {"rule": "//mei:chord/mei:note", "renderanyway": false, "hint": "المنت chord باید همه المنت‌های note را دربر بگیرد."}, + {"rule": "count(//mei:note[1]/@*) = 2", "renderanyway": true, "hint": "روی اولین note تنها به دو خصیصه نیاز دارید (@pname, @oct)."}, + {"rule": "count(//mei:note[2]/@*) = 2", "renderanyway": true, "hint": "روی دومین note تنها به دو خصیصه نیاز دارید (@pname, @oct)."}, + {"rule": "count(//mei:note[3]/@*) = 2", "renderanyway": true, "hint": "روی سومین note تنها به دو خصیصه نیاز دارید (@pname, @oct)."}, + {"rule": "count(//mei:chord/@*) = 1 and //mei:chord/@dur", "renderanyway": true, "hint": "یک خصیصه روی chord لازم دارید (@dur)."}, + {"rule": "//mei:chord/@dur", "renderanyway": true, "hint": "خصیصه @dur مقادیری مانند '1', '2', '4', '8'… را می‌پذیرد."}, + {"rule": "//mei:chord/@dur = '4'", "renderanyway": true, "hint": "خصیصه @dur باید مقدار '4' روی المنت chord داشته باشد."} + ] + }, + { + "label": "یک زنجیره آکوریِ ساده", + "editorLines": 20, + "descFile": "103_chords_step-03-desc.html", + "prefillFile": "103_chords_step-03-prefill.xml", + "xmlFile": "103_chords_step-03.xml", + "xpaths": [ + {"rule": "count(//mei:chord) = 4", "renderanyway": true, "hint": "به چهار المنت chord نیاز دارید."}, + {"rule": "count(//mei:chord[1]/@*) = 1 and //mei:chord[1]/@dur", "renderanyway": true, "hint": "به یک خصیصه روی اولین آکورد (@dur) نیاز دارید."}, + {"rule": "//mei:chord[1]/@dur = '4'", "renderanyway": true, "hint": "روی اولین آکورد، به یک خصیصه @dur با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[2]/@*) = 1 and //mei:chord[2]/@dur", "renderanyway": true, "hint": "به یک خصیصه روی دومین آکورد (@dur) نیاز دارید."}, + {"rule": "//mei:chord[2]/@dur = '4'", "renderanyway": true, "hint": "روی دومین آکورد، به یک خصیصه @dur با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[3]/@*) = 1 and //mei:chord[3]/@dur", "renderanyway": true, "hint": "به یک خصیصه روی سومین آکورد (@dur) نیاز دارید."}, + {"rule": "//mei:chord[3]/@dur = '4'", "renderanyway": true, "hint": "روی سومین آکورد، به یک خصیصه @dur با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[4]/@*) = 1 and //mei:chord[4]/@dur", "renderanyway": true, "hint": "به یک خصیصه روی آخرین آکورد (@dur) نیاز دارید."}, + {"rule": "//mei:chord[4]/@dur = '4'", "renderanyway": true, "hint": "روی آخرین آکورد، به یک خصیصه @dur با مقدار 4 نیاز دارید."}, + + {"rule": "count(//mei:chord[1]/mei:note) = 3", "renderanyway": true, "hint": "به سه المنت note برای اولین آکورد نیاز دارید."}, + {"rule": "count(//mei:chord[1]/mei:note[1]/@*) = 2 and //mei:chord[1]/mei:note[1]/@pname and //mei:chord[1]/mei:note[1]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی اولین نت (@pname, @oct) از اولین آکورد نیاز دارید."}, + {"rule": "//mei:chord[1]/mei:note[@pname = 'e' and @oct = '4']", "renderanyway": true, "hint": "در اولین آکورد، به نتی با خصیصه @pname با مقدار e و خصیصه @oct با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[1]/mei:note[2]/@*) = 2 and //mei:chord[1]/mei:note[2]/@pname and //mei:chord[1]/mei:note[2]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی دومین نت (@pname, @oct) از اولین آکورد نیاز دارید."}, + {"rule": "//mei:chord[1]/mei:note[@pname = 'g' and @oct = '4']", "renderanyway": true, "hint": "در اولین آکورد، به نتی با خصیصه @pname با مقدار g و خصیصه @oct با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[1]/mei:note[3]/@*) = 2 and //mei:chord[1]/mei:note[3]/@pname and //mei:chord[1]/mei:note[3]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی سومین نت (@pname, @oct) از اولین آکورد نیاز دارید."}, + {"rule": "//mei:chord[1]/mei:note[@pname = 'c' and @oct = '5']", "renderanyway": true, "hint": "در اولین آکورد، به نتی با خصیصه @pname با مقدار c و خصیصه @oct با مقدار 5 نیاز دارید."}, + + {"rule": "count(//mei:chord[2]/mei:note) = 3", "renderanyway": true, "hint": "به سه المنت note برای دومین آکورد نیاز دارید."}, + {"rule": "count(//mei:chord[2]/mei:note[1]/@*) = 2 and //mei:chord[2]/mei:note[1]/@pname and //mei:chord[2]/mei:note[1]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی اولین نت (@pname, @oct) از دومین آکورد نیاز دارید."}, + {"rule": "//mei:chord[2]/mei:note[@pname = 'f' and @oct = '4']", "renderanyway": true, "hint": "در دومین آکورد، به نتی با خصیصه @pname با مقدار f و خصیصه @oct با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[2]/mei:note[2]/@*) = 2 and //mei:chord[2]/mei:note[2]/@pname and //mei:chord[2]/mei:note[2]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی دومین نت (@pname, @oct) از دومین آکورد نیاز دارید."}, + {"rule": "//mei:chord[2]/mei:note[@pname = 'a' and @oct = '4']", "renderanyway": true, "hint": "در دومین آکورد، به نتی با خصیصه @pname با مقدار a و خصیصه @oct با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[2]/mei:note[3]/@*) = 2 and //mei:chord[2]/mei:note[3]/@pname and //mei:chord[2]/mei:note[3]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی سومین نت (@pname, @oct) از دومین آکورد نیاز دارید."}, + {"rule": "//mei:chord[2]/mei:note[@pname = 'c' and @oct = '5']", "renderanyway": true, "hint": "در دومین آکورد، به نتی با خصیصه @pname با مقدار c و خصیصه @oct با مقدار 5 نیاز دارید."}, + + {"rule": "count(//mei:chord[3]/mei:note) = 3", "renderanyway": true, "hint": "به سه المنت note برای سومین آکورد نیاز دارید."}, + {"rule": "count(//mei:chord[3]/mei:note[1]/@*) = 2 and //mei:chord[3]/mei:note[1]/@pname and //mei:chord[3]/mei:note[1]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی اولین نت (@pname, @oct) از سومین آکورد نیاز دارید."}, + {"rule": "//mei:chord[3]/mei:note[@pname = 'e' and @oct = '5']", "renderanyway": true, "hint": "در سومین آکورد، به نتی با خصیصه @pname با مقدار e و خصیصه @oct با مقدار 5 نیاز دارید."}, + {"rule": "count(//mei:chord[3]/mei:note[2]/@*) = 2 and //mei:chord[3]/mei:note[2]/@pname and //mei:chord[3]/mei:note[2]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی دومین نت (@pname, @oct) از سومین آکورد نیاز دارید."}, + {"rule": "//mei:chord[3]/mei:note[@pname = 'g' and @oct = '5']", "renderanyway": true, "hint": "در سومین آکورد، به نتی با خصیصه @pname با مقدار g و خصیصه @oct با مقدار 5 نیاز دارید."}, + {"rule": "count(//mei:chord[3]/mei:note[3]/@*) = 2 and //mei:chord[3]/mei:note[3]/@pname and //mei:chord[3]/mei:note[3]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی سومین نت (@pname, @oct) از سومین آکورد نیاز دارید."}, + {"rule": "//mei:chord[3]/mei:note[@pname = 'c' and @oct = '6']", "renderanyway": true, "hint": "در سومین آکورد، به نتی با خصیصه @pname با مقدار c و خصیصه @oct با مقدار 6 نیاز دارید."}, + + {"rule": "count(//mei:chord[4]/mei:note) = 3", "renderanyway": true, "hint": "به سه المنت note برای آخرین آکورد نیاز دارید."}, + {"rule": "count(//mei:chord[4]/mei:note[1]/@*) = 2 and //mei:chord[4]/mei:note[1]/@pname and //mei:chord[4]/mei:note[1]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی اولین نت (@pname, @oct) از آخرین آکورد نیاز دارید."}, + {"rule": "//mei:chord[4]/mei:note[@pname = 'f' and @oct = '5']", "renderanyway": true, "hint": "در آخرین آکورد، به نتی با خصیصه @pname با مقدار f و خصیصه @oct با مقدار 5 نیاز دارید."}, + {"rule": "count(//mei:chord[4]/mei:note[2]/@*) = 2 and //mei:chord[4]/mei:note[2]/@pname and //mei:chord[4]/mei:note[2]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی دومین نت (@pname, @oct) از آخرین آکورد نیاز دارید."}, + {"rule": "//mei:chord[4]/mei:note[@pname = 'a' and @oct = '5']", "renderanyway": true, "hint": "در آخرین آکورد، به نتی با خصیصه @pname با مقدار a و خصیصه @oct با مقدار 5 نیاز دارید."}, + {"rule": "count(//mei:chord[4]/mei:note[3]/@*) = 2 and //mei:chord[4]/mei:note[3]/@pname and //mei:chord[4]/mei:note[3]/@oct", "renderanyway": true, "hint": "به دو خصیصه روی سومین نت (@pname, @oct) از آخرین آکورد نیاز دارید."}, + {"rule": "//mei:chord[4]/mei:note[@pname = 'c' and @oct = '6']", "renderanyway": true, "hint": "در آخرین آکورد، به نتی با خصیصه @pname با مقدار c و خصیصه @oct با مقدار 6 نیاز دارید."} + ] + } + , + { + "label": "یک زنجیره آکوریِ بسط یافته", + "editorLines": 35, + "descFile": "103_chords_step-04-desc.html", + "prefillFile": "103_chords_step-04-prefill.xml", + "xmlFile": "103_chords_step-04.xml", + "xpaths": [ + {"rule": "count(//mei:chord) = 7", "renderanyway": true, "hint": "المنت‌های chord باید هفت عدد باشند."}, + {"rule": "count(//mei:chord[1]/@*) = 2 and //mei:chord[1]/@dur and //mei:chord[1]/@dots", "renderanyway": true, "hint": "شما به دو خصیصه در المنت اول chord نیاز دارید (@dur، @dots)."}, + {"rule": "//mei:chord[1]/@dur = '4'", "renderanyway": true, "hint": "شما به یک خصیصه @dur با مقدار 4 در المنت اول chord نیاز دارید."}, + {"rule": "//mei:chord[1]/@dots = '1'", "renderanyway": true, "hint": "شما به یک خصیصه @dots با مقدار 1 در المنت اول chord نیاز دارید."}, + {"rule": "count(//mei:chord[2]/@*) = 1 and //mei:chord[2]/@dur", "renderanyway": true, "hint": "شما به یک خصیصه در المنت دوم chord نیاز دارید (@dur)."}, + {"rule": "//mei:chord[2]/@dur = '8'", "renderanyway": true, "hint": "شما به یک خصیصه @dur با مقدار 8 در المنت دوم chord نیاز دارید."}, + {"rule": "count(//mei:chord[3]/@*) = 1 and //mei:chord[3]/@dur", "renderanyway": true, "hint": "شما به یک خصیصه در المنت سوم chord نیاز دارید (@dur)."}, + {"rule": "//mei:chord[3]/@dur = '4'", "renderanyway": true, "hint": "شما به یک خصیصه @dur با مقدار 4 در المنت سوم chord نیاز دارید."}, + {"rule": "count(//mei:chord[4]/@*) = 1 and //mei:chord[4]/@dur", "renderanyway": true, "hint": "شما به یک خصیصه در المنت چهارم chord نیاز دارید (@dur)."}, + {"rule": "//mei:chord[4]/@dur = '4'", "renderanyway": true, "hint": "شما به یک خصیصه @dur با مقدار 4 در المنت چهارم chord نیاز دارید."}, + {"rule": "count(//mei:chord[5]/@*) = 1 and //mei:chord[5]/@dur", "renderanyway": true, "hint": "شما به یک خصیصه در المنت پنجم chord نیاز دارید (@dur)."}, + {"rule": "//mei:chord[5]/@dur = '4'", "renderanyway": true, "hint": "شما به یک خصیصه @dur با مقدار 4 در المنت پنجم chord نیاز دارید."}, + {"rule": "count(//mei:chord[6]/@*) = 1 and //mei:chord[6]/@dur", "renderanyway": true, "hint": "شما به یک خصیصه در المنت ششم chord نیاز دارید (@dur)."}, + {"rule": "//mei:chord[6]/@dur = '4'", "renderanyway": true, "hint": "شما به یک خصیصه @dur با مقدار 4 در المنت ششم chord نیاز دارید."}, + {"rule": "count(//mei:chord[7]/@*) = 1 and //mei:chord[7]/@dur", "renderanyway": true, "hint": "شما به یک خصیصه در المنت آخر chord نیاز دارید (@dur)."}, + {"rule": "//mei:chord[7]/@dur = '2'", "renderanyway": true, "hint": "شما به یک خصیصه @dur با مقدار 2 در المنت آخر chord نیاز دارید."}, + {"rule": "count(//mei:chord[1]/mei:note) = 3", "renderanyway": true, "hint": "شما به سه المنت note در المنت اول chord نیاز دارید."}, + {"rule": "count(//mei:chord[1]/mei:note[1]/@*) = 2 and //mei:chord[1]/mei:note[1]/@pname and //mei:chord[1]/mei:note[1]/@oct", "renderanyway": true, "hint": "شما به دو خصیصه در اولین المنت note از المنت اول chord نیاز دارید (@pname، @oct)."}, + {"rule": "//mei:chord[1]/mei:note[@pname = 'g' and @oct = '4']", "renderanyway": true, "hint": "در المنت اول chord، شما به یک note با خصیصه @pname با مقدار g و خصیصه @oct با مقدار 4 نیاز دارید."}, + {"rule": "count(//mei:chord[1]/mei:note[2]/@*) = 2 and //mei:chord[1]/mei:note[2]/@pname and //mei:chord[1]/mei:note[2]/@oct", "renderanyway": true, "hint": "شما به دو خصیصه در دومین المنت note از المنت اول chord نیاز دارید (@pname، @oct)."}, + {"rule": "//mei:chord[1]/mei:note[@pname = 'c' and @oct = '5']", "renderanyway": true, "hint": "در المنت اول chord، شما به یک note با خصیصه @pname با مقدار c و خصیصه @oct با مقدار 5 نیاز دارید."}, + {"rule": "count(//mei:chord[1]/mei:note[3]/@*) = 2 and //mei:chord[1]/mei:note[3]/@pname and //mei:chord[1]/mei:note[3]/@oct", "renderanyway": true, "hint": "شما به دو خصیصه در سومین المنت note از المنت اول chord نیاز دارید (@pname، @oct)."}, + {"rule": "//mei:chord[1]/mei:note[@pname = 'e' and @oct = '5']", "renderanyway": true, "hint": "در المنت اول chord، شما به یک note با خصیصه @pname با مقدار e و خصیصه @oct با مقدار 5 نیاز دارید."} + ] + } + + ], + "end":"103_chords_end.html", + "resp":[ + { + "name":"Stefan Münnich", + "affiliation":"Anton Webern Gesamtausgabe | University of Basel" + }, + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +} diff --git a/_tutorials-FA/103_chords/103_chords_end.html b/_tutorials-FA/103_chords/103_chords_end.html new file mode 100644 index 00000000..c72d8a35 --- /dev/null +++ b/_tutorials-FA/103_chords/103_chords_end.html @@ -0,0 +1,12 @@ +
+

تبریک!

+

شما این آموزش مقدماتی در مورد آکوردها در MEI را به پایان رسانده‌اید و باید بتوانید توالی‌های ساده‌ای از آکوردها را با MEI کدگذاری کنید. +

+

+ البته، موارد زیادی برای یک فایل جامع MEI مورد نیاز است – ما تمام اطلاعات ساختاری در مورد المنت‌های measure و staff را کنار گذاشته‌ایم، و همینطور، باید یاد بگیرید که چگونه میزان‌نما، مایه‌نما و کلیدهای نت‌نویسی را تنظیم کنید. به عنوان مراحل بعدی در فراگیری MEI، پیشنهاد می‌کنیم آموزش ما در مورد سکوت‌ها را دنبال کنید. + البته، همیشه میتوانید برای مرور، به این آموزش‌ها بازگردید. +

+

+ وقتی تا حدودی با MEI آشنا شدید، از شما دعوت می‌کنیم تجربه خود را با جامعه MEI به اشتراک بگذارید و یک آموزش درباره جنبه‌ای از MEI که به آن علاقه‌مندید بنویسید. برای این کار لازم نیست حتماً متخصص باشید – خوب است درس‌ها را در سطوح متفاوتی داشته‌باشیم و خیلی وقت‌ها، پیش رفتن با آموزشی که یک تازه‌وارد نوشته، آسان‌تر از درسی است که یک متخصص نوشته چون ممکن است برای یک متخصص، الفبای موضوع آنقدر بدیهی باشد که اشاره‌ای به آن نکند. ما یک درس در مورد نحوه نوشتن آموزش‌ها داریم که در آن می‌توانید با الگوهای قراردادی نوشتن آموزش‌ها آشنا شوید و به این راحتی عضو فعال جامعه MEI شوید :-) +

+
diff --git a/_tutorials-FA/103_chords/step-00/103_chords_step-00-desc.html b/_tutorials-FA/103_chords/step-00/103_chords_step-00-desc.html new file mode 100644 index 00000000..720683dd --- /dev/null +++ b/_tutorials-FA/103_chords/step-00/103_chords_step-00-desc.html @@ -0,0 +1,13 @@ +
+

در این آموزش، کدگذاری آکوردها را در MEI خواهید آموخت.

+

از آنجایی که مفهوم آکورد (چه در تئوری موسیقی و چه در MEI) بر اساس نت‌ها تعریف می‌شود، توصیه می‌کنیم قبل از این + آموزش با کدگذاری نت‌ها آشنا شوید، مثلاً در درس آموزش سریع. +

+

کدی که می‌نویسید فوراً رندر می‌شود و خروجی، به تغییرات شما واکنش نشان می‌دهد. به این ترتیب، می‌توانید ارتباط + پارامترهای مختلف را بهتر درک کنید.

+

پس از اینکه این آموزش را به پایان رساندید، ممکن است بخواهید دیگر آموزش‌هایی را که جنبه‌های مهم دیگری از MEI را + معرفی می‌کنند ببینید. از این آموزش‌ها می‌توانید به عنوان مرجعی ساده برای یادآوری اصول MEI هم بهره ببرید. – شما + همیشه می‌توانید به آنها بازگردید.

+

برای شروع، لطفاً دکمه "Continue" را در پایین سمت راست این پاراگراف فشار دهید.

+
\ No newline at end of file diff --git a/_tutorials-FA/103_chords/step-01/103_chords_step-01-desc.html b/_tutorials-FA/103_chords/step-01/103_chords_step-01-desc.html new file mode 100644 index 00000000..f6249177 --- /dev/null +++ b/_tutorials-FA/103_chords/step-01/103_chords_step-01-desc.html @@ -0,0 +1,31 @@ +
+

+ گام اول: چند نت‌ را برای یک آکورد فراهم کنید. +

+

در MEI، مفهوم یک آکورد به معنای "صدا دادن همزمان دو یا چند نت در یک بخش صدایی، با مدت زمان مشابه" است (به + مشخصات المنت + مراجعه کنید). بنابراین، یک آکورد از دو یا چند المنت نت که به یک صدا (لایه) تعلق دارند و ارزش زمانی یکسانی دارند + ساخته شده‌است. (مواردی وجود دارند که ممکن است نخواهید همه نت‌های آکورد ارزش زمانی یکسانی داشته باشند، اما این + موارد در این آموزش پایه‌ای نیستند.) +

+

برای کدگذاری این "صدادهی همزمان"، المنت <chord> در MEI استفاده می‌شود. استفاده از آن ساده است: + چندین المنت <note> در همان لایه با یک المنت <chord> محصور شده و خصیصه کشش + زمانی (@dur) از نت‌ها به المنت <chord> منتقل می‌شود (زیرا ارزش زمانی برای همه نت‌ها یکسان + است). با این حال، اینکه ابتدا المنت بیرونی <chord> را بنویسید تا برخی المنت‌های + <note> داخلی اضافه کنید، یا ابتدا با نت‌ها شروع کنید و سپس آنها را در یک المنت + <chord> محصور کنید، در عمل تفاوتی ندارد.

+

برای این آموزش، بیایید به رویکرد دوم پایبند باشیم: این یعنی ابتدا به چند نت نیاز داریم.

+

لطفاً سه المنت <note> زیر را وارد ویرایشگر کنید:

+ + + +

شما باید سه نت را به ترتیب (یکی پس از دیگری) ببینید. فعلاً شبیه به آکورد نیست. اما نگران نباشید؛ در مرحله بعدی به + آن خواهیم پرداخت. تا آن زمان، می‌توانید با مقادیر خصیصه‌ها بازی کنید تا ببینید چگونه بر خروجی تأثیر می‌گذارند. + همچنین راهنمایی‌هایی درباره نحوه نوشتن کد صحیح، زیر ویرایشگر برای شما نمایان خواهد شد. هر زمان آماده شدید، مطمئن شوید که کد صحیح را در ویرایشگر + نوشته‌اید و سپس دکمه "ادامه" را فشار دهید.

+
diff --git a/_tutorials-FA/103_chords/step-01/103_chords_step-01-prefill.xml b/_tutorials-FA/103_chords/step-01/103_chords_step-01-prefill.xml new file mode 100644 index 00000000..b28124ba --- /dev/null +++ b/_tutorials-FA/103_chords/step-01/103_chords_step-01-prefill.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_tutorials-FA/103_chords/step-01/103_chords_step-01.xml b/_tutorials-FA/103_chords/step-01/103_chords_step-01.xml new file mode 100644 index 00000000..e49836f7 --- /dev/null +++ b/_tutorials-FA/103_chords/step-01/103_chords_step-01.xml @@ -0,0 +1,36 @@ + + + + + + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?> + <note pname="e" oct="4" dur="4"/> + <note pname="g" oct="4" dur="4"/> + <note pname="c" oct="5" dur="4"/> + <?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/103_chords/step-02/103_chords_step-02-desc.html b/_tutorials-FA/103_chords/step-02/103_chords_step-02-desc.html new file mode 100644 index 00000000..6c456e70 --- /dev/null +++ b/_tutorials-FA/103_chords/step-02/103_chords_step-02-desc.html @@ -0,0 +1,15 @@ +<div> + <p class="tutorialGoal"> + گام دوم: یک آکورد ساده (تریاد) را کدگذاری کنید. + </p> + <p>خوب، حالا وقت آن است که از این سه المنت <code><note></code> یک <code><chord></code> بسازید. همانطور + که در مرحله قبل ذکر شد، باید المنت‌های نت را در یک المنت <code><chord></code> محصور کرده و خصیصه‌ کشش زمانی را از نت‌ها به آکورد منتقل کنید.</p> + <p class="tutorialTask">در ویرایشگر زیر، سه المنت <code><note></code> را در یک المنت + <code><chord></code> محصور کنید (یعنی تگ آغازین <code><chord></code> را قبل از اولین نت و تگ پایانی + را بعد از آخرین نت بگذارید). حالا باید سه نت به جای اینکه به ترتیب قرار بگیرند، به صورت عمودی مرتب شوند، اما + هنوز مدت زمان صحیحی ندارند. بنابراین خصیصه‌های کشش زمانی را از همه نت‌ها حذف کرده و به آکورد اضافه‌اش کنید. مدت + زمان نت سیاه (<code>@dur="4"</code>) را نگه دارید.</p> + <p>شما باید آکورد را در خروجی ببینید. دوباره، می‌توانید با مقادیر خصیصه‌ها بازی کنید تا ببینید چگونه بر خروجی تأثیر + می‌گذارند. هر زمان آماده شدید، مطمئن شوید که کد صحیح در ویرایشگر وجود دارد و سپس دکمه "ادامه" را در پایین سمت + راست فشار دهید.</p> +</div> diff --git a/_tutorials-FA/103_chords/step-02/103_chords_step-02-prefill.xml b/_tutorials-FA/103_chords/step-02/103_chords_step-02-prefill.xml new file mode 100644 index 00000000..be6b1777 --- /dev/null +++ b/_tutorials-FA/103_chords/step-02/103_chords_step-02-prefill.xml @@ -0,0 +1,5 @@ +<!-- Your encoding should replace this line --> + <note pname="e" oct="4" dur="4"/> + <note pname="g" oct="4" dur="4"/> + <note pname="c" oct="5" dur="4"/> +<!-- Your encoding should replace this line --> diff --git a/_tutorials-FA/103_chords/step-02/103_chords_step-02.xml b/_tutorials-FA/103_chords/step-02/103_chords_step-02.xml new file mode 100644 index 00000000..9a0b47dd --- /dev/null +++ b/_tutorials-FA/103_chords/step-02/103_chords_step-02.xml @@ -0,0 +1,38 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?> + <chord dur="4"> + <note pname="e" oct="4" /> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + </chord> + <?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/103_chords/step-03/103_chords_step-03-desc.html b/_tutorials-FA/103_chords/step-03/103_chords_step-03-desc.html new file mode 100644 index 00000000..e409f22f --- /dev/null +++ b/_tutorials-FA/103_chords/step-03/103_chords_step-03-desc.html @@ -0,0 +1,14 @@ +<div> + <p class="tutorialGoal"> + گام سوم: یک توالی ساده از آکوردها کدگذاری کنید. + </p> + <p>عالی! شما یک آکورد را در MEI کدگذاری کرده‌اید! حالا بیایید در ادامه، چند آکورد دیگر اضافه کنیم تا یک زنجیره‌ی + آکوردی ساده بسازیم: + + <img style="display: block; margin: .5rem auto; width: 240px;" src="./103_chord-sequence.png" + alt="Simple chord sequence"> + </p> + <p class="tutorialTask">در ویرایشگر زیر، لطفاً سعی کنید زنجیره آکوردی بالا را با MEI بازتولید کنید. نت‌ها با + تگ‌های آغازین و پایانی آکورد محصور می‌شوند. هر آکورد به یک خصیصه <code>@dur</code> و هر نت به خصیصه‌های + <code>@pname</code> و <code>@oct</code> نیاز دارد.</p> +</div> diff --git a/_tutorials-FA/103_chords/step-03/103_chords_step-03-prefill.xml b/_tutorials-FA/103_chords/step-03/103_chords_step-03-prefill.xml new file mode 100644 index 00000000..217271f9 --- /dev/null +++ b/_tutorials-FA/103_chords/step-03/103_chords_step-03-prefill.xml @@ -0,0 +1,5 @@ +<chord dur="4"> + <note pname="e" oct="4" /> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> +</chord> diff --git a/_tutorials-FA/103_chords/step-03/103_chords_step-03.xml b/_tutorials-FA/103_chords/step-03/103_chords_step-03.xml new file mode 100644 index 00000000..3d6d62dc --- /dev/null +++ b/_tutorials-FA/103_chords/step-03/103_chords_step-03.xml @@ -0,0 +1,53 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?> + <chord dur="4"> + <note pname="e" oct="4" /> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + </chord> + <chord dur="4"> + <note pname="f" oct="4" /> + <note pname="a" oct="4" /> + <note pname="c" oct="5" /> + </chord> + <chord dur="4"> + <note pname="d" oct="4" /> + <note pname="g" oct="4" /> + <note pname="b" oct="4" /> + </chord> + <chord dur="4"> + <note pname="e" oct="4" /> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + </chord> + <?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/103_chords/step-04/103_chords_step-04-desc.html b/_tutorials-FA/103_chords/step-04/103_chords_step-04-desc.html new file mode 100644 index 00000000..81e63806 --- /dev/null +++ b/_tutorials-FA/103_chords/step-04/103_chords_step-04-desc.html @@ -0,0 +1,26 @@ +<div> + <p class="tutorialGoal"> + گام چهارم: یک توالی گسترده‌تر از آکوردها کدگذاری کنید. + </p> + <p>بسیار خب، توانستید توالی ساده‌ای از آکوردها را در MEI کدگذاری کنید. حالا در ادامه، بیایید فیگوهای ریتمیک گوناگون + را برای یک توالی مبسوط تر از آکوردها داشته باشیم. در واقع، ما به یک هارمونیزه کردن نمونه "Mary had a little + lamb" از <a href="./101-quickstart.html" target="_blank" rel="noopener, noreferrer">آموزش سریع</a> خواهیم رسید: + + <img style="display: block; margin: .5rem auto; width: 240px;" src="./103_chord-little-lamb.png" + alt="Extended chord sequence"> + </p> + <p class="tutorialTask">در ویرایشگر زیر، لطفاً سعی کنید توالی آکورد بالا را با MEI بازتولید کنید. نت‌ها با المنت‌های + آکورد محصور می‌شوند. هر آکورد به یک خصیصه <code>@dur</code> نیاز دارد و هر نت به خصیصه‌های <code>@pname</code> و + <code>@oct</code> نیاز دارد.</p> + <p>به خاطر داشته باشید که خصیصه <code>@dur</code> می‌تواند مقادیری مانند <code>"1"</code>، <code>"2"</code>، + <code>"4"</code>، <code>"8"</code> یا <code>"16"</code> داشته باشد تا ارزش‌های زمانی مختلف را نشان دهد. + برای اولین آکورد، به یک خصیصه <code>@dur="2"</code> نیاز داریم.</p> + <p> + برای آکورد اول، به خصیصه <code>@dots</code> هم نیاز دارید، که باید تعداد نقطه‌ها را به‌صورت یک عدد صحیح + مشخص کنید – در این مورد، <code>dots="1"</code> است. + </p> + <p> + نکته: هنگامی که ساختار آکوردی را ایجاد کردید، باید بتوانید بلوک حاوی سه المنت <code><note></code> را کپی و + پیست کنید. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/103_chords/step-04/103_chords_step-04-prefill.xml b/_tutorials-FA/103_chords/step-04/103_chords_step-04-prefill.xml new file mode 100644 index 00000000..8c14d778 --- /dev/null +++ b/_tutorials-FA/103_chords/step-04/103_chords_step-04-prefill.xml @@ -0,0 +1,5 @@ +<chord dur="4"> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + <note pname="e" oct="5" /> +</chord> diff --git a/_tutorials-FA/103_chords/step-04/103_chords_step-04.xml b/_tutorials-FA/103_chords/step-04/103_chords_step-04.xml new file mode 100644 index 00000000..12909226 --- /dev/null +++ b/_tutorials-FA/103_chords/step-04/103_chords_step-04.xml @@ -0,0 +1,68 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?> + <chord dur="4" dots="1"> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + <note pname="e" oct="5" /> + </chord> + <chord dur="8"> + <note pname="f" oct="4" /> + <note pname="b" oct="4" /> + <note pname="d" oct="5" /> + </chord> + <chord dur="4"> + <note pname="e" oct="4" /> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + </chord> + <chord dur="4"> + <note pname="f" oct="4" /> + <note pname="b" oct="4" /> + <note pname="d" oct="5" /> + </chord> + <chord dur="4"> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + <note pname="e" oct="5" /> + </chord> + <chord dur="4"> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + <note pname="e" oct="5" /> + </chord> + <chord dur="2"> + <note pname="g" oct="4" /> + <note pname="c" oct="5" /> + <note pname="e" oct="5" /> + </chord> + <?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/104_rests/104_rests-multirest.png b/_tutorials-FA/104_rests/104_rests-multirest.png new file mode 100644 index 00000000..f3be57e2 Binary files /dev/null and b/_tutorials-FA/104_rests/104_rests-multirest.png differ diff --git a/_tutorials-FA/104_rests/104_rests-spaces.png b/_tutorials-FA/104_rests/104_rests-spaces.png new file mode 100644 index 00000000..94dd19a4 Binary files /dev/null and b/_tutorials-FA/104_rests/104_rests-spaces.png differ diff --git a/_tutorials-FA/104_rests/104_rests.json b/_tutorials-FA/104_rests/104_rests.json new file mode 100644 index 00000000..b5860072 --- /dev/null +++ b/_tutorials-FA/104_rests/104_rests.json @@ -0,0 +1,74 @@ +{ + "steps": [ + [ + { + "label": "خوش‌ آمدید", + "descFile": "104_rests_step-00-desc.html", + "xmlFile": "104_rests_step-00.xml", + "editorLines": 1, + "xpaths": [ + { "rule": "count(//mei:rest) = 1", "renderanyway": false, "hint": "باید یک المنت سکوت داشته باشید." }, + { "rule": "count(//mei:rest/@*) = 1 and //mei:rest/@dur", "renderanyway": false, "hint": "باید یک خصیصه @dur داشته باشید." }, + { "rule": "//mei:rest/@dur = '4'", "renderanyway": true, "hint": "خصیصه @dur از مقادیری مانند '1'، '2' یا '4' استفاده می‌کند. از مقدار آخر برای سکوت نت سیاه استفاده کنید." } + ] + }, + { + "label": "ارزش‌های زمانی مختلف", + "editorLines": 5, + "descFile": "104_rests_step-01-desc.html", + "xmlFile": "104_rests_step-00.xml", + "xpaths": [ + { "rule": "count(//mei:rest) = 5", "renderanyway": true, "hint": "باید پنج المنت سکوت کدگذاری کنید." }, + { "rule": "//mei:rest[1]/@dur and //mei:rest[1]/@dur = '1'", "renderanyway": true }, + { "rule": "//mei:rest[2]/@dur and //mei:rest[2]/@dur = '2'", "renderanyway": true }, + { "rule": "//mei:rest[3]/@dur and //mei:rest[3]/@dur = '4' and //mei:rest[3]/@dots and //mei:rest[3]/@dots = '1'", "renderanyway": true }, + { "rule": "//mei:rest[4]/@dur and //mei:rest[4]/@dur = '8'", "renderanyway": true }, + { "rule": "//mei:rest[5]/@dur and //mei:rest[5]/@dur = '16'", "renderanyway": true } + ] + }, + { + "label": "سکوت‌های یک میزانی", + "editorLines": 1, + "descFile": "104_rests_step-02-desc.html", + "xmlFile": "104_rests_step-02.xml", + "prefillFile": "104_rests_step-02-prefill.xml", + "xpaths": [ + { "rule": "count(//mei:mRest) = 1", "renderanyway": true, "hint": "باید یک المنت mRest داشته باشید." }, + { "rule": "count(//mei:mRest/@*) = 0", "renderanyway": true, "hint": "المنت mRest نباید خصیصه‌ای داشته باشد." }, + { "rule": "count(//mei:layer/mei:*) = 1", "renderanyway": true, "hint": "باید تنها یک المنت mRest کدگذاری کنید." } + ] + }, + { + "label": "سکوت‌های چند میزانی", + "editorLines": 1, + "descFile": "104_rests_step-03-desc.html", + "xmlFile": "104_rests_step-02.xml", + "xpaths": [ + { "rule": "count(//mei:multiRest) = 1", "renderanyway": true, "hint": "باید یک المنت multiRest داشته باشید." }, + { "rule": "count(//mei:layer/mei:*) = 1", "renderanyway": true, "hint": "باید تنها یک المنت multiRest کدگذاری کنید." }, + { "rule": "count(//mei:multiRest/@*) = 1 and //mei:multiRest/@num", "renderanyway": true, "hint": "المنت multiRest باید یک خصیصه (@num) داشته باشد." }, + { "rule": "//mei:multiRest/@num = '15'", "renderanyway": true, "hint": "المنت multiRest باید دارای مدت زمانی معادل 15 میزان باشد." } + ] + }, + { + "label": "فضاهای خالی / سکوت‌های نامرئی", + "editorLines": 6, + "descFile": "104_rests_step-04-desc.html", + "xmlFile": "104_rests_step-04.xml", + "prefillFile": "104_rests_step-04-prefill.xml", + "xpaths": [ + { "rule": "//mei:space/following-sibling::mei:note", "renderanyway": true, "hint": "المنت space باید پیش از المنت note قرار گیرد." }, + { "rule": "count(//mei:space[@dur = '4']) = 3 or (//mei:space[@dur = '2' and @dots = '1']) or (//mei:space[@dur = '2'] and //mei:space[@dur = '4'])", "renderanyway": true } + ] + } + ] + + ], + "end":"104_rests_end.html", + "resp":[ + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +} diff --git a/_tutorials-FA/104_rests/104_rests.md b/_tutorials-FA/104_rests/104_rests.md new file mode 100644 index 00000000..b226f019 --- /dev/null +++ b/_tutorials-FA/104_rests/104_rests.md @@ -0,0 +1,7 @@ +--- +layout: tutorials +type: tutorial +name: "مبتندی: سکوت‌ها" +fullname: "درسی کوتاه درباره سکوت‌ها در MEI" +data: "104_rests.json" +--- diff --git a/_tutorials-FA/104_rests/104_rests.png b/_tutorials-FA/104_rests/104_rests.png new file mode 100644 index 00000000..1fa00cc4 Binary files /dev/null and b/_tutorials-FA/104_rests/104_rests.png differ diff --git a/_tutorials-FA/104_rests/104_rests_end.html b/_tutorials-FA/104_rests/104_rests_end.html new file mode 100644 index 00000000..cae22354 --- /dev/null +++ b/_tutorials-FA/104_rests/104_rests_end.html @@ -0,0 +1,27 @@ +<div> + <h3>تبریک!</h3> + <p> + در این درس، یاد گرفتید که چگونه سکوت‌ها را با MEI کدگذاری کنید. المنت‌هایی که یاد گرفتید عبارتند + از: + </p><ul> + <li> + <a href="/guidelines/v4/elements/rest.html" target="_blank" ref="noopener, noreferrer"><rest></a> + </li> + <li> + <a href="/guidelines/v4/elements/mrest.html" target="_blank" ref="noopener, noreferrer"><mRest></a> + </li> + <li> + <a href="/guidelines/v4/elements/multirest.html" target="_blank" ref="noopener, noreferrer"><multiRest></a> + </li> + <li> + <a href="/guidelines/v4/elements/space.html" target="_blank" ref="noopener, noreferrer"><space></a> + </li> + </ul> + این المنت‌ها تقریباً همیشه خالی هستند و هیچ المنت فرزندی ندارند. با المنت space، شما با یک مکانیسم پیشرفته + هماهنگ‌سازی چندین صدا که یک حامل را به اشتراک می‌گذارند، آشنا شدید. اگر به این موضوع علاقه‌مندید، ممکن است + بخواهید به خصیصه‌های <code>@next</code> و <code>@prev</code> از کلاس خصیصه <a href="/guidelines/v4/attribute-classes/att.linking.html" target="_blank" ref="noopener, noreferrer">att.linking</a> (برای المنت <code><note></code> و دیگر رویدادها) نیز + نگاهی بیندازید. این کلاس خصیصه اجازه می‌دهد تا "ردپاهایی" در یک فایل MEI ایجاد شود که امکان دنبال کردن صداها در + بین چندین لایه (و اگر لازم باشد، چندین حامل) را فراهم می‌کند. البته این ویژگی بیشتر برای استفاده تحلیلی از فایل MEI + مفید است و در اکثر موقعیت‌ها لازم نیست. + <br><p></p> +</div> diff --git a/_tutorials-FA/104_rests/step-00/104_rests_step-00-desc.html b/_tutorials-FA/104_rests/step-00/104_rests_step-00-desc.html new file mode 100644 index 00000000..2a76db5e --- /dev/null +++ b/_tutorials-FA/104_rests/step-00/104_rests_step-00-desc.html @@ -0,0 +1,10 @@ +<div> + <p> در این آموزش، خواهید آموخت که چگونه انواع مختلف سکوت‌ها را -در رپرتوار مربوط به نت‌نگاری رایج (Common Music Notation - CMN)- با استفاده از + MEI کدگذاری کنید. </p> + <p> لطفاً در صورت نیاز به اطلاعات بیشتر برای حل مسئله زیر، به <a href="/tutorials/100-structure.html" target="_blank" rel="noopener, noreferrer">مبانی XML و ساختار مینیمال MEI</a> و/یا آموزش <a href="/tutorials/101-quickstart.html" target="_blank" rel="noopener, noreferrer">شروع سریع</a> رجوع + کنید. </p> + <p> طبق <a href="/guidelines/v4/elements/rest.html" target="_blank" rel="noopener, noreferrer">تعریف MEI</a>، + یک سکوت "رویدادی غیر صوتی است که در متن قرار می‌گیرد". کدگذاری آن ساده است: فقط + از یک المنت <code><rest></code> استفاده کنید، با یک خصیصه <code>@dur</code>. </p> + <p class="tutorialTask"> لطفاً یک سکوت نت سیاه را کدگذاری کنید. </p> +</div> diff --git a/_tutorials-FA/104_rests/step-00/104_rests_step-00.xml b/_tutorials-FA/104_rests/step-00/104_rests_step-00.xml new file mode 100644 index 00000000..9a203253 --- /dev/null +++ b/_tutorials-FA/104_rests/step-00/104_rests_step-00.xml @@ -0,0 +1,32 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?><rest dur="4"/><?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/104_rests/step-01/104_rests_step-01-desc.html b/_tutorials-FA/104_rests/step-01/104_rests_step-01-desc.html new file mode 100644 index 00000000..37fcfaf0 --- /dev/null +++ b/_tutorials-FA/104_rests/step-01/104_rests_step-01-desc.html @@ -0,0 +1,15 @@ +<div> + <p> + تبریک! شما اولین سکوت خود را کدگذاری کردید. مورد بعدی هم همینقدر آسان است: + </p> + <p class="tutorialTask"> + پنج سکوت زیر را به ترتیب کدگذاری کنید: + <img style="display: block; margin: .5rem auto; width: 240px;" src="./104_rests.png" alt="یک توالی از سکوت‌ها"> + </p> + <p> + برای سکوت سوم، نیاز به یک خصیصه اضافی <code>@dots</code> دارید، که باید تعداد نقطه‌ها را به‌صورت یک + عدد صحیح مشخص کنید – در این مورد، <code>dots="1"</code> است. به خاطر داشته باشید که خصیصه + <code>@dur</code> می‌تواند مقادیری مانند <code>"1"</code>, <code>"2"</code>, <code>"4"</code>, + <code>"8"</code> یا <code>"16"</code> داشته باشد. + </p> +</div> diff --git a/_tutorials-FA/104_rests/step-01/104_rests_step-01.xml b/_tutorials-FA/104_rests/step-01/104_rests_step-01.xml new file mode 100644 index 00000000..9a203253 --- /dev/null +++ b/_tutorials-FA/104_rests/step-01/104_rests_step-01.xml @@ -0,0 +1,32 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?><rest dur="4"/><?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/104_rests/step-02/104_rests_step-02-desc.html b/_tutorials-FA/104_rests/step-02/104_rests_step-02-desc.html new file mode 100644 index 00000000..b800b590 --- /dev/null +++ b/_tutorials-FA/104_rests/step-02/104_rests_step-02-desc.html @@ -0,0 +1,15 @@ +<div> + <p> + اغلب، سکوت باید یک میزان را - بدون توجه به متر- کامل پر کند، + البته ممکن است از المنت‌های <code><rest></code> معمولی با ارزش زمانی مناسب برای این کار استفاده کنید – + در حالت متر 4/4، این فقط یک <code><rest dur="1"/></code> خواهد بود. با این حال، در مترهای دیگر ممکن + است به نشانه‌گذاری بیشتری نیاز داشته باشد. + به همین دلیل، MEI یک المنت خاص به نام <code><mRest/></code> دارد – یک + <i>سکوت میزان</i>. این المنت نیازی به خصیصه <code>@dur</code> ندارد (اگرچه استفاده از آن مجاز + است) و همیشه یک میزان کامل را پر می‌کند، بدون توجه به متر. بنابراین نباید آن را با رویدادهای دیگر در همان + میزان ترکیب کنید. + </p> + <p class="tutorialTask"> + لطفاً سکوت گرد (که لزوماً با متر مطابقت ندارد) را به یک <code><mRest/></code> تبدیل کنید. + </p> +</div> diff --git a/_tutorials-FA/104_rests/step-02/104_rests_step-02-prefill.xml b/_tutorials-FA/104_rests/step-02/104_rests_step-02-prefill.xml new file mode 100644 index 00000000..33896b86 --- /dev/null +++ b/_tutorials-FA/104_rests/step-02/104_rests_step-02-prefill.xml @@ -0,0 +1 @@ +<rest dur="1"/> \ No newline at end of file diff --git a/_tutorials-FA/104_rests/step-02/104_rests_step-02.xml b/_tutorials-FA/104_rests/step-02/104_rests_step-02.xml new file mode 100644 index 00000000..7ce4594e --- /dev/null +++ b/_tutorials-FA/104_rests/step-02/104_rests_step-02.xml @@ -0,0 +1,32 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?edit-start?><?edit-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/104_rests/step-03/104_rests_step-03-desc.html b/_tutorials-FA/104_rests/step-03/104_rests_step-03-desc.html new file mode 100644 index 00000000..ba5f85c1 --- /dev/null +++ b/_tutorials-FA/104_rests/step-03/104_rests_step-03-desc.html @@ -0,0 +1,14 @@ +<div> + <p> + در موسیقی‌ای که معمولاً برای پارت‌های مختلف تنظیم می‌شود، خیلی پیش می‌آید سکوت‌هایی بیش از یک میزان طول بکشند. + <img style="display: block; margin: .5rem auto; width: 120px;" src="./104_rests-multirest.png" alt="سکوت چندین میزان"> + </p> + <p> + در MEI، این سکوت‌ها با استفاده از المنت مخصوص<code><multiRest/></code> کدگذاری می‌شوند. این المنت از + اعداد صحیح در خصیصه <code>@num</code> برای مشخص کردن تعداد میزان‌هایی که نوازنده آن بخش باید سکوت کند، + استفاده می‌کند. + </p> + <p class="tutorialTask"> + لطفاً یک <code><multiRest/></code> به طول 15 میزان کدگذاری کنید. + </p> +</div> diff --git a/_tutorials-FA/104_rests/step-04/104_rests_step-04-desc.html b/_tutorials-FA/104_rests/step-04/104_rests_step-04-desc.html new file mode 100644 index 00000000..50979a4f --- /dev/null +++ b/_tutorials-FA/104_rests/step-04/104_rests_step-04-desc.html @@ -0,0 +1,44 @@ +<div> + <p> + وقتی چند ساز یا بخش صدایی در یک حامل مشترک نوشته‌ شده‌باشند، گاهی لازم است که رویدادهایی مانند نت‌ها را به جایی بعدتر در میزان هل بدهیم، بدون اینکه اشاره کنیم آن بخش در حال سکوت است. این معمولاً زمانی اتفاق + می‌افتد که سندی که قرار است کدگذاری شود، بین حالت «نت‌نویسی مبتنی بر آکورد» و «ساقه‌های جداگانه در یک میزان» + تغییر شکل دهد (به شکل زیر نگاه کنید). چون MEI از المنت <a href="/guidelines/v4/elements/layer.html" + target="_blank" rel="noopener, noreferrer"><layer></a> برای چیدمان چندین ساز استفاده می‌کند، و در + این موقعیت‌ها یک ساز بین این لایه‌ها در میان میزان تغییر می‌کند، "فاصله‌ها" در آن میزان‌ها باید پر شوند. و این + به این دلیل به المنت <code><space></code> نیاز داریم!<img + style="display: block; margin: .5rem auto; width: 240px;" src="./104_rests-spaces.png" + alt="موقعیتی که نیاز به المنت‌های space دارد"> + </p> + <p> + البته، فضای خالی واقعاً سکوت محسوب نمی‌شود. با این حال، در فرمت‌های کدگذاری یا برنامه‌های نت‌نویسی + دیگر، + اغلب برای این اهداف از سکوت‌های نامرئی استفاده می‌شود. مزیت المنت <code> + <space></code> در MEI این است که + هیچ معنایی ندارد – فقط رویدادهای دیگر را به اطراف منتقل می‌کند. این باعث می‌شود که پردازش یک کدگذاری و + استخراج صداهای جداگانه از آن بسیار آسان‌تر باشد، زیرا اینطور نیست که صرفاً برای هماهنگی بهتر، المنت اطلاعاتی + نادرستی را معرفی کرده باشیم.</p> + <p> + با این حال، می‌توانید برای المنت <code><space></code> ارزش زمانی در نظر بگیرید -با استفاده از خصیصه + <code>@dur</code>. حتی می‌توانید از <code>@dots</code> برای یک و نیم برابر کردن ارزش زمانی‌اش استفاده کنید. + ارزش زمانی‌ای که به <code><space></code> اختصاص می‌دهید، تعداد ضرب‌هایی است که رویدادهایی مانند + <code><note></code> پس از <code><space></code> به سمت راست منتقل می‌شوند. + </p> + <p class="tutorialTask"> + در ویرایشگر زیر، شما یک کدگذاریِ از پیش نوشته شده رااز نت G4 (که در ضرب اول لایه‌ صدایی دوم + قرار دارد) می‌بینید. + لطفاً این نت را به انتهای میزان منتقل کنید تا در ضرب آخر میزان زیر نت D5 قرار گیرد، همان‌طور که در تصویر + بالا + دیده می‌شود. برای این کار، از المنت <code><space></code> + استفاده کنید و مدت زمان مناسب (باید در مجموع + 3 ضرب باشد) را اعمال کنید. در واقع، روش‌های متعددی برای کدگذاری آن وجود دارد:</p> + <ul> + <li>با استفاده از سه <code><space></code> با مقدار یکسان برای <code>@dur</code>،</li> + <li>با استفاده از دو المنت <code><space></code> با دو مقدار متفاوت فقط برای <code>@dur</code>،</li> + <li>یا حتی با استفاده از یک المنت <code><space></code> و استفاده از <code>@dur</code> و + <code>@dots</code>. + </li> + </ul> + <p> + می‌توانید کمی با مقادیر خصیصه‌ها بازی کنید تا ببینید که چگونه بر خروجی رندر تأثیر می‌گذارند. آیا میتوانید از هر + سه راه حل جواب بگیرید؟</p> +</div> diff --git a/_tutorials-FA/104_rests/step-04/104_rests_step-04-prefill.xml b/_tutorials-FA/104_rests/step-04/104_rests_step-04-prefill.xml new file mode 100644 index 00000000..9a231313 --- /dev/null +++ b/_tutorials-FA/104_rests/step-04/104_rests_step-04-prefill.xml @@ -0,0 +1,4 @@ +<layer n="2"> + <!-- Your encoding should replace this line --> + <note pname="g" oct="4" dur="4" color="blue"/> +</layer> diff --git a/_tutorials-FA/104_rests/step-04/104_rests_step-04.xml b/_tutorials-FA/104_rests/step-04/104_rests_step-04.xml new file mode 100644 index 00000000..7651f114 --- /dev/null +++ b/_tutorials-FA/104_rests/step-04/104_rests_step-04.xml @@ -0,0 +1,43 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer n="1"> + <chord dur="2" stem.dir="up" color="green"> + <note pname="c" oct="5" /> + <note pname="a" oct="4" /> + </chord> + <rest dur="4" color="green"/> + <note pname="d" oct="5" dur="4" color="green" /> + </layer> + <?edit-start?> + <layer n="2"> + <space dur="2" dots="1"/> + <note pname="g" oct="4" dur="4" color="blue"/> + </layer> + <?edit-end?> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-01.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-01.html new file mode 100644 index 00000000..770b92f6 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-01.html @@ -0,0 +1,27 @@ +<div> + <h1>درک ODD</h1> + <p>این آموزش، درسی در سطح پیشرفته است که به بررسی ساختارهای درونی MEI می‌پردازد. با استفاده از این ساختارها، می‌توان + MEI + را به نیازها و چشم‌اندازهای هر کاربردی از آن انتظار می‌رود محدود کرد؛ که اصولاً باعث بهینه‌تر شدن فرایند کدگذاری شده و به عنوان یک رویه خوب شناخته می‌شود. + تنها با چنین نسخه + محدودشده‌ای از MEI (که معمولاً "سفارشی" نامیده می‌شود)، می‌توان اصول ویراستاری پروژه را طوری اعمال کرد که به‌طور + فنی کیفیت داده‌ها را تضمین کند. هرچند چنین اعتبارسنجی به‌ندرت مانع از بروز خطاهای معنایی (مثلاً رمزگذاری + نت‌های اشتباه) می‌شود، اما اطمینان می‌دهد که تنها از نشانه‌گذاری‌هایی استفاده می‌شود که جریان کار پروژه + برای آن‌ها طراحی شده است و هیچ تفسیر نادرستی از نشانه‌گذاری‌های غیرمنتظره پیش نمی‌آید. + </p> + <p> + این درس مفاهیم پایه‌ای زبان ODD را که برای تعریف MEI استفاده می‌شود معرفی می‌کند. در درس دیگری، به + معرفی جریان‌های کاری و ابزارهایی که به سفارشی‌سازی‌های فردی کمک می‌کنند، خواهیم پرداخت؛ اما اکیداً توصیه + می‌کنیم ابتدا با ساختارهای زیرین در این درس آشنا شوید. + </p> + <p>صادقانه، این یکی از پیچیده‌ترین موضوعات مرتبط با MEI است و به‌طور قطع نیاز به زمان دارد تا با ODD بصورت کاربردی + آشنا شوید. با این حال، جامعه گسترده MEI با کمال میل <a href="/community/community-contacts.html" + target="_blank" rel="noopener, noreferrer">به سوالاتتان پاسخ ‌می‌دهد</a>؛ و البته <a + href="/community/technical-team.html" target="_blank" rel="noopener, noreferrer">تیم فنی MEI</a> هم، + همینطور. فقط با حوصله این درس را بگذرانید و نگاهی دقیق‌تر به + <a href="https://music-encoding.org/guidelines/v4/content/introduction.html#meicustomization" target="_blank" + rel="noopener, noreferrer">فصل مربوطه از دستورالعمل‌های MEI</a> بیندازید. + در نهایت، شما در استفاده از استانداردهای DH مانند MEI ماهر خواهید شد – از اینجا به بعد، فقط کافی است روی + «<b>ادامه» </b>کلیک کنید :-) + </p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-02.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-02.html new file mode 100644 index 00000000..0be550ac --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-02.html @@ -0,0 +1,32 @@ +<div> + <p> + ODD، یک مخفف برای <em>یک سند برای همه‌کار «</em>One Document Does-it-all</i>است و بخشی از + <a href="https://tei-c.org/guidelines/customization/getting-started-with-p5-odds/" target="_blank" + rel="noopener, noreferrer">استاندارد TEI</a> + بوده که حتی برای تعریف خود TEI نیز استفاده می‌شود. + </p> + <p> + ODD برای توصیف فرمت‌های مبتنی بر XML، از مجموعه‌ای از المنت‌های ویژه استفاده در + <a href="https://tei-c.org/ns/1.0/" target="_blank" rel="noopener, noreferrer">نام‌حوزه (Namespace) TEI</a>; استفاده + می‌کند. علاوه بر TEI اصلی، از آن نه تنها برای فرمت‌های مبتنی بر TEI مانند + <a href="https://sourceforge.net/p/epidoc/wiki/Home/" target="_blank" rel="noopener, noreferrer">EpiDoc</a>، + بلکه برای فرمت‌هایی که به طور فنی مستقل هستند مانند MEI هم استفاده می‌شود. در سال ۲۰۱۶، TEI نسخه‌ای از + ODD به نام + <em><a href="https://wiki.tei-c.org/index.php/ODD#.22Pure_ODD.22" target="_blank" rel="noopener, noreferrer">ODD + خالص</a></em> + را معرفی کرد. با این حال، از تابستان ۲۰۲۰، MEI همچنان از نسخه قدیمی ODD استفاده می‌کند، زیرا نسخه + جدید هیچ + مزیت مهمی برای MEI ندارد و بیشتر باعث کار اضافه برای نگهداری ابزارها و جریان‌های کاری مرتبط با MEI + می‌شود. + </p> + <p> + تفاوت اصلی با <em>ODD خالص</em> این است که نسخه قدیمی مورد استفاده MEI از المنت‌هایی از نام‌حوزه + <em><a href="https://relaxng.org/" target="_blank" rel="noopener, noreferrer">RelaxNG</a></em> + استفاده می‌کند. در نهایت، فایل‌های ODD معمولاً به یک RelaxNG (یا XSD) کامپایل می‌شوند، زیرا عملاً هیچ + پشتیبانی نرم‌افزاری برای اعتبارسنجی مستقیم در برابر ODD وجود ندارد. با این حال، این استفاده از RelaxNG در + داخل ODD وابستگی دیگری به جریان کاری TEI اضافه می‌کند و بنابراین آزادی فنی برای تعریف TEI و/یا ODD را تا + حد(کم؟)ای کاهش می‌دهد. از آنجایی که MEI در حال حاضر در فرمت‌هایی تعریف شده است که از کنترل (مستقیم) جامعه + MEI خارج است و باید با چندین نام‌حوزه XML کار کند، استدلال برای تعریف همه چیز به‌طور سازگار در <em>ODD + خالص</em> زیاد جذاب نبوده و تا کنون دنبال نشده است. + </p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-03.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-03.html new file mode 100644 index 00000000..e6150d88 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-03.html @@ -0,0 +1,31 @@ +<div> + <p> + علیرغم نامش، تنظیمات پیش‌فرض برای کار با ODD معمولاً به حداقل <u>دو</u> فایل <em>منطقی</em> نیاز دارد (اگرچه این + فایل‌ها ممکن است در فایل‌های بیشتری پخش شوند، همان‌طور که در مرحله بعدی این آموزش نشان داده + شده است). اولین این فایل‌ها به اصطلاح <em>منبع (سورس)</em> است: این فایل شامل مشخصات کامل فرمت است، در این مورد + MEI. در مخزن گیت‌هاب ما، در فایل + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/mei-source.xml" target="_blank" + rel="noopener, noreferrer">mei-source.xml</a> + قرار دارد. علاوه بر آن فایل، یک <em>سفارشی‌سازی</em> جداگانه مورد نیاز است تا مشخص کند کدام بخش‌های مشخصات + در یک زمینه خاص استفاده خواهند شد. هدف کلی ODD این است که سفارشی‌سازی‌های انعطاف‌پذیر از شِما فراهم شود. + MEI مجموعه‌ای از + <a href="https://music-encoding.org/guidelines/v4/content/introduction.html#meiprofiles" target="_blank" + rel="noopener, noreferrer">پروفایل‌های از پیش تعریف شده</a> + را فراهم می‌کند که چیزی جز سفارشی‌سازی‌های شِمای MEI نیستند. + </p> + <p> + برای استفاده از MEI (یا هر فرمت مبتنی بر ODD دیگر)، از فایل <em>سفارشی‌سازی</em> استفاده می‌شود تا کنترل کند + که چگونه فایل <em>منبع</em> کامپایل شود. چندین فرمت هدف برای آن کامپایل وجود دارد که در جای دیگری توضیح داده + شده است<!-- TODO: Add reference to second tutorial -->. رایج‌ترین هدف یک فایل + <a href="https://relaxng.org/" target="_blank" rel="noopener, noreferrer">RelaxNG</a> + است که هم سلسله مراتب RelaxNG و هم قوانین دیگر Schematron را به عنوان تعریف شده در ODD در بر می‌گیرد و + می‌تواند برای اعتبارسنجی در برابر هر دو نوع شِما استفاده شود. معمولاً تمام فرمت‌های خروجی ممکنِ دیگر برای MEI به کار نمی‌روند. + (ما بعداً در این آموزش به توضیح مختصر Schematron باز خواهیم گشت.) + </p> + <p> + در حالی که این آموزش بر توضیح اصول پایه‌ای ساختارهای ODD در منابع MEI تمرکز دارد، یک آموزش جداگانه در مورد + ODD نحوه سفارشی‌سازی MEI برای نیازهای خاص را توضیح می‌دهد. مراحل زیر مکانیسم‌های اصلی ساختارهای ODD در MEI + را معرفی می‌کنند: ماژول‌ها، المنت‌ها، مدل‌ها، خصیصه‌ها، انواع‌ِ داده‌ها و ماکروها. بیایید <strong>ادامه + دهیم</strong> تا با نگاهی نزدیک‌تر به <em>ماژول‌ها</em> شروع کنیم... + </p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-04.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-04.html new file mode 100644 index 00000000..cad1eaef --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-04.html @@ -0,0 +1,63 @@ + +<div> + <p><em>ماژول‌ها</em>بالاترین سطح در ساختار مفهومی ODD هستند. + ماژول‌ها امکان تقسیم‌بندی طرح را + به نواحی مختلف فراهم می‌کنند، که هرکدام یک جنبه مشخص را تعریف خواهد کرد. تا سال 2019، ساختار راهنماهای + وبسایت MEI از + ماژول‌های ODD پیروی می‌کرد، اما این ساختار با یک تقسیم‌بندی آموزشی‌تر جایگزین شد. + اکنون، ماژول‌ها در راهنماهای MEI در بالای تعاریف المنت‌ها، خصیصه‌ها و... نمایش داده می‌شوند:</span></p> + <div> + <img style="width: 100%;" src="./beam-module.png"> + </div> + <p> + این تنها یک ارجاع ساده به ماژول‌ها است. اگر قصد کار بر روی ODD در MEI را دارید، مهم‌تر است بدانید که + سورس‌کد MEI بر اساس ماژول‌ها تقسیم‌بندی شده است. فایل + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/mei-source.xml" target="_blank" + rel="noopener, noreferrer">mei-source.xml</a> + به عنوان نقطه شروع برای ورود به مشخصات MEI عمل می‌کند. المنت + <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-schemaSpec.html" target="_blank" + rel="noopener, noreferrer"><schemaSpec></a> + در <a + href="https://github.com/music-encoding/music-encoding/blob/93d8c00cd14126af2e680d47f437042227eb2c0e/source/mei-source.xml#L83" + target="_blank" rel="noopener, noreferrer">خط 83</a>(یا همان حوالی) یک شِمای جدید را با نام‌حوزه MEI + (<code>@ns="http://www.music-encoding.org/ns/mei"</code>) تعریف می‌کند. + سپس تعدادی + <em>XInclude</em> به عنوان المنت‌های فرزند دارد. <em>XInclude</em> برای تقسیم یک فایل XML منطقی بزرگ‌تر به + فایل‌های کوچک‌تر و مدیریت‌پذیرتر استفاده می‌شود. در اینجا، هر ماژول MEI در یک فایل جداگانه در زیرپوشه + <a href="https://github.com/music-encoding/music-encoding/tree/develop/source/modules" target="_blank" + rel="noopener, noreferrer">modules</a> ذخیره شده است. + </p> + <p> + ماژول‌های MEI بر اساس موضوعات مختلف ساخته شده‌اند. ماژول‌هایی هستند که بر روی رپرتوارهای موسیقی خاص تمرکز + دارند + (<a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.cmn.xml" + target="_blank" rel="noopener, noreferrer">CMN</a>، + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.mensural.xml" + target="_blank" rel="noopener, noreferrer">Mensural</a>، + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.neumes.xml" + target="_blank" rel="noopener, noreferrer">Neumes</a>، یا + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.stringtab.xml" + target="_blank" rel="noopener, noreferrer">Tablature زهی</a>)، + اما همچنین ماژول‌هایی برای دیدگاه‌های خاص در موسیقی + (<a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.visual.xml" + target="_blank" rel="noopener, noreferrer">بصری</a>، + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.gestural.xml" + target="_blank" rel="noopener, noreferrer">حرکتی</a>، + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.analytical.xml" + target="_blank" rel="noopener, noreferrer">تحلیلی</a>)، + فناوری‌ها ( + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.midi.xml" + target="_blank" rel="noopener, noreferrer">MIDI</a>) یا موارد استفاده + (<a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.facsimile.xml" + target="_blank" rel="noopener, noreferrer">نسخه‌ها</a>، + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.performance.xml" + target="_blank" rel="noopener, noreferrer">اجراها</a>، + <a href="https://github.com/music-encoding/music-encoding/blob/develop/source/modules/MEI.edittrans.xml" + target="_blank" rel="noopener, noreferrer">استفاده ویرایشی</a>). + دامنه هر یک از این ماژول‌ها در راهنماهای MEI توصیف شده است. + </p> + <p> + علاوه بر بهبود قابلیت نگهداری سورس‌کد MEI به دلیل کاهش حجم فایل‌ها، این تقسیم‌بندی عمدتاً به ما امکان + می‌دهد که به‌راحتی بخش‌های بزرگ‌تر (-> ماژول‌ها) از طرح MEI را «خاموش کنیم». + </p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-05.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-05.html new file mode 100644 index 00000000..1ed52be9 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-05.html @@ -0,0 +1,59 @@ +<div> + <p> + آشکارترین بلوک‌های ساختاری برای مشخصات MEI تعاریف المنت‌ها هستند. این کار با استفاده از + <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-elementSpec.html" target="_blank" + rel="noopener, noreferrer"><elementSpec></a> در TEI انجام می‌شود. + بیایید به المنت <a href="https://music-encoding.org/guidelines/v4/elements/castitem.html" target="_blank" + rel="noopener, noreferrer"><castItem></a> در MEI نگاهی بیندازیم: + </p> + <pre class="codeblock"><elementSpec ident="castItem" module="MEI.shared"> + <desc>Contains a single entry within a cast list, describing either a single role or a list of non-speaking roles.</desc> + <classes> + <memberOf key="att.common"/> + <memberOf key="att.bibl"/> + <memberOf key="att.facsimile"/> + <memberOf key="att.lang"/> + </classes> + <content> + <rng:oneOrMore> + <rng:choice> + <rng:text/> + <rng:ref name="role" /> + <rng:ref name="roleDesc" /> + <rng:ref name="actor" /> + <rng:ref name="perfRes" /> + </rng:choice> + </rng:oneOrMore> + </content> + <remarks> + <p part="N">This element is modelled on an element in the Text Encoding Initiative (TEI) standard.</p> + </remarks> + </elementSpec></pre> + + + <p> + المنت <em><castItem></em> مشخصات بسیار کوتاهی دارد، که با این حال اطلاعات زیادی در مورد آن ارائه + می‌دهد. اول، نام المنت در خصیصه <strong>@ident</strong> در المنت <elementSpec> مشخص شده است. علاوه + بر این، ماژولی که به آن تعلق دارد با خصیصه <strong>@module</strong> تعیین شده است. ماژول + <em>MEI.shared</em> که در اینجا استفاده شده است به عنوان پشتیبان برای بسیاری از المنت‌های عمومی عمل می‌کند + که + به خوبی در سایر ماژول‌ها قرار نمی‌گیرند یا برای استفاده از MEI ضروری هستند. + </p> + <p> + سپس یک المنت <em><desc></em> مشاهده می‌کنیم که توضیحی بسیار مختصر از هدف و دامنه المنت مورد نظر ارائه + می‌دهد. این اطلاعات اغلب به عنوان یک نکته راهنما در نرم‌افزارها استفاده می‌شود تا یک کدگذار را به استفاده از + المنت‌های مناسب راهنمایی کند. بنابراین، توضیح روشن بسیار حائز اهمیت است. + </p> + <p> + قطعه اطلاعات بعدی با المنت <strong><classes></strong> ارائه می‌شود، که تعیین می‌کند این المنت به کدام + <em>کلاس‌ها</em> تعلق دارد. ما این موضوع را در ادامه با جزئیات بیشتری بررسی خواهیم کرد، اما به طور کلی + این‌ها در واقع گروه‌هایی از خصیصه‌ها هستند که می‌توانند برای عناصر عضو استفاده شوند. + </p> + <p> + سرانجام، ویژگی <strong>content</strong> را می‌بینیم. هر المنت XML باید به وضوح تعیین کند که چه نوع محتوایی + ممکن است شامل شود. در اینجا، المنت می‌تواند شامل یک یا چند زیرالمنت شود که شامل <em><role></em>، + <em><roleDesc></em>، <em><actor></em> یا <em><perfRes></em> می‌شوند، اما متن ساده نیز + قابل قبول است. + <br> + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-06.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-06.html new file mode 100644 index 00000000..3f6ec2f7 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-06.html @@ -0,0 +1,153 @@ +<div> + <p> + همان‌طور که دیدیم، ODD این امکان را می‌دهد که مشخص کنید درون یک المنت + خاص، دقیقاً چه المنت‌هایی به عنوان فرزند مجاز + هستند. این قابلیت، کنترل بسیار دقیقی روی سلسله‌مراتب عناصر MEI فراهم می‌کند، اما به قیمت فهرست‌بندی مفصل و + طولانی از آنچه هر المنت ممکن است دربرداشته باشد! نگهداری و + دنبال‌کردن چنین روشی آسان + نیست چون برخی از المنت‌ها در MEI می‌توانند ده‌ها المنت دیگر را شامل شوند، و مقایسه‌ی چنین المنتهایی باهم، + فرایند زمانبری است. + </p> + <p> + مثلاً، المنت + <a href="https://music-encoding.org/guidelines/v4/elements/castitem.html" target="_blank" + rel="noopener, noreferrer"><castItem></a> + از مرحله‌ی اخیر این آموزش یک المنت فرزند + <a href="https://music-encoding.org/guidelines/v4/elements/role.html" target="_blank" + rel="noopener, noreferrer"><role></a> دارد. مستندات + برای <em><role></em> شامل ۵۴ المنت فرزند به‌علاوه محتوای متنی است: + </p> + <div> + <img style="width: 100%;" src="./role-children.png"> + </div> + <p>اما با مشاهده<em><elementSpec></em>;میبینیم که چنین فهرستی وجود ندارد: + </p> <pre class="codeblock"><elementSpec ident="role" module="MEI.shared"> + <desc>Name of a dramatic role, as given in a cast list.</desc> + <classes> + <memberOf key="att.common"/> + <memberOf key="att.facsimile"/> + <memberOf key="att.lang"/> + </classes> + <content> + <rng:zeroOrMore> + <rng:choice> + <rng:text/> + <rng:ref name="model.textPhraseLike.limited" /> + </rng:choice> + </rng:zeroOrMore> + </content> + <remarks> + <p part="N">This element is modelled on an element in the Text Encoding Initiative (TEI) standard.</p> + </remarks> +</elementSpec></pre> + <p> + به جای ۵۴ المنت از تصویر بالا، تنها یک ارجاع<em><rng:ref></em> داده شده است که به چیزی به نام + <em>model.textPhraseLike.limited</em> اشاره می‌کند. این یک <strong>کلاسِ مدل</strong> است. کلاس‌های مدل به + عنوان جایگزینی برای گروه‌هایی از المنت‌ها در نظر گرفته می‌شوند. خود کلاس مدل نمی‌داند که کدام المنت‌ها را شامل + می‌شود: + </p> + <pre class="codeblock"><classSpec ident="model.textPhraseLike.limited" module="MEI.shared" type="model"> + <desc>Groups textual elements that occur at the level of individual words or phrases. This class is equivalent to the model.textPhraseLike class without the pb element.</desc> + <classes> + <memberOf key="model.rdgPart.text"/> + <memberOf key="model.editTransPart.text"/> + <memberOf key="model.textPhraseLike"/> + </classes> +</classSpec></pre> + <p> + کلاسِ مدل با یک المنت + <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-classSpec.html" target="_blank" + rel="noopener, noreferrer"><classSpec></a> کدگذاری شده است، + که دارای خصیصه<strong>@type="model"</strong> است. مانند المنت‌ها، با استفاده از + خصیصه <strong>@ident</strong> به طور منحصربه‌فرد شناسایی می‌شود و مختص به یکی از ماژول‌های MEI با + خصیصه<em>@module</em> است. + MEI از این قرارداد پیروی می‌کند که تمام نام‌های کلاس مدل با رشته متنی "<em>model.</em>" شروع می‌شوند. همچنین همیشه + یک <em><desc></em> با توضیح مختصری از هدف گروه دارند. بیایید عناصر <em><memberOf></em> را در + <em><classSpec></em> از مثال بالا موقتا نادیده بگیریم و ببینیم که چگونه آن ۵۴ المنتی که بالاتر دیدیم + به + <em>model.textPhraseLike.limited</em> پیوند داده می‌شوند. + </p> + <p> + اگر به مستندات MEI برای + <a href="https://music-encoding.org/guidelines/v4/model-classes/model.textphraselike.limited.html#members" + target="_blank" rel="noopener, noreferrer">model.textPhraseLike.limited</a> + برویم، می‌بینیم که شش المنت به‌صورت مستقیم "<em>اعضا</em>" این کلاس مدل هستند: <em><dedicatee></em>, + <em><dimensions></em>, + <em><extent></em>، <em><seg></em>، <em><symbol></em>، و <em><term></em>. حالا بیایید + نگاهی به <em><dedicatee></em> بیاندازیم: + </p> + <pre class="codeblock"><elementSpec ident="dedicatee" module="MEI.shared"> + <desc>Entity to whom a creative work is formally offered.</desc> + <classes> + <-- other memberShips removed for brevity --> + <memberOf key="model.textPhraseLike.limited"/> + </classes> + <content> + <rng:zeroOrMore> + <rng:choice> + <rng:text/> + <rng:ref name="model.textPhraseLike.limited" /> + </rng:choice> + </rng:zeroOrMore> + </content> + <-- constraintSpec removed for brevity--> + </elementSpec></pre> + <p> + این المنت دارای یک المنت <em><memberOf></em> است که از خصیصه <strong>@key</strong> برای ارجاع به کلاس + مدل + <em>model.textPhraseLike.limited</em> استفاده می‌کند. بنابراین، یک المنت ادعای عضویت در یک کلاس مدل مشخص را + می‌کند + و به‌طور خودکار در هر جایی که این کلاس مدل به‌عنوان محتوا مجاز باشد، مجاز خواهد بود. یک نکته جانبی: + این بدین معناست که <em><dedicatee></em> می‌تواند خودش را هم شامل شود. (یک المنت dedicatee می‌تواند + یک dedicatee دیگر را به‌عنوان المنت فرزند داشته باشد)، + که این موضوع، بیشتر یکی از ویژگیهای ذاتی سیستم کلاس‌هاست تا یک ویژگی خاص در MEI… + </p> + <p> + با این حال، در MEI معمولی تنها شش المنت به‌صورت مستقیم عضو <em>model.textPhraseLike.limited</em> هستند، اما + دیدیم که با ارجاع به این کلاس مدل، + مجموعاً 54 المنت به‌عنوان محتوای مجاز (یعنی المنت‌های فرزند) اضافه می‌شوند. 48 المنت باقی‌مانده از کجا + آمده‌اند؟ + اعتراف می‌کنیم که ارائه فعلی مستندات راهنما به‌خوبی نشان نمی‌دهد که این المنت‌های اضافی از کجا آمده‌اند. + پاسخ این است که <strong>کلاس‌های مدل، تو در تو هستند. </strong> همان‌طور که در <em><classSpec></em> + بالا دیدیم، یک کلاس مدل می‌تواند عضو یک کلاس مدل دیگر + باشد. بیایید به فرزندان مجاز المنت <em><role></em> در دیدگاه <em>کلاس محور</em> برگردیم: + </p> + <div> + <img style="width: 100%;" src="./role-children-byclass.png"> + </div> + <p> + ما شش فرزند مستقیم را می‌بینیم، اما همچنین <em><fig></em> را زیرمجموعه تگ <em>model.figureLike</em> + فهرست‌شده و <em><catchwords></em> + و <em><fingerprint></em> از <em>model.msInline</em> آمده‌اند. + <a href="https://music-encoding.org/guidelines/v4/elements/role.html#mayContain" target="_blank" + rel="noopener, noreferrer">این فهرست</a> ادامه دارد و منشا همه + 54 المنت را توضیح می‌دهد. اگر به <em>model.figureLike</em> نگاهی بیاندازیم، می‌بینیم که این کلاس یک + <em><memberOf></em> دارد که به <em>model.textPhraseLike.limited</em> اشاره می‌کند: + </p> <pre class="codeblock"><classSpec ident="model.figureLike" module="MEI.figtable" type="model"> + <desc>Groups elements representing or containing graphic information such as an illustration or figure.</desc> + <classes> + <memberOf key="model.textPhraseLike.limited"/> + </classes> +</classSpec></pre> + <p> + بنابراین، <em>model.figureLike</em> عضوی از <em>model.textPhraseLike.limited</em> است، یعنی هر + جایی که <em>model.textPhraseLike.limited</em> به‌عنوان محتوای فرزند مجاز باشد، <em>model.figureLike</em> (و + همه المنت‌هایی که عضو آن هستند) نیز مجاز خواهند بود. عمیق‌ترین <em>تودرتویی</em> کلاس‌ها در + <em>model.textPhraseLike.limited</em> در واقع سه لایه است: <em>model.nameLike.geogName</em> عضو + <em>model.nameLike.place</em> است، که عضو <em>model.nameLike</em> است، که عضو + <em>model.textPhraseLike.limited</em> است. + همه المنت‌هایی که عضو هر یک از این کلاس‌ها هستند به‌عنوان فرزندان هر المانی که <em><rng:ref + name="model.textPhraseLike.limited" /></em> در <em><content></em> خود دارد مجاز خواهند بود. + </p> + <p> + همانطور که از نام‌ها در سلسله مراتب کلاس بالا می‌بینید، کلاس‌های خاص‌تر، اعضای کلاس‌های کلی‌تر هستند. هنگام + تلاش برای شناسایی مجموعه‌ای از المنت‌هایی که باید در یک المنت (جدید) مجاز باشند، ممکن است به‌طور عمدی کلاسی + انتخاب شود که تعدادی المنت بسیار خاص را اضافه کند، یا که طیف وسیعی از المنت‌ها را به ارمغان بیاورد. این + سیستم کلاس مدل‌ها کار را بسیار آسان می‌کند تا محتویات مجاز المنت‌ها به‌طور بسیار انتخابی تعیین شود. همچنین + اضافه کردن المنت‌های جدید به MEI را بسیار آسان می‌کند: با عضویت در کلاس‌های مدل موجود، این المنت‌ها به‌طور + خودکار در طرح‌واره در تمام مکان‌هایی که آن کلاس‌های مدل از قبل مجاز هستند، قرار خواهند گرفت. + </p> + <p> + حالا بیایید به <em>خصیصه‌ها</em> برویم، که به شیوه‌ای بسیار مشابه مدیریت می‌شوند. + </p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-07.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-07.html new file mode 100644 index 00000000..67ab7c89 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-07.html @@ -0,0 +1,154 @@ +<div> + + + <p> + همان‌طور که در مرحله قبل دیدیم، بخش زیادی از سلسله‌مراتب MEI از طریق استفاده از کلاس‌های مدل شکل می‌گیرد. + ODD برای دادن خصیصه‌ها به المنت‌های مخلتف هم از مکانیزم مشابهی استفاده می‌کند. اما قبل از بررسی + کلاس‌های خصیصه، بیایید نگاهی کوتاه به تعریف یک خصیصه در ODD بیندازیم. خصیصه <em>@xml:id</em> در هر + المنت MEI موجود است و با مشخصات زیر تعریف شده است: + </p> + <pre class="codeblock"><attDef ident="xml:id" usage="opt"> + <desc>Regularizes the naming of an element and thus facilitates building links between it and other resources. Each id attribute within a document must have a unique value.</desc> + <datatype maxOccurs="1" minOccurs="1"> + <rng:data type="ID"/> + </datatype> + </attDef></pre> + <p> + خصیصه‌ها با استفاده از المنت <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-attDef.html" + target="_blank" rel="noopener, noreferrer"><attDef></a> + معرفی می‌شوند و از برخی از قواعدی که قبلاً روی المنت‌ها و کلاس‌های مدل دیده‌ایم، پیروی می‌کنند: نام آنها در خصیصه‌ی + <em>@ident</em> ارائه می‌شود و دارای یک المنت <em><desc></em> با توضیح مختصر هستند. چیزی که قبلتر در معرفی المنت نداشتیم و حالا در معرفی خصیصه‌ها داریم، خصیصه + <strong>@usage</strong> است که مورد استفاده از خصیصه را مشخص می‌کند. در اینجا، "<em>opt</em>"، برای + خصیصه‌های اختیاری استفاده می‌شود – <em>@xml:id</em> می‌تواند روی همه المنت‌های MEI استفاده شود، اما الزامی به + استفاده آن نیست. مقادیر دیگر مجاز برای <em>@usage</em> شامل "<em>req</em>" (الزامی) و "<em>rec</em>" (توصیه‌شده + در صورت لزوم) هستند. + </p> + <p> + حالا ببینیم این المنت‌های <em><attDef></em> کجا قرار دارند. گاهی اوقات خصیصه‌ها در همان المنتی که باید استفاده شوند تعریف می‌شوند (حتی اگر این راه را ترجیح ندهیم)، مانند خصیصه <em>@type</em> در <a + href="https://music-encoding.org/guidelines/v4/elements/meihead.html" target="_blank" + rel="noopener, noreferrer"><meiHead></a>: + </p> + <pre class="codeblock"><elementSpec ident="meiHead" module="MEI.header"> + <desc>(MEI header) – Supplies the descriptive and declarative metadata prefixed to every + MEI-conformant text.</desc> + <classes> + <!-- memberOf elements skipped for brevity --> + </classes> + <content> + <!-- contents skipped for brevity --> + </content> + <!-- constraintSpecs skipped for brevity --> + <attList> + <attDef ident="type" usage="opt"> + <desc>Specifies the kind of document to which the header is attached, for example whether it + is a corpus or individual text.</desc> + <valList type="closed"> + <valItem ident="music"> + <desc>Header is attached to a music document.</desc> + </valItem> + <valItem ident="corpus"> + <desc>Header is attached to a corpus.</desc> + </valItem> + <valItem ident="independent"> + <desc>Header is independent; i.e., not attached to either a music or a corpus + document.</desc> + </valItem> + </valList> + </attDef> + </attList> + <!-- remarks skipped for brevity --> + </elementSpec></pre> + <p> + همان‌طور که می‌بینیم، خصیصه‌ها تنها در یک المنت <em><attList></em> درون <em><elementSpec></em> قرار + دارند. با این حال، در بیشتر موارد، خصیصه‌ای در نظر گرفته شده است که در بیش از یک المنت موجود باشد. خصیصه + <em>@xml:id</em> که در بالا معرفی شد در هر المنت MEI موجود است، بنابراین باید چند صد بار تعریف شود – اینطوری، هم کارآمد نیست، هم نگهداری و ویرایشش دشوار است. در عوض، ODD بار دیگر از یک سیستم کلاس استفاده می‌کند، این بار برای + <strong>کلاس‌های خصیصه</strong>. بیایید ببینیم چگونه <em>@xml:id</em> واقعاً در MEI از طریق کلاس خصیصه + <em>att.id</em> توزیع می‌شود: + </p> + <pre class="codeblock"><classSpec ident="att.id" module="MEI.shared" type="atts"> + <desc>Attributes that uniquely identify an element.</desc> + <attList org="group"> + <attDef ident="xml:id" usage="opt"> + <!-- skipping this, as it is the very same as in the example above --> + </attDef> + </attList> + </classSpec></pre> + <p> + قبلاً المنت <em><attDef></em> را دیده‌ایم و تفاوتی بین خصیصه‌هایی که درون یک المنت یا درون یک کلاس خصیصه + تعریف شده‌اند وجود ندارد. اما همچنین قبلاً المنت <a + href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-classSpec.html" target="_blank" + rel="noopener, noreferrer"><classSpec></a> را در کلاس‌های مدل دیده‌ایم. تنها تفاوت این است که کلاس‌های + خصیصه از خصیصه <strong>@type="atts"</strong> استفاده می‌کنند، و در حالی که نام کلاس‌های مدل با "<em>model.</em>" + شروع می‌شود، نام کلاس‌های خصیصه در MEI همیشه با "<em>att.</em>" شروع می‌شود. + </p> + <p> + در اوایل این آموزش، تعریف المنت <a href="https://music-encoding.org/guidelines/v4/elements/role.html" + target="_blank" rel="noopener, noreferrer"><role></a> را دیدیم. بیایید دوباره به آن نگاهی بیندازیم و + برخی قسمت‌های آن را نادیده بگیریم: + </p> + <pre class="codeblock"><elementSpec ident="role" module="MEI.shared"> + <desc>Name of a dramatic role, as given in a cast list.</desc> + <classes> + <memberOf key="att.common"/> + <memberOf key="att.facsimile"/> + <memberOf key="att.lang"/> + </classes> + <!-- skipping content and remarks here --> + </elementSpec></pre> + <p> + بر این اساس، <em><role></em> عضو کلاس‌های خصیصه <em>att.common</em>، <em>att.facsimile</em> و + <em>att.lang</em> است، اما نه <em>att.id</em>. با این حال، مستندات <em><role></em> بیان می‌کند که + <em>@xml:id</em> در دسترس است. پاسخ این است که اینجا هم از <em>کلاس‌های تو در تو</em> استفاده شده. + <em><role></em> به کلاس خصیصه <em>att.common</em> عضو می‌شود و همه خصیصه‌های آن کلاس را به دست می‌آورد (که + در واقع هیچ کدام نیستند). در عوض، <em>att.common</em> خود عضو کلاس خصیصه <em>att.basic</em> می‌شود (که خصیصه + <em>@xml:base</em> را اضافه می‌کند)، و عضو کلاس خصیصه <em>att.id</em> می‌شود که در نهایت خصیصه + <em>@xml:id</em> را اضافه می‌کند. برای دیدن این مکانیزم در عمل، بیایید نگاهی کوتاه به <em>att.common</em> + بیندازیم: + </p> + + + + <pre class="codeblock"><classSpec ident="att.common" module="MEI.shared" type="atts"> + <desc>Attributes common to many elements.</desc> + <classes> + <memberOf key="att.basic"/> + <memberOf key="att.labelled"/> + <memberOf key="att.linking"/> + <memberOf key="att.nNumberLike"/> + <memberOf key="att.responsibility"/> + <memberOf key="att.typed"/> + </classes> + </classSpec></pre> + <p> + باز هم، از طریق استفاده از یک المنت <em><memberOf></em> با <em>@key</em> مناسب، عضویت در کلاس‌های + مختلف در + MEI محقق می‌شود، پس این مکانیزم باید برای شما آشنا باشد. و مانند <em>کلاس‌های مدل</em>، <em>کلاس‌های + خصیصه</em> نیز از کلاس‌های نسبتاً عمومی تا مجموعه‌های خاص‌تر از خصیصه‌های هم‌راستا استفاده می‌کنند. با + عضو شدن در کلاس(های) خصیصه مناسب، یک المنت می‌تواند دقیقاً مجموعه مناسب از خصیصه‌ها را به دست آورد و این امکان + وجود + دارد که به صورت انتخابی خصیصه‌ها را به المنت‌های جدید یا موجود اضافه یا از آنها حذف کنیم. + </p> + <p> + مشخصات <em>att.common</em> که در بالا مشاهده می‌شود، کلاس خصیصه دیگری به نام <em>att.typed</em> را می‌آورد که + یک + خصیصه <em>@type</em> را فراهم می‌کند. واضح است که این خصیصه در <em><meiHead></em> استفاده نشده است، + همانطور که + در بالا دیده می‌شود. دلیل این امر این است که کلاس خصیصه، یک خصیصه <em>@type</em> را فراهم می‌کند که تنها یک + توضیح بسیار عمومی دارد: <em>تعیین‌کننده‌ای که المنت را از نظر خاصی توصیف می‌کند و از هر طرح یا طبقه‌بندی + مناسب + که برچسب‌های تک‌کلمه‌ای را به کار می‌برد، استفاده می‌کند.</em> در مقایسه با آن، <em>@type</em> در + <em><meiHead></em> + تعریف بسیار دقیقی داشت. به طور کلی، MEI سعی می‌کند از استفاده از همان نام خصیصه با تعاریف چندگانه اجتناب + کند، + اما این همیشه ممکن نیست و حداقل + باعث سردرگمی <em>فنی</em> نمی‌شود. با دیدگاه "بر اساس کلاس" در مورد خصیصه‌ها (به مشخصات <a + href="https://music-encoding.org/guidelines/v4/elements/meihead.html#attributes" target="_blank" + rel="noopener, noreferrer"><meiHead></a> )، می‌توان به راحتی پیگیری کرد که هر خصیصه مجاز از + کجا + آمده است. + </p> + <p> + تنها بخش بزرگی که برای درک ODD + باقی‌مانده، «نوع داده‌ها» است که در مرحله + بعدی این آموزش معرفی خواهد شد.</p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-08.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-08.html new file mode 100644 index 00000000..f4783b82 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-08.html @@ -0,0 +1,174 @@ +<div> + <p> + بیشتر انواع داده‌ها در ODD از مفاهیم شناخته‌شده پیروی می‌کنند: اعداد صحیح، مقادیر boolean (true or false)، + رشته‌های متنی و غیره. بیایید نگاهی دقیق‌تر به برخی از آن‌ها داشته باشیم. خصیصه <em>@n</em> در کلاس خصیصه + <em><a + href="https://music-encoding.org/guidelines/v4/attribute-classes/att.ninteger.html">att.nInteger</a></em> + به این صورت تعریف شده است: + </p> + <pre class="codeblock"><attDef ident="n" usage="opt"> + <desc>Provides a numeric designation that indicates an element's position in a sequence of similar elements. Its value must be a non-negative integer.</desc> + <datatype maxOccurs="1" minOccurs="1"> + <rng:data type="nonNegativeInteger"/> + </datatype> + </attDef></pre> + <p> + این‌جا از یک المنت <em><data></em> از نام‌حوزه <em>rng:</em> استفاده شده، که <em>@type</em> از یک + مقدار تعریف شده در RelaxNG استفاده می‌کند. خصیصه‌های <em>@maxOccurs</em> و <em>@minOccurs</em> مشخص می‌کنند + این «نوعِ داده» چند بار ممکن است مقداردهی شود. در<em>att.staffIdent</em> می‌توان مثالی دیگر یافت برای مقادیری که در +خصیصه <em>@staff</em> تعریف شده‌اند + این خصیصه برای ارتباط <a + href="https://music-encoding.org/guidelines/v4/content/introduction.html#eventsControlevents" target="_blank" + rel="noopener, noreferrer">کنترل‌رویدادها</a> + با یک یا چند خط حامل استفاده می‌شود و ممکن است یک یا چند عدد صحیح نگهداری کند. از + <a href="https://music-encoding.org/guidelines/v4/attribute-classes/att.staffident.html + < target="_blank" rel="noopener, noreferrer" + نشانه‌گذاری زیر</a> + + برای دستیابی به این هدف استفاده می‌کند:</p> + <pre class="codeblock"><datatype maxOccurs="unbounded" minOccurs="1"> + <rng:data type="positiveInteger"/> + </datatype></pre> + <p> + در موارد دیگر، MEI انواع داده خاص خود را تعریف می‌کند. این کار با یک المنت + <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-macroSpec.html" target="_blank" + rel="noopener, noreferrer"><macroSpec></a> انجام می‌شود. + بیایید نگاهی به نوع داده + <em><a href="https://music-encoding.org/guidelines/v4/data-types/data.barrendition.html" target="_blank" + rel="noopener, noreferrer">data.BARRENDITION</a></em> که برای تعریف ظاهر خطوط میزان استفاده می‌شود، + بیاندازیم: + </p> + <pre class="codeblock"><macroSpec ident="data.BARRENDITION" module="MEI" type="dt"> + <desc>Renderings of bar lines. Some values correspond to the Western Musical Symbols portion of the Unicode Standard.</desc> + <content> + <valList type="closed"> + <valItem ident="dashed"> + <desc>Dashed line (Unicode 1D104).</desc> + </valItem> + <valItem ident="dotted"> + <desc>Dotted line.</desc> + </valItem> + <valItem ident="dbl"> + <desc>(Unicode 1D101).</desc> + </valItem> + <valItem ident="dbldashed"> + <desc>Double dashed line.</desc> + </valItem> + <valItem ident="dbldotted"> + <desc>Double dotted line.</desc> + </valItem> + <valItem ident="end"> + <desc>(Unicode 1D102).</desc> + </valItem> + <valItem ident="invis"> + <desc>Bar line not rendered.</desc> + </valItem> + <valItem ident="rptstart"> + <desc>Repeat start (Unicode 1D106).</desc> + </valItem> + <valItem ident="rptboth"> + <desc>Repeat start and end.</desc> + </valItem> + <valItem ident="rptend"> + <desc>Repeat end (Unicode 1D107).</desc> + </valItem> + <valItem ident="single"> + <desc>(Unicode 1D100).</desc> + </valItem> + </valList> + </content> + </macroSpec></pre> + <p> + دوباره خصیصه‌های <em>@ident</em> و <em>@module</em> به کار رفته‌اند و همانطور که قبلاً دیده‌ایم، یک المنت + <em><desc></em> نیز وجود دارد. چیزی که مهم است، خصیصه <em>@type</em> با مقداری از "<em>dt</em>" (نوعِ + داده) است. + بر اساس قرارداد، تمام نام‌های نوعِ داده با "<em>data.</em>" شروع می‌شوند و نام بعدی به صورت تمام حروف بزرگ + داده می‌شود. + سپس لیستی از مقادیر (valList) داریم که در این مورد، یک لیست بسته است. به این معنی که تمام مقادیر ممکن در + اینجا فهرست شده‌اند. در موارد دیگر، خصیصه <em>@type</em> با مقدار "<em>semi</em>" نشان‌دهنده یک لیست + نیمه‌بسته است. چنین لیستی توصیه‌هایی ارائه می‌کند، اما به کاربر اجازه می‌دهد در صورت عدم تطابق هیچ یک از + پیشنهادات با وضعیت فعلی، مقادیر سفارشی ایجاد کند. + این معمولاً تعادل خوبی بین اطمینان از سازگاری و امکان توسعه بر اساس نیاز از طرح‌واره را فراهم می‌کند. + </p> + <p> +انواع داده هم مانند کلاس‌های <em>مدل</em> و <em>خصیصه</em>، + می‌توانند تو در تو باشند. یک مثال برای این مورد، نوع داده + <em><a href="https://music-encoding.org/guidelines/v4/data-types/data.noteheadmodifier.html" target="_blank" + rel="noopener, noreferrer">data.NOTEHEADMODIFIER</a></em> است: + </p> + <pre class="codeblock"><macroSpec ident="data.NOTEHEADMODIFIER" module="MEI" type="dt"> + <desc>Captures any notehead "modifiers"; that is, symbols added to the notehead, such as slashes, lines, text, and enclosures, etc.</desc> + <content> + <rng:choice> + <rng:ref name="data.NOTEHEADMODIFIER.list" /> + <rng:ref name="data.NOTEHEADMODIFIER.pat" /> + </rng:choice> + </content> + </macroSpec></pre> + <p> + این بدان معنی است که خصیصه‌ای که از نوع داده <em>data.NOTEHEADMODIFIER</em> استفاده می‌کند، مقادیری را قبول + خواهد کرد که از قوانین نوع داده <em>data.NOTEHEADMODIFIER.list</em> یا <em>data.NOTEHEADMODIFIER.pat</em> + پیروی می‌کنند. + </p> + <p> + آخرین نوع داده‌ای که می‌خواهیم معرفی کنیم <em>data.COLORVALUES</em> است که در <em>data.COLOR</em> استفاده + می‌شود و به برای کنترل مقادیر خصیصه‌هایی مانند <em>@color</em> (از طریق + <em><a href="https://music-encoding.org/guidelines/v4/attribute-classes/att.color.html" target="_blank" + rel="noopener, noreferrer">att.color</a></em>) + و <em>@linecolor</em> (از طریق <em>att.linecolor</em>) استفاده به کار می‌رود. + </p> + <pre class="codeblock"><macroSpec ident="data.COLORVALUES" module="MEI" type="dt"> + <desc>Parameterized color values</desc> + <content> + <rng:choice> + <rng:data type="token"> + <rng:param name="pattern">#[0-9A-Fa-f]{6,6}</rng:param> + </rng:data> + <rng:data type="token"> + <rng:param name="pattern">#[0-9A-Fa-f]{8,8}</rng:param> + </rng:data> + <rng:data type="token"> + <rng:param name="pattern"> + rgb\((\s*(([01]?[0-9]?[0-9])|2[0-4][0-9]|25[0-5])\s*,\s*){2} + ([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*\) + </rng:param> + </rng:data> + <rng:data type="token"> + <rng:param name="pattern"> + rgba\(\s*(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\s*,\s*){3}( + 0(\.\d+)?|1(\.0+)?)\s*\)|rgba\(\s*(((\d{1,2})?%|100%)\s*,\s* + ){2}(\d{1,2}%|100%)\s*,\s*(0(\.\d+)?|1(\.0+)?)\s*\) + </rng:param> + </rng:data> + <rng:data type="token"> + <rng:param name="pattern"> + hsl\(\s*((\d{1,2})|[12]\d{2}|3[0-5]\d|360)\s*,\s*(\d{1,2}%|1 + 00%)\s*,\s*(\d{1,2}%|100%)\s*\) + </rng:param> + </rng:data> + <rng:data type="token"> + <rng:param name="pattern"> + hsla\(\s*(\d{1,2}|[12]\d{2}|3[0-5]\d|360)\s*,\s*(\d{1,2}%|10 + 0%)\s*,\s*(\d{1,2}%|100%)\s*,\s*(0(\.\d+)?|1(\.0+)?)\s*\) + </rng:param> + </rng:data> + </rng:choice> + </content> + </macroSpec></pre> + + + <p> + المنت <em><rng:choice></em> که دور المنت‌های مختلف <em><rng:data></em> قرار دارد، بیان می‌کند که + مقدار خصیصه <em>@color</em> باید با یکی از الگوهای regex موجود مطابقت داشته باشد. + توضیح مفهوم <u>عبارات باقاعده</u> (Regular Expressions - Regex) خارج از حیطه این آموزش است – در اصل، + روشی برای توصیف یک الگو برای یک رشته‌ی متنی است و می‌تواند برای بررسی تطابق آن رشته با الگو استفاده شود. + نقطه شروع خوبی برای آشنایی با عبارات باقاعده، <strong>جدول کلمات متقاطع Regex</strong> است که در <a + href="https://regexcrossword.com/" target="_blank" + rel="noopener, noreferrer">https://regexcrossword.com/</a> در دسترس است. + </p> + <p>بسیاری دیگر از انواع داده‌هاوجود دارد که می‌توان از آن‌ها استفاده کرد، اما چون تودرتویی معمولاً به اندازه + کلاس‌های <em>مدل</em> یا <em>خصیصه</em> عمیق نیست، انواع داده‌ها اغلب هنگام ورود به ODD دسترس‌پذیرتر در نظر + گرفته می‌شوند – قطعاً برای یادگیری آن‌ها موارد کمتری وجود دارد. پس بیایید به <em>ماکروها</em> برویم. + </p> + +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-09.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-09.html new file mode 100644 index 00000000..5a45d7e4 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-09.html @@ -0,0 +1,62 @@ +<div> + <p> + ماکروها آخرین بخش ODD هستند که شناختنشان برای درک کامل مشخصات MEI لازم است، و به وضوح کم‌اهمیت‌ترین جنبه به شمار + می‌آیند. ماکروها به عنوان جایگزینی برای المنت‌ها عمل می‌کنند که می‌توانند به صورت یکجا به + <em><content></em> یک المنت اضافه شوند. احتمالاً پرکاربردترین ماکرو + <em>macro.struc-unstrucContent</em> است که به شرح زیر تعریف شده است: + </p> + <pre class="codeblock"><macroSpec ident="macro.struc-unstrucContent" module="MEI.shared" type="pe"> + <desc>Provides a choice between structured and unstructured/mixed content.</desc> + <content> + <rng:choice> + <rng:group> + <rng:zeroOrMore> + <rng:ref name="model.headLike" /> + </rng:zeroOrMore> + <rng:zeroOrMore> + <rng:ref name="model.pLike" /> + </rng:zeroOrMore> + </rng:group> + <rng:zeroOrMore> + <rng:choice> + <rng:text/> + <rng:ref name="model.textPhraseLike.limited" /> + </rng:choice> + </rng:zeroOrMore> + </rng:choice> + </content> + </macroSpec></pre> + <p> + ماکروها دوباره از المنت <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-macroSpec.html" + target="_blank" rel="noopener, noreferrer"><em><macroSpec></em></a> استفاده می‌کنند، اما این بار + با خصیصه <em>@type</em> با مقدار "<em>pe</em>". نام‌ها، با پیشوند "<em>macro.</em>" در <em>@ident</em> ذخیره می‌شوند. و البته دوباره <em><desc></em> نیز داریم. تفاوت اصلی با + <em>کلاس‌های مدل</em> این است که <em>ماکرو</em>ها فقط جایگزین المنت‌ها نیستند، بلکه برای قوانین پیچیده‌تری + هم در مورد ترکیب المنت‌ها استفاده می‌شوند. در اینجا، <em>macro.struc-unstrucContent</em> نمونه خوبی است. این + ماکرو کاربر را مجبور می‌کند تا بین یک مدل رمزگذاری ساختاریافته (با استفاده از یک المنت <em><head></em> + اختصاصی که بعد از آن چندین پاراگراف می‌آید) یا یک مدل غیرساختاریافته (که در آن محتوای متنی مستقیماً وارد می‌شود + و می‌تواند با المنت‌های مختلفی علامت‌گذاری شود) تصمیم بگیرد. می‌توان آن را داخل المنت‌هایی مانند + <em><watermark></em> استفاده کرد و به جلوگیری از تعریف مجدد ترکیب یکسان المنت‌ها در مکان‌های متعدد کمک + می‌کند. + </p> + <pre class="codeblock"><elementSpec ident="watermark" module="MEI.header"> + <desc>Contains a description of a watermark or similar device.</desc> + <classes> + <!-- memberships skipped for brevity --> + </classes> + <content> + <rng:ref name="macro.struc-unstrucContent" /> + </content> + <!-- remarks skipped for brevity --> + </elementSpec></pre> + <p> + به طور کلی، <em><rng:ref></em> داخل <em><elementSpec></em> فقط با المنت‌های فرزند + <em><macroSpec></em> در <em><content></em> جایگزین می‌شود، به طوری که امکان ترکیب یک + <em>ماکرو</em> با محتویات دیگر وجود دارد. به این ترتیب، <em>ماکرو</em>ها به عنوان بلوک‌های مشخصات از پیش + تعریف شده و قابل استفاده مجدد عمل می‌کنند. + </p> + <p> + همان‌طور که قبلاً ذکر شد، <em>ماکروها</em> از دید MEI جنبه مهمی از ODD نیستند، و بنابراین شما باید تا این + مرحله تمامی موارد لازم را فرا گرفته باشید. این یعنی این درس، با این مرحله پایانی تمام شده‌است – برای برخی نکات + پایانی روی دکمه ادامه کلیک کنید... + </p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd-end.html b/_tutorials-FA/180_understanding_odd/180_understanding_odd-end.html new file mode 100644 index 00000000..60e2dc14 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd-end.html @@ -0,0 +1,18 @@ +<div> + <p> + <strong>تبریک!</strong> شما موفق شدید این مقدمه به ODD را از دید MEI پشت سر بگذارید. اکنون باید با تمامی + عوامل بنیادین سازنده مشخصات MEI آشنا شده باشید. این مسیر سختی بوده است و شاید لازم باشد چندین بار + آن را بازخوانی کنید تا واقعاً با آن آشنا شوید. مهم است به یاد داشته باشید نسخه ODD که MEI در حال حاضر + استفاده می‌کند کمی قدیمی است و ممکن است به طور کامل با مستندات TEI همسو نباشد. با این حال، تمامی ابزارها و + فرآیندهای MEI به درستی با این نسخه کار می‌کنند، بنابراین از دید MEI مشکلی وجود ندارد. + </p> + <p> + مرحله بعدی از اینجا، یادگیری چگونگی نوشتن <strong>شخصی‌سازی‌های MEI + </strong> واقعی با استفاده از ODD است. + برای این کار یک آموزش جداگانه وجود دارد (یا به زودی خواهد بود...)، که به جزئیات آن فرایند خواهد پرداخت. این + شخصی‌سازی‌ها از برخی مفاهیم اضافی در بالای آنچه که تاکنون آموخته‌اید استفاده خواهد کرد، اما درک کامل مفاهیم + پایه‌ای برای این مرحله ضروری است. به محض اینکه احساس کنید ODD را تا اینجا درک کرده‌اید، این سطح اضافی نباید + دیگر شما را نگران کند. و با شخصی‌سازی‌های مناسب، قادر خواهید بود از MEI به‌طور تخصصی برای نیازهای خود + استفاده کنید :) + </p> +</div> diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd.json b/_tutorials-FA/180_understanding_odd/180_understanding_odd.json new file mode 100644 index 00000000..f2b98c83 --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd.json @@ -0,0 +1,47 @@ +{ + "steps": [ + { + "label":"Introduction", + "descFile": "180_understanding_odd-01.html" + }, + { + "label":"Background", + "descFile": "180_understanding_odd-02.html" + }, + { + "label":"ODD", + "descFile": "180_understanding_odd-03.html" + }, + { + "label":"Modules", + "descFile": "180_understanding_odd-04.html" + }, + { + "label":"Elements", + "descFile": "180_understanding_odd-05.html" + }, + { + "label":"Models", + "descFile": "180_understanding_odd-06.html" + }, + { + "label":"Attributes", + "descFile": "180_understanding_odd-07.html" + }, + { + "label":"Datatypes", + "descFile": "180_understanding_odd-08.html" + }, + { + "label":"Macros", + "descFile": "180_understanding_odd-09.html" + } + ], + "end":"180_understanding_odd-end.html", + "resp":[ + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +} \ No newline at end of file diff --git a/_tutorials-FA/180_understanding_odd/180_understanding_odd.md b/_tutorials-FA/180_understanding_odd/180_understanding_odd.md new file mode 100644 index 00000000..fa9d2acf --- /dev/null +++ b/_tutorials-FA/180_understanding_odd/180_understanding_odd.md @@ -0,0 +1,7 @@ +--- +layout: tutorials +type: tutorial +name: "سطح پیشرفته: درک ODD" +fullname: "درس پیشرفته درباره ساختار درونی MEI" +data: "180_understanding_odd.json" +--- diff --git a/_tutorials-FA/180_understanding_odd/beam-module.png b/_tutorials-FA/180_understanding_odd/beam-module.png new file mode 100644 index 00000000..6272aea2 Binary files /dev/null and b/_tutorials-FA/180_understanding_odd/beam-module.png differ diff --git a/_tutorials-FA/180_understanding_odd/role-children-byclass.png b/_tutorials-FA/180_understanding_odd/role-children-byclass.png new file mode 100644 index 00000000..5a818f86 Binary files /dev/null and b/_tutorials-FA/180_understanding_odd/role-children-byclass.png differ diff --git a/_tutorials-FA/180_understanding_odd/role-children.png b/_tutorials-FA/180_understanding_odd/role-children.png new file mode 100644 index 00000000..b83f1342 Binary files /dev/null and b/_tutorials-FA/180_understanding_odd/role-children.png differ diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei-01.html b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-01.html new file mode 100644 index 00000000..441927e6 --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-01.html @@ -0,0 +1,28 @@ + +<div> + <h1>شخصی‌سازی ODD</h1> + <p> + این درس پیشرفته، نحوه شخصی‌سازی MEI برای نیازهای خاص پروژه را معرفی می‌کند. برای فراگیری این درس، نیاز دارید که ساختارهای داخلی ODD در MEI را کاملاً درک کرده باشید (همان‌طور که در آموزش + <a href="/tutorials/180-understanding-odd.html" target="_blank" rel="noopener, noreferrer">درک ODD</a> توضیح داده شده است). اگر با المنت‌های <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-elementSpec.html" target="_blank" rel="noopener, noreferrer"><elementSpec></a>، کلاس‌های «مدل»ها و کلاس‌های «خصیصه»ها آشنا نیستید، احتمالاً بهتر + است ابتدا به <a href="/tutorials/180-understanding-odd.html" target="_blank" rel="noopener, noreferrer">آن آموزش</a> رجوع کنید. + </p> + <p> + حال بیایید درسمان را شروع کنیم. <em>هدف</em> از شخصی‌سازی‌ها، <em>محدود کردن</em> طرح‌واره MEI به بخش‌هایی از چارچوب است که مرتبط یک وظیفه یا پروژه خاص هستند. البته با استفاده از همین مکانیزم‌هایی که در اینجا توضیح داده شده‌اند امکان<em> توسعه MEI </em هم وجود دارد، اما این موضوع به یک درس دیگر موکول خواهد شد. در حال حاضر، + تمرکزمان روی زیرمجموعه‌سازی در MEI است، زیرا فایل‌هایی که در برابر چنین نسخه شخصی‌شده‌ای از MEI اعتبارسنجی شوند، در برابر شخصی‌سازی <a href="/resources/schemas.html" target="_blank" rel="noopener, noreferrer" >MEI All</a> + که نماینده چارچوب کامل MEI است هم اعتبارسنجی خواهند شد. این موضوع تضمین می‌کند که فایل، در سطح قابل‌توجهی با ابزارها و مستندات موجود سازگار خواهد بود. به طور کلی، توسعه MEI باید تنها زمانی که کاملاً ضروری است، انجام شود، و در چنین مواردی معمولاً ایده + خوبی است که با + <a href="/community/community-contacts.html" target="_blank" rel="noopener, noreferrer + جامعهMEI + </a> + مشورت کنید تا مطمئن شوید که قبلاً راه‌حل دیگری برای منظور شما وجود نداشته. + </p> + <p> + در این آموزش، ابتدا خواهیم آموخت که چگونه از <a href="https://meigarage.edirom.de/profiler" target="_blank" rel="noopener, noreferrer">MEI ProfileDrafter</a> استفاده کنیم، که یک رابط کاربری گرافیکی برای ایجاد + شخصی‌سازی‌های محدودکننده پایه ارائه می‌دهد. این ابزار بخشی از <a href="https://meigarage.edirom.de" target="_blank" rel="noopener, noreferrer">MEI Garage</a> است و با وجود اینکه کمی محدود است، به درک بهتر + مفاهیم شخصی‌سازی‌های MEI کمک می‌کند. سپس، خروجی MEI ProfileDrafter را بررسی خواهیم کرد و خواهیم دید چگونه برای اهداف اعتبارسنجی یک + فایل RelaxNG از آن تولید کنیم. در نهایت، برخی گزینه‌های پیشرفته شخصی‌سازی که فراتر از + محدوده MEI ProfileDrafter هستند را معرفی خواهیم کرد. ممکن است بخواهید در قسمتهایی، از یک برنامه ویرایشگر XML + استفاده کنید، اما ما برای تمامی پردازش‌ها از خدمات وب استفاده خواهیم کرد، بنابراین واقعاً مهم نیست کدام ویرایشگر + را انتخاب می‌کنید – هر کدام مناسب است. حال که این توضیحات به پایان رسید، بیایید شروع کنیم! +</p> +</div> diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei-02.html b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-02.html new file mode 100644 index 00000000..59383eac --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-02.html @@ -0,0 +1,26 @@ + + <div> + <p> + برای مراحل زیر، شما باید <a href="https://meigarage.edirom.de/profiler" target="_blank" rel="noopener, noreferrer">MEI ProfileDrafter</a> را در یک پنجره (یا تب) جداگانه در مرورگر باز کنید تا با این دستورالعمل پیش بروید. + </p> + <!--<div> + <img style="width: 100%;" src="./profileDrafter_overview.png"/> + </div>--> + <p> + وقتی ProfileDrafter را باز می‌کنید، در ستون مرکزی، لیستی از تمام ماژول‌های MEI مشاهده خواهید کرد. برای هر ماژول، تعداد المنت‌ها و کلاس‌های خصیصه در آن ماژول نمایش داده شده است. می‌توانید ماژول‌های MEI را با برداشتن تیک کنار نام آن‌ها غیرفعال کنید. + </p> + <p> + غیرفعال کردن یا انتخاب ماژول‌های MEI بسیار ساده است، نه؟! با این حال، با استفاده از این تیک‌ها، بازخورد زیادی درباره عواقب انتخاب‌های خود دریافت نمی‌کنید – رابط کاربری واقعاً به شما نمی‌گوید که با این انتخاب‌ها چه چیزی از طرح‌واره حذف شده است. اما هر ماژول دارای دکمه <em>شخصی‌سازی</em> هم در گوشه بالا سمت راست است. با کلیک بر روی این دکمه، لیست ماژول‌ها در ستون مرکزی با لیستی از تمام المنت‌ها و کلاس‌های خصیصه که بخشی از ماژول فعلی هستند جایگزین می‌شود. لطفاً توجه داشته باشید که این فقط برای ماژول‌هایی که از طرح‌واره حذف نشده‌اند امکان‌پذیر است. + </p> + <p> + اگر ماژول <em>MEI.cmnOrnaments</em> را برای شخصی‌سازی انتخاب کنید، لیستی شامل المنت‌های <mordent>، <trill>، و <turn> و کلاس‌های خصیصه <em>att.mordent.log</em>، <em>att.ornamentAccid</em>، <em>att.ornamPresent</em>، <em>att.trill.log</em>، و <em>att.turn.log</em> مشاهده خواهید کرد. دوباره می‌توانید هر یک از این موارد را بسته به نیاز خاص خود غیرفعال کنید. در حالی که در صفحه قبلی می‌توانستید ماژول‌ها را به طور کامل غیرفعال کنید، در اینجا می‌توانید انتخاب‌های خاصی انجام دهید و MEI را دقیقاً به نیازهای خود محدود کنید. اگر به هر دلیلی به نسخه‌ای از MEI نیاز دارید که امکان رمزگذاری <trill> را فراهم کند، اما از <mordent> و <turn> پشتیبانی نمی‌کند، می‌توانید به راحتی آن دو المنت را غیرفعال کنید، اما ماژول <em>MEI.cmnOrnaments</em> را حفظ کنید. با نگاه کردن به ماژول‌های "بزرگتر" مانند <em>MEI.cmn</em>، <em>MEI.header</em>، یا <em>MEI.edittrans</em>، می‌توان موارد استفاده عملی بیشتری برای این حذف انتخابی المنت‌ها تصور کرد. + </p> + <p> + همان‌طور که برای المنت‌ها امکان‌پذیر است، می‌توان <strong>کلاس‌های خصیصه</strong> را نیز در این نمای ماژول‌ها غیرفعال کرد. با این حال، این کار نیاز به درک خوبی از کلاس‌های موجود و ساختار تودرتوی آن‌ها دارد. برای بیشتر کاربران (و بیشتر موارد استفاده)، این کار، عملی‌تر است. برای هر المنت، یک دکمه «<em>تنظیم خصیصه‌ها»</em> (set attributes) وجود دارد. اگر روی آن دکمه کلیک کنید، محتوای ستون اصلی بار دیگر با محتوای متفاوتی جایگزین می‌شود. این بار، یک لیست از تمام خصیصه‌های موجود بر روی آن المنت خواهید یافت. طرح این لیست بر اساس کلاس‌های خصیصه‌ای که این المنت عضو آن‌ها است تنظیم شده است. هر کلاس خصیصه یک چک‌باکس دارد که می‌توان آن را برای غیرفعال کردن استفاده کرد. اگر یک کلاس خصیصه را غیرفعال کنید، نه تنها خصیصه‌های تعریف شده در آن کلاس حذف می‌شوند، بلکه تمام کلاس‌های خصیصه دیگری که از طریق سلسله مراتب کلاس به ارث برده شده‌اند – شامل تمام خصیصه‌های تعریف شده توسط آن‌ها – نیز حذف می‌شوند. به عنوان مثال، اگر کلاس خصیصه <em>att.basic</em> (که از طریق کلاس <em >att.common</em> بر روی هر المنت در MEI موجود است) را غیرفعال کنید، این نه تنها خصیصه <em>@xml:base</em>، بلکه کلاس <em >att.id</em> و از طریق آن خصیصه <em>@xml:id</em> را نیز حذف می‌کند. پس از انجام این کار بر روی هر المنت انتخابی خود، باید به یک المنت دیگر بروید. در آنجا متوجه خواهید شد که همان کلاس خصیصه قبلاً غیرفعال شده است: تمام این گزینه‌ها باهم هماهنگ هستند. این شامل کلاس‌های خصیصه فهرست شده در سطح ماژول‌های جداگانه نیز می‌شود. + </p> + <p> + با گزینه‌های غیرفعال کردن <strong>ماژول‌ها</strong>، <strong>المنت‌های</strong> جداگانه، و <strong>کلاس‌های خصیصه‌ها</strong>ی مورد نظر، می‌توان طرح‌واره MEI را به طور قابل توجهی محدود کرده، + آن را برای نیازهای خاص هر پروژه مناسب‌تر کرد، تا از ناسازگاری و سایر مشکلات رمزگذاری در آن پروژه جلوگیری کند. از آنجا که MEI ProfileDrafter اجازه می‌دهد تا از چندین شخصی‌سازی رسمی MEI شروع کنید، + ایجاد نسخه شخصی‌شده‌ای از MEI که پروفایل MEI CMN (یا هر شخصی‌سازی دیگر) را بیشتر محدود کند بسیار ساده است. در مرحله بعدی این آموزش، خواهیم دید چگونه از این شخصی‌سازی استفاده کنیم. + </p> + </div> diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei-03.html b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-03.html new file mode 100644 index 00000000..430bef44 --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-03.html @@ -0,0 +1,28 @@ +<div> + <p> + به محض اینکه نسخه‌ای محدود شده از MEI با استفاده از ابزار + <a href="https://meigarage.edirom.de/profiler" target="_blank" rel="noopener, noreferrer">MEI ProfileDrafter</a> ایجاد کردید، + گام بعدی، آماده‌سازی اولین <em>سفارشی‌سازی MEI</em> برای اعتبارسنجی است – باید آن را به یک فایل RelaxNG کامپایل کنید. + در حالی که ProfileDrafter در آینده یک نسخه کامپایل شده برای دانلود مستقیم ارائه خواهد داد، ما بر روی یک روش کامپایل متفاوت تمرکز خواهیم کرد که به شما امکان می‌دهد تغییرات دستی بیشتری + روی فایل سفارشی‌سازی ODD انجام دهید. در یک پروژه حرفه‌ای، باید سفارشی‌سازی ODD خود را هم به درستی نسخه‌بندی و مستندسازی کنید – این موارد خارج از محدوده ProfileDrafter هستند. + </p> + <p> + لطفاً دکمه <em>Download ODD</em> را در ستون سمت چپ ProfileDrafter فشار دهید و فایل ارائه شده را در یک مکان مناسب ذخیره کنید. حالا یک پنجره مرورگر جدید را به + <a href="https://meigarage.edirom.de/customization" target="_blank" rel="noopener, noreferrer">خدمات سفارشی‌سازی MEI</a> + که بخشی از MEI Garage است، ببرید. در اینجا باید فایل منبع MEI که سفارشی‌سازی شما بر اساس آن است را انتخاب کنید. با توجه به اینکه ProfileDrafter فعلاً به MEI نسخه 4.0.1 محدود است، + می‌توانید گزینه پیش‌فرض را در خدمات سفارشی‌سازی نگه دارید. گام بعدی انتخاب و آپلود فایل <em>سفارشی‌سازی محلی</em> شما در ستون مرکزی است. سپس باید گزینه <em>خروجی</em> را بر روی + <em>RelaxNG</em> تنظیم کنید. حالا می‌توانید دکمه بزرگ <em>Process</em> را که به رنگ آبی است فشار دهید. پس از پردازش در سمت سرور، برچسب آن دکمه به <em>Download</em> تغییر خواهد کرد. + به محض اینکه این اتفاق افتاد، می‌توانید دوباره کلیک کنید تا فایل <strong>RelaxNG</strong> حاصل را دانلود کنید. لطفاً مطمئن شوید که فایل دانلود شده را به نامی معنادار تغییر دهید و از پسوند <code>.rng</code> استفاده کنید. + حالا یک فایل RelaxNG صحیح دارید که از سفارشی‌سازی ODD شما کامپایل شده است. این فایل ممکن است برای اعتبارسنجی فایل‌های XML در مقابل پروفایل سفارشی MEI شما استفاده شود. تبریک! شما در استفاده از + MEI پیشرفت قابل توجهی داشته‌اید! بهرحال، یک نسخه که به طور خاص برای نیازهای شما سفارشی شده است، بر نسخه‌ای عمومی که برای همه مناسب است، ارجحیت دارد. + </span> + </p> + <p> + این درس می‌توانست در همین جا متوقف شود. چالش واقعی این است که <strong>نیازهای خود را شناسایی کنید</strong> و <strong>آنها را به طور مناسب مدل‌سازی کنید</strong>، + اما این، چیزی نیست که بتوان در یک درس آنلاین آموزش داد. البته که کسب تجربه لازم برای این کار به زمان و تبادل اطلاعات بستگی دارد، اما شما همین حالا مهارت‌های فنی لازم برای نزدیک شدن به مدل‌های خوب را دارید. + </p> + <p> + با این حال، با برخی تنظیمات اضافی در سفارشی‌سازی ODD، امکان کنترل بهتر بر روی طرح‌واره حاصل وجود دارد و این به شما امکان کنترل دقیق‌تری بر اعتبارسنجی داده‌ها و جلوگیری از خطاهای داده تا حد ممکن را می‌دهد. + چنین تنظیماتی خارج از محدوده ProfileDrafter هستند و بنابراین نیاز به تنظیمات دستی در سفارشی‌سازی ODD دارند. در گام بعدی، ساختارهایی که ProfileDrafter برای حذف <em>ماژول‌ها</em>، <em>المنت‌ها</em> و <em>کلاس‌های خصیصه</em> از MEI استفاده می‌کند را تحلیل خواهیم کرد. + </p> +</div> diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei-04.html b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-04.html new file mode 100644 index 00000000..83b95e98 --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-04.html @@ -0,0 +1,34 @@ +<div> + <p> + شما قبلاً یاد گرفته‌اید که چگونه از ابزار + <a href="https://meigarage.edirom.de/profiler" target="_blank" rel="noopener, noreferrer">MEI ProfileDrafter</a> + استفاده کنید و با استفاده از + <a href="https://meigarage.edirom.de/customization" target="_blank" rel="noopener, noreferrer">خدمات سفارشی‌سازی MEI</a> + سفارشی‌سازی خود را کامپایل کرده‌اید. شما یک فایل <code>.odd</code> با آن سفارشی‌سازی دانلود کرده‌اید. فرض می‌کنیم سفارشی‌سازی شما برخی ماژول‌ها، المنت‌ها و کلاس‌های خصیصه را حذف کرده است. حالا بررسی کنیم که این موضوع چگونه در فایل سفارشی‌سازی ODD منعکس شده است. لطفاً آن را با یک ویرایشگر مناسب XML باز کنید. + </p> + <p> + شما یک فایل TEI معمولی خواهید یافت، با برخی اعلانات در بالا و یک المنت <code><teiHeader></code> که ممکن است به عنوان نقطه شروعی برای ارائه مستندسازی مناسب برای سفارشی‌سازی شما خدمت کند. شما قطعاً می‌خواهید <code><respStmt></code> (بیانیه مسئولیت) که معمولاً در حدود خط 27 قرار دارد را تنظیم کنید تا مسئولیت را ادعا کنید. محتوای جالب از خط 54 شروع می‌شود (عدد دقیق ممکن است متفاوت باشد). + در آنجا، ما به المنت <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-schemaSpec.html" target="_blank" rel="noopener, noreferrer"><schemaSpec></a> + می‌رسیم که سفارشی‌سازی ما را شروع می‌کند. بیایید فعلاً خصیصه‌های مشخص شده در اینجا را کنار بگذاریم و همچنین المنت <code><constraintSpec></code> را نادیده بگیریم. + </p> + <p> + سپس، لیستی از المنت‌های <code><moduleRef></code> + (<a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-moduleRef.html" target="_blank" rel="noopener, noreferrer">ارجاع به ماژول</a>) + را می‌بینیم که هر کدام به یک ماژول MEI با خصیصه <code>@key</code> خود اشاره می‌کنند. فقط آن خصیصه‌هایی که شما از طرح‌واره حذف نکرده‌اید، در اینجا فهرست شده‌اند. بر این اساس، حذف دستی یک ماژول MEI از سفارشی‌سازی بسیار ساده است: فقط نیاز دارید ارجاع به آن را در فایل سفارشی‌سازی خود حذف کنید. + </p> + <p> + بر روی یک یا چند <code><moduleRef></code> باید خصیصه اضافی <code>@except</code> را ببینید. این خصیصه شامل یک + <em>لیست از المنت‌ها</em> از ماژول مشخص شده است که باید از سفارشی‌سازی حذف شوند. اساساً، شما می‌توانید المنت‌های فردی را به طور انتخابی حذف کنید، در حالی که تمام المنت‌های دیگر از ماژول فعلی را در سفارشی‌سازی خود نگه می‌دارید. ODD همچنین از رویکرد معکوس پشتیبانی می‌کند که به صراحت المنت‌های یک ماژول را از طریق خصیصه <code>@include</code> مجاز می‌کند. ترکیب هر دو رویکرد مجاز نیست و طبق دستورالعمل‌های TEI، از پردازنده‌های ODD درخواست می‌شود که پیام خطا صادر کنند. MEI ProfileDrafter هر دو رویکرد را هنگام آپلود سفارشی‌سازی‌های موجود درک خواهد کرد، اما هنگام صادرات داده‌ها، <em>@except</em> را بر <em>@include</em> ترجیح خواهد داد. + </p> + <p> + در نهایت، در انتهای فایل ODD شما لیستی از المنت‌های <code><classSpec></code> + (<a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-classSpec.html" target="_blank" rel="noopener, noreferrer">مشخصات کلاس</a>) + با <code>@type="atts"</code> وجود خواهد داشت. این المنت‌ها نیز از خصیصه <code>@ident</code> برای شناسایی کلاس‌های خصیصه فردی استفاده می‌کنند. لطفاً توجه داشته باشید که این المنت به ماژولی که این خصیصه در آن تعریف شده است اشاره نمی‌کند. در عوض، و مهمتر از آن، از خصیصه <code>@mode</code> برای مشخص کردن اینکه چه عملی باید بر روی منابع اصلی MEI که قرار است توسط سفارشی‌سازی شما تغییر یابند انجام شود، استفاده می‌کند. در اینجا، تنها مقداری که استفاده خواهد شد <code>@mode="delete"</code> است – کلاس‌های خصیصه مربوطه از سفارشی‌سازی شما حذف خواهند شد و در طرح‌واره حاصل در دسترس نخواهند بود. باز هم، انجام چنین حذفیات به صورت دستی بسیار ساده است. + </p> + <p> + همانطور که می‌بینید، ProfileDrafter در واقع کار چندانی در ODD انجام نمی‌دهد – این ابزار عمدتاً یک رابط کاربری مناسب است که به نشان دادن پیامدهای حذف اجزای مختلف از طرح‌واره کمک می‌کند. به عنوان مثال، این ابزار بسیار واضح نشان می‌دهد که کدام خصیصه‌ها بر روی المنت <code><note></code> زمانی که ماژول <em>MEI.gestural</em> غیرفعال شود، در دسترس نخواهند بود. از نظر فنی، با این حال، این ابزار فقط کارهای بسیار ساده‌ای انجام می‌دهد که به همان خوبی می‌توان آنها را به صورت دستی نیز انجام داد. + </p> + <p> + در گام بعدی، برخی مفاهیم دیگر برای سفارشی‌سازی ODD را معرفی خواهیم کرد و مسیر را برای سفارشی‌سازی‌های ODD حتی خاص‌تر هموار خواهیم کرد. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei-05.html b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-05.html new file mode 100644 index 00000000..ff2ff21d --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-05.html @@ -0,0 +1,66 @@ +<div> + <p> + در مرحله قبل، یاد گرفتیم که یک <code><classSpec type="atts" ident="att.basic" mode="delete"/></code> + می‌تواند برای حذف کلاس خصیصه <em>att.basic</em> (مانند هر کلاس دیگری) از یک سفارشی‌سازی MEI استفاده شود. خصیصه <code>@mode</code> + در اینجا این رفتار را تعیین می‌کند. راهنمای TEI برای کلاس خصیصه + <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-att.combinable.html" target="_blank" rel="noopener, noreferrer">att.combinable</a> + مستندات اضافی درباره مقادیر مجاز ارائه می‌دهد. این راهنما بیان می‌کند که "<em>یک پردازنده ODD باید مقادیر @mode را به این شکل پردازش کند</em>": + </p> + <dl> + <dt>add</dt> + <dd>شیء باید ایجاد شود (پردازش هر فرزند در حالت افزودن)؛ در صورتی که شیئی با همان شناسه از قبل وجود داشته باشد، خطا ایجاد شود.</dd> + <dt>replace</dt> + <dd>این شیء به جای هر شیء موجود با همان شناسه استفاده شود و فرزندان آن شیء نادیده گرفته شوند؛ هر فرزند جدید در حالت "جایگزینی" پردازش شود.</dd> + <dt>delete</dt> + <dd>این شیء یا هر شیء موجود با همان شناسه پردازش نشود؛ در صورت ارائه هر فرزند جدید خطا ایجاد شود</dd> + <dt>change</dt> + <dd>این شیء پردازش شود و فرزندان آن و فرزندان هر شیء موجود با همان شناسه در حالت "تغییر" پردازش شوند</dd> + </dl> + <p> + با این روش، <span style="font-size: 2rem;">نه تنها</span><span style="font-size: 2rem;"> </span><span style="font-size: 2rem;">امکان </span><em style="font-size: 2rem;">حذف</em><span style="font-size: 2rem;"> کلاس‌های خصیصه از طریق سفارشی‌سازی وجود دارد، بلکه می‌توان آن را تغییر هم داد. مثلاً، در + </span><a href="/guidelines/dev/content/introduction.html#meiprofiles" target="_blank" rel="noopener, noreferrer" style="font-size: 2rem;">سفارشی‌سازی MEI Basic</a><span style="font-size: 2rem;"> + خصیصه </span><code style="font-size: 2rem;">@xml:base</code><span style="font-size: 2rem;"> از شِما حذف شده است. در منابع MEI، این خصیصه در کلاس خصیصه </span><code style="font-size: 2rem;">att.basic</code><span style="font-size: 2rem;"> تعریف شده است:</span></p> + <pre class="codeblock"><classSpec ident="att.basic" module="MEI.shared" type="atts"> + <desc>خصیصه‌هایی که پایه کلاس att.common را تشکیل می‌دهند.</desc> + <classes> + <memberOf key="att.id"/> + </classes> + <attList> + <attDef ident="xml:base" usage="opt"> + <desc>یک مرجع URI پایه فراهم می‌کند که برنامه‌ها می‌توانند از آن برای تبدیل مراجع URI نسبی به مراجع URI مطلق استفاده کنند.</desc> + <datatype> + <rng:ref name="data.URI"/> + </datatype> + </attDef> + </attList> +</classSpec></pre> + <p> + همان‌طور که مشاهده می‌کنید، کلاس <code>att.basic</code> عضوی از کلاس <code>att.id</code> است - که مسئول ارائه خصیصه <code>@xml:id</code> + برای هر المنت می‌باشد. بنابراین، حذف <code>att.basic</code> از شِما، استفاده از <code>@xml:id</code>ها را در هر جایی از فایل‌هایی که با سفارشی‌سازی حاصل مطابقت دارند، غیرفعال می‌کند؛ قطعاً این، ایده خوبی نیست! در عوض، انعطاف‌پذیری ارائه‌شده از طریق <code>@mode</code>های مختلف می‌تواند برای بیان‌های دقیق‌تر در اینجا استفاده شود. مثال زیر نشان می‌دهد که چه چیزی برای سفارشی‌سازی <code>att.basic</code> برای پروفایل MEI Basic انجام شده است: + </p> + <pre class="codeblock"><classSpec ident="att.basic" module="MEI.shared" type="atts" mode="replace"> + <desc>خصیصه‌هایی که پایه کلاس att.common را تشکیل می‌دهند.</desc> + <classes> + <memberOf key="att.id"/> + </classes> +</classSpec></pre> + <p> + به جای <code>mode="delete"</code>، از <code>mode="replace"</code> برای ارائه تعریف جدید برای کلاس خصیصه استفاده شده است. این کلاس خصیصه، دیگر شامل تعریف خصیصه <code>@xml:base</code> نمی‌باشد. از سوی دیگر، ممکن بود از <code>@mode="change"</code> + برای کلاس خصیصه استفاده شود، فرزندان کلاس‌ها حذف شوند (چون مقدار <em>تغییر</em> باعث پردازش کلاس‌های اصلی نیز می‌شود، همان‌طور که در بالا مشاهده شد)، + و یک <code>mode="delete"</code> اضافی برای تعریف خصیصه داده شود، همان‌طور که در مثال زیر آمده است: + </p> + <pre class="codeblock"><classSpec ident="att.basic" module="MEI.shared" type="atts" mode="change"> + <attList> + <attDef ident="xml:base" mode="delete"/> + </attList> +</classSpec></pre> + <p> + هر دو روش به نتایج یکسانی می‌رسند، بنابراین انتخاب راه‌حل بیشتر به ترجیح فرد بستگی دارد. معمولاً یک روش خوب این است که یک تعریف موجود (که همیشه از طریق راهنمای MEI در دسترس است) را به سفارشی‌سازی خود کپی کرده و سپس با دقت <code>@mode</code>ها را برای خود شیء و فرزندان آن وارد کنید. <code>@mode</code> می‌تواند در تعدادی از المنت‌های مختلف در یک سفارشی‌سازی ODD استفاده شود: <strong><elementSpec></strong>ها، <strong><remarks></strong>، <strong><classSpec></strong>ها، + <strong><memberOf></strong>ها، <strong><constraintSpec></strong>ها، <strong><macroSpec></strong>ها، <strong><attDef></strong>ها، <strong><valList></strong>ها، و <strong><valItem></strong>ها. برای مثال، مقادیر علائم تغییر یافته تعریف‌شده در + <a href="/guidelines/dev/data-types/data.ACCIDENTAL.WRITTEN.basic.html" target="_blank" rel="noopener, noreferrer">data.ACCIDENTAL.WRITTEN.basic</a> + نه تنها شامل مقادیری مانند <em>s</em> (دیز) و <em>f</em> (بمل) می‌شوند، بلکه شامل <em>tf</em> (برای سه بمل) نیز هستند. در پروژه‌هایی که بر روی مواد فاقد چنین علائم تغییر یافته کار می‌کنند، ممکن است ایده خوبی باشد که آنها را به طور کامل از شِما حذف کنند، به طوری که کسی نتواند آنها را بدون ایجاد خطای اعتبارسنجی وارد کند. + </p> + <p> + یک نوع تغییر نهایی وجود دارد که این آموزش قرار است پوشش دهد. این را در مرحله بعد پیدا خواهید کرد. + </p> +</div> diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei-06.html b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-06.html new file mode 100644 index 00000000..697284f3 --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-06.html @@ -0,0 +1,25 @@ +<div> + <p> + MEI معمولی المنت‌های <strong>سندی</strong> زیر را مجاز می‌داند: <code><mei></code>، + <code><meiHead></code>، + <code><music></code>، و <code><meiCorpus></code>. این بدان معناست که این المنت‌ها می‌توانند به عنوان المنت‌های + بیرونی در یک فایل MEI عمل کنند. با این حال، یک پروژه ممکن است ساختار داده‌ای را پیشنهاد دهد که به المنت‌های شروع دیگر یا اضافی نیاز داشته باشد. + به عنوان مثال، یک پروژه ممکن است تصمیم بگیرد که تمام توضیحات ویرایشی را به صورت فایل‌های جداگانه نگه دارد، هر کدام شامل المنت خاص خود <code><annot></code> باشد. سفارشی‌سازی رسمی <a href="/guidelines/dev/content/introduction.html#meiprofiles" target="_blank" rel="noopener, noreferrer">mei-all_anyStart</a> + اجازه می‌دهد که هر المنت منفرد در نام‌حوزه MEI به عنوان المنت شروع استفاده شود، اما این بیشتر برای اهداف آموزشی است و برای استفاده عملی توصیه نمی‌شود. در عوض، ODD یک مکانیزم ساده برای تعریف المنت‌های شروع مجاز ارائه می‌دهد، با استفاده از المنت اولیه + <code><schemaSpec></code>. + </p> + <pre class="codeblock"><schemaSpec ident="mei" + ns="http://www.music-encoding.org/ns/mei" + prefix="mei_" + start="mei meiHead meiCorpus music"></pre> + <p> + همان‌طور که مشاهده می‌کنید، خصیصه <code>@start</code> به عنوان یک لیست جداشده با فاصله از تمام المنت‌های شروع استفاده می‌شود. اگر پروژه ذکرشده تصمیم بگیرد که <code><mei></code> و <code><annot></code> را مجاز کند، اما تمام المنت‌های شروع دیگر را غیرمجاز کند، این می‌تواند به این صورت اصلاح شود: + </p> + <pre class="codeblock"><schemaSpec ident="mei" + ns="http://www.music-encoding.org/ns/mei" + prefix="mei_" + start="mei annot"></pre> + <p> + همان‌طور که مشاهده می‌کنید، تنظیم المنت‌های شروع در واقع بسیار ساده است. بیایید مرور کنیم که چه چیزهایی درباره سفارشی‌سازی ODD یاد گرفته‌ایم. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei-end.html b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-end.html new file mode 100644 index 00000000..85f52504 --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei-end.html @@ -0,0 +1,18 @@ + + <div> + <p> + در این درس، آموختید که چگونه از + <a href="https://meigarage.edirom.de/profiler" target="_blank" rel="noopener, noreferrer">MEI ProfileDrafter</a> + برای ایجاد سفارشی‌سازی‌های MEI از طریق یک رابط کاربری گرافیکی استفاده کنید. یاد گرفتید که این ابزار دامنه محدودی دارد، اما در حال حاضر اجازه می‌دهد MEI را به طور قابل توجهی محدود کنید. یاد گرفتید که نشانه‌گذاری ODD تولیدشده توسط این ابزار در واقع بسیار ساده است و می‌توان آن را به همان خوبی به صورت دستی انجام داد. یاد گرفتید چگونه از <a href="https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-att.combinable.html" target="_blank" rel="noopener, noreferrer">@mode</a> + در سفارشی‌سازی‌های پیشرفته ODD استفاده کنید و چگونه آنها کنترل دقیق‌تری بر شِمای حاصل فراهم می‌کنند. در همین راستا، همچنین یاد گرفتید که چگونه یک سفارشی‌سازی ODD را به یک فایل RelaxNG که می‌تواند برای اعتبارسنجی استفاده شود، کامپایل کنید، با استفاده از + <a href="https://meigarage.edirom.de/customization" target="_blank" rel="noopener, noreferrer">MEI Customization Service</a>. + </p> + <p> + البته، روش‌های دیگری برای کامپایل ODD وجود دارد، مفاهیم اضافی برای در نظر گرفتن وجود دارد، و این واقعیت که MEI از نسخه قدیمی‌تری از + ODD نسبت به TEI استفاده می‌کند (همان‌طور که در آموزش <a href="/tutorials/understanding-odd.html" target="_blank" rel="noopener, noreferrer">Understanding ODD</a> توضیح داده شده است) + ممکن است در طول مسیر باعث سردرگمی شود. کار با ODD مطمئناً کمی عجیب است، اما قطعاً ارزش تلاش را دارد، زیرا به شما اجازه می‌دهد از نسخه‌ای از + MEI استفاده کنید که به نیازهای شما بسیار خاص است. این به شما کمک می‌کند مستندات مناسبی ارائه دهید، که به دیگران کمک می‌کند داده‌های شما را بهتر درک کرده و استفاده کنند. بنابراین، نوشتن سفارشی‌سازی‌های ODD قطعاً یک سرمایه‌گذاری خوب در پایداری تحقیقات شما است. + </p> + <p>هشدار: این آموزش کاملاً در حال پیشرفت است و ممکن است بعد از بررسی بازخوردهایی که از ورکشاپها گرفته می‌شود، تا حدودی تغییر کند. + </p> + </div> \ No newline at end of file diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei.json b/_tutorials-FA/181_customizing_MEI/181_customizing_mei.json new file mode 100644 index 00000000..3b120edd --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei.json @@ -0,0 +1,35 @@ +{ + "steps": [ + { + "label":"Welcome", + "descFile": "181_customizing_mei-01.html" + }, + { + "label":"ProfileDrafter", + "descFile": "181_customizing_mei-02.html" + }, + { + "label":"Compiling ODD", + "descFile": "181_customizing_mei-03.html" + }, + { + "label":"Review simple Customizations", + "descFile": "181_customizing_mei-04.html" + }, + { + "label":"Understanding Modes", + "descFile": "181_customizing_mei-05.html" + }, + { + "label":"Changing Roots", + "descFile": "181_customizing_mei-06.html" + } + ], + "end":"181_customizing_mei-end.html", + "resp":[ + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +} \ No newline at end of file diff --git a/_tutorials-FA/181_customizing_MEI/181_customizing_mei.md b/_tutorials-FA/181_customizing_MEI/181_customizing_mei.md new file mode 100644 index 00000000..a1dfff48 --- /dev/null +++ b/_tutorials-FA/181_customizing_MEI/181_customizing_mei.md @@ -0,0 +1,7 @@ +--- +layout: tutorials +type: tutorial +name: "ADVANCED: Customizing MEI (WIP)" +fullname: "Creating custom MEI profiles" +data: "181_customizing_mei.json" +--- diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-01.html b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-01.html new file mode 100644 index 00000000..05800922 --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-01.html @@ -0,0 +1,22 @@ +<div> + <h1>یک خوش‌آمدگویی گرم به این آموزش ویژه</h1> + <p> + مشخصاً شما به MEI اهمیت می‌دهید و این عالی است! اگر دست به کار شوید و یک درس آموزشی برای آن بنویسید، هم از + درکی که از MEI دارید اطمینان پیدا می‌کنید، هم به دیگران کمک می‌کنید تا درک بهتری پیدا کنند. + </p> + <p> + نوشتن مستندات معمولاً کاری کم‌پاداش است. مهم نیست چقدر می‌نویسید، همیشه نیاز به مطالب بیشتری وجود دارد و هر + چقدر هم تلاش کنید، هرگز نمی‌توانید نیازها و انتظارات همه را برآورده کنید. بهترین راه برای رسیدگی به این + مشکلات، تقسیم کار بر روی شانه‌های متعدد است: کار برای همه کمتر خواهد شد و با نگاه به MEI از دیدگاه‌ها و سطوح + تخصصی مختلف، احتمال ارائه کمک مناسب برای نیازهای خاص هر فرد بیشتر می‌شود. + </p> + <p> + بنابراین، زمانی که چیزی درباره MEI یاد گرفتید که فکر می‌کنید دیگران ممکن است از آن بهره‌مند شوند، لطفاً + <i>تردید نکنید</i> و مشارکت کنید. این آموزش به شما توضیح می‌دهد که چه چیزی لازم است. نگران نباشید، برای + نوشتن آموزش خود، معرفی یک رپرتوار خاص، یا توصیه‌ی روش‌های کارآمدتر، نیازی نیست که حتماً برنامه‌نویس باشید. + جامعه MEI برای <a href="/community/community-contacts.html" target="_blank">کمک به شما</a> حضور دارد، و <a + href="/community/technical-team.html" target="_blank">تیم فنی</a> اطمینان حاصل می‌کند که هر آنچه + می‌نویسید از نظر فنی صحیح است – هیچ مشکلی پیش نمی‌آید، قول می‌دهیم. بنابراین لطفاً با کلیک روی <b>ادامه</b> + در زیر، ما را در صفحه بعدی دنبال کنید. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-02.html b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-02.html new file mode 100644 index 00000000..96aee78b --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-02.html @@ -0,0 +1,38 @@ +<div> + <p> + مانند سایر قسمت‌های وب‌سایت ما، همه آموزش‌ها به طور مستقیم از یک + <a href="https://github.com/music-encoding/music-encoding.github.io" target="_blank">مخزن GitHub</a> ارائه + می‌شوند. این روش هم مزایا و هم معایبی دارد. یک مزیت فوق‌العاده این است که ایجاد یک آموزش جدید به سادگی اضافه + کردن یک پوشه به مخزن است (بعداً توضیح خواهیم داد، نگران نباشید). بزرگ‌ترین معایب این روش این است که تعامل + لازم برای یک آموزش با این تنظیمات فنی به خوبی پشتیبانی نمی‌شود و ما واقعاً نمی‌توانیم آن را با طرح MEI + اعتبارسنجی کنیم. ما به هر دو جنبه رسیدگی کرده‌ایم و امیدواریم که راه‌حل‌های ما تعادلی مناسب بین نیاز کاربران + به راهنمایی و تلاش لازم برای آماده‌سازی یک آموزش ایجاد کنند. به این موضوع نیز بعداً خواهیم پرداخت. + </p> + <p> + حالا <b>بیایید شروع کنیم</b>. صفحات ما توسط <a href="https://jekyllrb.com/" target="_blank">Jekyll</a> ساخته + و ارائه می‌شوند. در مورد آموزش‌های ما، این به این معناست که ما به یک فایل <a + href="https://en.wikipedia.org/wiki/Markdown" target="_blank">Markdown</a> + با جزئیاتی در مورد آموزش خود نیاز داریم که وب‌سایت مادر، برای ادغام صحیح مطالب، به آن نیاز دارد. بیایید به + فایل Markdown + همین آموزش نگاه کنیم: + </p> + <pre class="codeblock">--- +layout: tutorials +type: tutorial +name: "Writing Tutorials" +fullname: "An Introduction to writing MEI tutorials" +data: "tutorials.json" +---</pre> + <label>tutorials.md (فایل Markdown)</label> + <p>در حالی که دو خط اول، <code>layout: tutorials</code> و <code>type: tutorial</code> همیشه باید به همین صورت + بمانند، دو خط بعدی ممکن است تغییر کنند. + آنچه در اینجا می‌نویسید در لیست آموزش‌ها نمایش داده می‌شود، به عنوان مثال. لطفاً توجه داشته باشید که خط اول + و آخر، که هر کدام دارای سه خط تیره هستند، باید برای عملکرد صحیح آموزش به این صورت باقی بمانند. + </p> + <p> + همانطور که قبلاً گفتیم، ما باید تا حدودی محدودیت‌های تنظیمات فنی خود را دور بزنیم. به همین دلیل، ما به یک + فایل به نام <code>tutorials.json</code> + اشاره می‌کنیم که در همان پوشه قرار دارد. نام فایل اهمیتی ندارد، مادامی که بتوان آن را در همان پوشه فایل + Markdown پیدا کرد. حالا بیایید به محتوای این فایل JSON نگاه کنیم. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-03.html b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-03.html new file mode 100644 index 00000000..69d916d2 --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-03.html @@ -0,0 +1,99 @@ + +<div> + <p> + در فایل <a href="https://en.wikipedia.org/wiki/JSON" target="_blank">JSON</a>، محتوای یک آموزش هماهنگ + می‌شود. این فایل شامل یک شیء (object) با چندین ویژگی (property) است. بیایید به -یک نسخه ساده‌شده از- این + آموزش فعلی <span style="font-size: 2rem;">نگاهی</span><span + style="font-size: 2rem;"> بیندازیم:</span></p> + <pre class="codeblock">{ + "steps": [ + { + "label":"Welcome",<br> "descFile": "writingTutorials-01.html" + }, + { + "label":""Website Setup",<br> "descFile": "writingTutorials-02.html" + }, + + <span class="text-gray"><i>… مراحل بیشتری در اینجا اضافه خواهد شد …</i></span> + + ], + "end":"writingTutorials-end.html", + "resp":[ + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +}</pre> + <label>tutorials.json</label> + <p> + سه خصیصه مهم در اینجا وجود دارد. اولین خصیصه، <code>"steps"</code>، برای توصیف مراحل مختلف در یک آموزش + استفاده می‌شود. به این موضوع در ادامه بازمی‌گردیم. خصیصه بعدی، <code>"end"</code>، یک فایل را مشخص می‌کند که + صفحه پایانی یک آموزش در آن ارائه می‌شود. در نهایت، خصیصه <code>"resp"</code> وجود دارد. در این آرایه، شما + باید نام و وابستگی خود را وارد کنید. به این ترتیب، نه تنها سعی می‌کنیم فردی را به‌عنوان تماس در صورت بروز + سؤال شناسایی کنیم، بلکه همچنین مقداری شناسایی عمومی برای کاری که در MEI انجام می‌دهید ارائه دهیم. اگر روی یک + آموزش به‌صورت گروهی کار کرده‌اید، می‌توانید همه افراد را وارد کنید. پس چرا از برخی از دانشجویان خود نخواهید + که روی این آموزش‌ها کار کنند؟ + </p> + <h1>مراحل</h1> + <p> + برگردیم به خصیصه steps. این یک آرایه (array) از اشیاء است که هر کدام یک مرحله از آموزش را توصیف می‌کنند. + تنها خصیصه‌ای که به‌طور قطع لازم است، <code>"descFile"</code> است. در اینجا باید نام یک فایل HTML را که شامل + دستورالعمل‌های این مرحله است ارائه کنید. اساساً، این همان چیزی است که در حال حاضر می‌خوانید. این فایل یک + فایل HTML کامل نیست؛ باید با یک المنت <code><div></code> ریشه شروع شود و شامل HTML ساده باشد. + خصیصه بعدی، <code>"label"</code>، اختیاری است. اگر آن را ارائه نکنید، مرحله بر اساس موقعیتش نام‌گذاری می‌شود + (مثلاً "مرحله ۳" یا مشابه آن). + </p> + <p> + بدیهی است که یک آموزش نباید فقط متن ساده باشد (که این تنظیمات را توجیه نمی‌کند…). گاهی ممکن است بخواهید + کاربر واقعاً چیزهایی را کدگذاری کند. بیایید نگاهی به تعریف چنین "مرحله‌ای" بیندازیم: + </p> + <pre class="codeblock">{ + <span class="text-gray">"label":"یک مرحله نمونه",</span> + <span class="text-gray">"descFile": "step-instructions.html",</span> + "xmlFile": "encoding.xml", + "xpaths": [ + { + "rule":"count(//mei:note) = 1", + "renderanyway":false + }, + { + "rule":"//mei:note/@pname = 'g'", + "renderanyway":true, + "hint":"شما به یک خصیصه @pname با مقدار g نیاز دارید." + } + ], + "editorLines":3, + "prefillFile":"prefill.xml" +}</pre> + <label>تعریف یک مرحله آموزشی که شامل یک مولفه ویرایشگر است، برای اضافه شدن در آرایه "steps" در tutorials.json + </label> + <p> + دو خصیصه‌ای که قبلاً می‌شناسیم به رنگ خاکستری نمایش داده شده‌اند، نیازی نیست که به آن‌ها بازگردیم. اگر یک + مرحله شامل هر دو خصیصه <code>"xmlFile"</code> و <code>"xpaths"</code> باشد، یک ویرایشگر نمایش داده خواهد شد. + در همین حال، دکمه "ادامه" در گوشه پایین سمت راست ناپدید خواهد شد. برای ادامه، کاربر اکنون باید + دستورالعمل‌های شما را دنبال کند و کد MEI را در ویرایشگر وارد کند. برای تصمیم‌گیری درباره موفقیت یا شکست + کاربر، باید تعدادی قوانین <a href="https://en.wikipedia.org/wiki/XPath" target="_blank">XPath</a> ارائه + کنید. XPath خود در یک خصیصه <code>"rule"</code> ذخیره می‌شود. باید یک مقدار بولیَن (یعنی <i>true</i> یا + <i>false</i>) بازگرداند. اگر می‌خواهید کاربر را راهنمایی کنید، می‌توانید یک خصیصه <code>"hint"</code> ارائه + دهید. اگر محتوای ویرایشگر با یک قانون XPath مطابقت نداشته باشد، پیام هشدار آن به‌صورت یک جعبه زیر ویرایشگر + نمایش داده می‌شود. قوانین XPath به ترتیب بررسی می‌شوند و بررسی بیشتر با هر قانون نادرستی متوقف می‌شود. اگر + همه قوانین مطابقت داشته باشند، آموزش به‌طور خودکار به مرحله بعدی ادامه می‌یابد. + </p> + <p> + خصیصه <code>"renderanyway"</code> یک قانون XPath زمانی مفید است که بخواهید کاربر با کدگذاری "بازی کند". + به‌طور عادی، ورودی کاربر تنها زمانی رندر می‌شود که همه قوانین XPath مطابقت داشته باشند. با این حال، ممکن است + از کاربر بخواهید که زیر و بمی‌های مختلف را امتحان کند و بگویید که تور زمانی ادامه می‌یابد که یک زیر و بمی + خاص وارد شود. سپس می‌توانید <code>"renderanyway"</code> را به <code>true</code> تنظیم کنید، و Verovio تلاش + خواهد کرد تا بهترین نتیجه را برای رندر ورودی فعلی کاربر ارائه دهد. این رفتار در قانون دوم XPath بالا + پیاده‌سازی شده است. + </p> + <p> + خصیصه <code>"xmlfile"</code> یک فایل را مشخص می‌کند که به‌عنوان زمینه برای ویرایشگر استفاده می‌شود. در مرحله + بعدی این آموزش، این موضوع را با جزئیات بیشتری توضیح خواهیم داد. دو خصیصه دیگر نیز ممکن است مفید باشند. با + خصیصه <code>"editorLines"</code> می‌توانید ارتفاع پنجره ویرایشگر را مشخص کنید. اگر آن را ارائه نکنید، یک + ارتفاع پیش‌فرض <i>5</i> خط فرض خواهد شد. در نهایت، می‌توانید در ابتدای یک مرحله ویرایشگر را با محتوای یک + فایلی که با خصیصه <code>"prefillFile"</code> مشخص کرده‌اید پر کنید. اگر آن را ارائه نکنید، ویرایشگر ورودی‌ای + که کاربر در مرحله قبلی وارد کرده است را نگه می‌دارد (یا در مرحله اول خالی خواهد بود). + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-04.html b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-04.html new file mode 100644 index 00000000..4c5f88f9 --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-04.html @@ -0,0 +1,56 @@ +<div> + <p> + هنگام انجام یک آموزش به‌صورت شخصی، ممکن است تعجب کرده باشید که Verovio چگونه قادر است MEI کاربر را رندر کند، + حتی زمانی که یک فایل کامل MEI توسط کاربر وارد نشده است. این کار توسط خاصیت <code>"xmlFile"</code> + در یک مرحله آموزشی که در صفحه قبلی معرفی شد، انجام می‌شود. این خاصیت به یک فایل کامل MEI اشاره می‌کند، + که زمینه‌ای را فراهم می‌کند که باید برای رندر درست "اطراف" ورودی کاربر قرار گیرد. بیایید یک مثال ساده را + بررسی کنیم: + </p> + <pre class="codeblock"><mei xmlns="http://www.music-encoding.org/ns/mei"> +<meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> +</meiHead> +<music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <span class="text-error"><?snippet-start?></span> + <note pname="c" oct="4" dur="4"/> + <span class="text-error"><?snippet-end?></span> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> +</music> +</mei></pre> + <label>یک فایل ساده MEI، برای استفاده به عنوان زمینه ورودی کاربر.</label> + <p> + این فقط یک فایل معمولی MEI است، اما حاوی دو <i>دستور پردازشی</i> مهم (که به رنگ قرمز مشخص شده‌اند) است. + محتوای این فایل در حافظه خوانده می‌شود. هر زمان که ورودی کاربر در ویرایشگر یک XML با ساختار صحیح باشد، + این ورودی <i>بین</i> دو دستور پردازشی درج می‌شود و فایل کامل (که اکنون شامل ورودی کاربر است) + اعتبارسنجی شده و (در صورت امکان) برای رندر به Verovio ارسال می‌شود. + </p> + <p> + آنچه که بین دو <i>دستور پردازشی</i> ذخیره شده است به عنوان یک راه‌حل نمونه در نظر گرفته شده است. + این قابلیت هنوز پیاده‌سازی نشده است، اما به زودی اضافه خواهد شد. در حال حاضر امکان دانلود فایل کامل + (شامل زمینه) وجود دارد، به طوری که کاربران می‌توانند از آن برای مراجعه‌های آینده یا به عنوان مدلی + برای کارهای خود استفاده کنند. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-05.html b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-05.html new file mode 100644 index 00000000..c27dbbdd --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-05.html @@ -0,0 +1,40 @@ +<div> + <p> + واضح است که اعتبارسنجی ورودی مناسب برای موفقیت یادگیری مؤثر و پایدار بسیار مهم است. + با این حال، به دلیل اینکه وب‌سایت ما مبتنی بر Jekyll است، مجبور به تکیه بر اعتبارسنجی سمت کاربر هستیم + (اعتماد به یک سرویس خارجی برای اعتبارسنجی به تنهایی احتمالاً به اندازه کافی قابل‌اعتماد نیست، بنابراین + از این رویکرد صرف‌نظر کردیم). تا به امروز، اعتبارسنجی سمت کلاینت (= جاوااسکریپت) پشتیبانی مناسب برای + <a href="https://en.wikipedia.org/wiki/RelaxNG" target="_blank">RelaxNG</a>، زبان اسکیما که در پروژه‌های + واقعی + برای اعتبارسنجی MEI استفاده می‌شود، ارائه نمی‌دهد. به همین دلیل، نیاز داریم از رویکرد مبتنی بر XPath + که قبلاً ذکر شد استفاده کنیم. + </p> + <p> + خاصیت <code>"xpaths"</code> در مرحله فعلی یک آرایه از قوانینی را نگه می‌دارد که کدگذاری کاربر باید برای + تکمیل + آن مرحله با آن‌ها مطابقت داشته باشد. این قوانین به صورت اشیاء JSON با سه خاصیت مشخص می‌شوند: + </p> + <pre class="codeblock">{ + "rule":"//mei:note/@pname = 'g'", + "renderanyway":true, + "hint":"شما نیاز به یک خصیصه @pname با مقدار g دارید." +}</pre> + <p> + خاصیت <code>"rule"</code> حاوی یک عبارت <a href="https://en.wikipedia.org/wiki/XPath" target="_blank">XPath + 1</a> + است که باید به یک عبارت منطقی تبدیل شود: یا <i>true</i> یا <i>false</i> باشد. + خاصیت <code>"renderanyway"</code> برای تصمیم‌گیری درباره اینکه آیا ویرایشگر فعلی می‌تواند توسط Verovio + رندر شود حتی اگر XPath مطابقت نداشته باشد، استفاده می‌شود. محتوای <code>"hint"</code> برای کمک به کاربر + برای رسیدن به کدگذاری صحیح در نظر گرفته شده است. فقط اولین XPath ناموفق به صورت هم‌زمان نمایش داده می‌شود + تا کاربر را گام به گام از میان الزامات مختلف راهنمایی کند. با این حال، همه مراحل نیاز به راهنما ندارند – + گاهی اوقات بهتر است که به کاربر اجازه داده شود کمی خودش کاوش کند. + </p> + <p> + برای اعتبارسنجی، ورودی فعلی کاربر بین + <code><?snippet-start?></code> و <code><?snippet-end?></code> + در فایل XML فعلی درج می‌شود و سپس قوانین XPath در برابر آن فایل کامل بررسی می‌شوند. + به محض اینکه یکی از این قوانین شکست بخورد (یعنی <i>false</i> برگرداند)، + <code>"hint"</code> مربوطه نمایش داده می‌شود. هنگامی که همه قوانین <i>true</i> بازگردانند، + دکمه "ادامه" فعال می‌شود و کاربر می‌تواند به مرحله بعدی برود. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-end.html b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-end.html new file mode 100644 index 00000000..31bca7c1 --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials-end.html @@ -0,0 +1,25 @@ +<div> + <p> + همین! فقط کافی است تعدادی فایل بنویسید و آن‌ها را در وب‌سایت MEI در پوشه + <a href="https://github.com/music-encoding/music-encoding.github.io/tree/main/_tutorials" + target="_blank">tutorials</a> + قرار دهید. حالت ایده‌آل این است که آموزش را در شاخه (branch) خودتان آماده کنید و سپس یک درخواست Pull به مخزن + MEI ارسال کرده + و از تیم فنی بخواهید آن را بررسی کنند. + البته، ما خوشحال می‌شویم که به شما کمک کنیم – فقط <a href="/community/community-contacts.html" + target="_blank">تماس</a> + بگیرید. برای شروع سریع، ممکن است بخواهید یک آموزش موجود را کپی کرده و آن را برای نیازهای خودتان تغییر دهید. + آموزش <code>101_quickstart</code> می‌تواند نقطه شروع خوبی باشد، زیرا بسیار ساده است اما همچنان تمام + ویژگی‌های + مرتبط را دارد. + </p> + <p> + از اینکه همه این‌ها را خواندید متشکریم. از اینکه برای نوشتن یک آموزش برای MEI فکر می‌کنید حتی بیشتر تشکر + می‌کنیم. + ورودی شما می‌تواند واقعاً تفاوت ایجاد کند. حتی اگر مطمئن نیستید که به اندازه کافی با MEI آشنا هستید، قطعاً + می‌توانید + برخی از دیدگاه‌های خود را با دیگران به اشتراک بگذارید. حتی اگر فقط ایده‌ای دارید که باید در آموزش پوشش داده + شود، + لطفاً قدم جلو بگذارید، تا شاید بتوانیم آن را با هم بسازیم – به عنوان یک جامعه، برای جامعه. + </p> +</div> \ No newline at end of file diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.json b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.json new file mode 100644 index 00000000..6722f929 --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.json @@ -0,0 +1,31 @@ +{ + "steps": [ + { + "label":"Welcome", + "descFile": "199_writing_tutorials-01.html" + }, + { + "label":"Website Setup", + "descFile": "199_writing_tutorials-02.html" + }, + { + "label":"The JSON file", + "descFile": "199_writing_tutorials-03.html" + }, + { + "label":"The Editor", + "descFile": "199_writing_tutorials-04.html" + }, + { + "label":"Validation", + "descFile": "199_writing_tutorials-05.html" + } + ], + "end":"199_writing_tutorials-end.html", + "resp":[ + { + "name":"Johannes Kepper", + "affiliation":"Beethovens Werkstatt | Universität Paderborn" + } + ] +} \ No newline at end of file diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.md b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.md new file mode 100644 index 00000000..2b290be9 --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.md @@ -0,0 +1,7 @@ +--- +layout: tutorials +type: tutorial +name: "متا: نوشتن آموزش‌ها" +fullname: "معرفی نوشتن آموزش‌های MEI" +data: "199_writing_tutorials.json" +--- diff --git a/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.xml b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.xml new file mode 100644 index 00000000..811c8cdb --- /dev/null +++ b/_tutorials-FA/199_writing_tutorials/199_writing_tutorials.xml @@ -0,0 +1,34 @@ +<mei xmlns="http://www.music-encoding.org/ns/mei"> + <meiHead> + <fileDesc> + <titleStmt> + <title/> + </titleStmt> + <pubStmt/> + </fileDesc> + </meiHead> + <music> + <body> + <mdiv> + <score> + <scoreDef> + <staffGrp> + <staffDef clef.shape="G" clef.line="2" n="1" lines="5"/> + </staffGrp> + </scoreDef> + <section> + <measure> + <staff n="1"> + <layer> + <?snippet-start?> + <note pname="c" oct="4" dur="4"/> + <?snippet-end?> + </layer> + </staff> + </measure> + </section> + </score> + </mdiv> + </body> + </music> +</mei>