diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt new file mode 100644 index 000000000..412cab2d2 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt @@ -0,0 +1 @@ +from earsketch import * \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-import-error.py.txt new file mode 100644 index 000000000..4e2425894 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-import-error.py.txt @@ -0,0 +1 @@ +from EarSketch import * \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt new file mode 100644 index 000000000..c84f11033 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt @@ -0,0 +1,6 @@ +for measure in range(1, 9, 2): + fitMedia(melody, 1, measure, measure + 2) + makeBeat(kick, 2, measure, beatString) + makeBeat(kick, 2, measure + 1, beatString) + +fitMedia(beat, 3, 3, 9) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt new file mode 100644 index 000000000..9bbd2af9d --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt @@ -0,0 +1,5 @@ +for measure in range(1, 9, 2): + fitMedia(melody, 1, measure, measure + 2) + makeBeat(kick, 2, measure, beatString) + makeBeat(kick, 2, measure + 1, beatString) +fitMedia(beat, 3, 3, 9) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt new file mode 100644 index 000000000..0a5d0a535 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt @@ -0,0 +1,9 @@ +// Index Error: Correction + +setTempo(100); + +var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]; + +fitMedia(orch[0], 1, 1, 17); +fitMedia(orch[1], 2, 5, 17); +fitMedia(orch[2], 3, 9, 17); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt new file mode 100644 index 000000000..c8fa82e5f --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt @@ -0,0 +1,10 @@ +# Index Error: Correction + +from earsketch import * +setTempo(100) + +orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2] + +fitMedia(orch[0], 1, 1, 17) +fitMedia(orch[1], 2, 5, 17) +fitMedia(orch[2], 3, 9, 17) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error.js.txt new file mode 100644 index 000000000..a97c585a3 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error.js.txt @@ -0,0 +1,9 @@ +// Index Error: Example + +setTempo(120); + +var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]; + +fitMedia(orch[1], 1, 1, 17); +fitMedia(orch[2], 2, 5, 17); +fitMedia(orch[3], 3, 9, 17); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error.py.txt new file mode 100644 index 000000000..8492954ac --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-index-error.py.txt @@ -0,0 +1,10 @@ +# Index Error: Example + +from earsketch import * +setTempo(100) + +orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2] + +fitMedia(orch[1], 1, 1, 17) +fitMedia(orch[2], 2, 5, 17) +fitMedia(orch[3], 3, 9, 17) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt new file mode 100644 index 000000000..5c3185d74 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt @@ -0,0 +1,7 @@ +# Name Error: Correction + +from earsketch import * +setTempo(120) + +today = readInput("What day is it?") +print("Today is " + today) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-name-error.py.txt new file mode 100644 index 000000000..a90629268 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-name-error.py.txt @@ -0,0 +1,7 @@ +# Name Error: Example + +from earsketch import * +setTempo(120) + +today = readInput("What day is it?") +print("Today is " + Today) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt new file mode 100644 index 000000000..4d7a23277 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt @@ -0,0 +1,17 @@ +# Parse Error: Correction + +from earsketch import * +setTempo(98) + +soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE + +chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1 +chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2 + +fitMedia(chords1, 1, 1, 9) +fitMedia(chords2, 1, 9, 17) + +for measure in range(1, 17, 2): + # select a random clip with EarSketch API function + beat = selectRandomFile(soundFolder) + fitMedia(beat, 2, measure, measure + 2) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt new file mode 100644 index 000000000..d922ac0a4 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt @@ -0,0 +1,17 @@ +# Parse Error: Example + +from earsketch import * +setTempo(98) + +soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE + +chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1 +chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2 + +fitMedia(chords1, 1, 1, 9) +fitMedia(chords2, 1, 9, 17) + +for measure in range(1, 17, 2): + # select a random clip with EarSketch API function + beat = selectRandomFile(soundFolder + fitMedia(beat, 2, measure, measure + 2) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt new file mode 100644 index 000000000..924483c6a --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt @@ -0,0 +1,8 @@ +// Range error: Correction + +setTempo(120); + +var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]; +var beatString = "0+2+0+110+1+0+13"; + +makeBeat(drumKit, 1, 1, beatString); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-range-error.js.txt new file mode 100644 index 000000000..1f315a54d --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-range-error.js.txt @@ -0,0 +1,8 @@ +// Range Error: Example + +setTempo(120); + +var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]; +var beatString = "1+3+1+221+2+1+24"; + +makeBeat(drumKit, 1, 1, beatString); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt new file mode 100644 index 000000000..f2bdc12d4 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt @@ -0,0 +1,6 @@ +// Reference Error: Correction + +setTempo(120); + +var today = readInput("What day is it?"); +println("Today is " + today); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt new file mode 100644 index 000000000..1aa333dec --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt @@ -0,0 +1,6 @@ +// Reference Error: Example + +setTempo(120); + +var today = readInput("What day is it?"); +println("Today is " + Today); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt new file mode 100644 index 000000000..e0539d0c7 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt @@ -0,0 +1,14 @@ +// Syntax Error: Correction + +setTempo(120); + +var clap = RD_TRAP_ARCADEFIRESFX_1; +var beatString = "00+-0-00+0+-0+++"; + +for (var measure = 1; measure < 32; measure++) { + if (measure % 4 === 0) { + // Use EarSketch API function to shuffle beat string + beatString = shuffleString(beatString); + } + makeBeat(clap, 1, measure, beatString); +} \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt new file mode 100644 index 000000000..12151b9ae --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt @@ -0,0 +1,13 @@ +# Syntax Error: Correction + +from earsketch import * +setTempo(120) + +clap = RD_TRAP_ARCADEFIRESFX_1 +beatString = "00+-0-00+0+-0+++" + +for measure in range(1, 32): + if measure % 4 == 0: + # Use EarSketch API function to shuffle beat string + beatString = shuffleString(beatString) + makeBeat(clap, 1, measure, beatString) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt new file mode 100644 index 000000000..253aa7318 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt @@ -0,0 +1,14 @@ +// Syntax Error: Example + +setTempo(120); + +var clap = RD_TRAP_ARCADEFIRESFX_1; +var beatString = "00+-0-00+0+-0+++"; + +for (var measure = 1; measure < 32; measure++){ + if (measure % 4 = 0) + // Use EarSketch API function to shuffle beat string + beatString = shuffleString(beatString); + } + makeBeat(clap, 1, measure, beatString); +} \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt new file mode 100644 index 000000000..9171d92d6 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt @@ -0,0 +1,13 @@ +# Syntax Error: Example + +from earsketch import * +setTempo(120) + +clap = RD_TRAP_ARCADEFIRESFX_1 +beatString = "00+-0-00+0+-0+++" + +for measure in range(1, 32): + if measure % 4 = 0 + # Use EarSketch API function to shuffle beat string + beatString = shuffleString(beatString) + makeBeat(clap, 1, measure, beatString) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt new file mode 100644 index 000000000..cfed47a26 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt @@ -0,0 +1,10 @@ +// Type Error: Correction + +setTempo(120); + +var soundClip = DUBSTEP_DRUMLOOP_MAIN_006; +var measureTotal = readInput("How many measures?"); + +println(measureTotal); + +fitMedia(soundClip, 1, 1, Number(measureTotal) + 1); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt new file mode 100644 index 000000000..b1431d922 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt @@ -0,0 +1,14 @@ +# Type Error: Correction + +from earsketch import * +setTempo(120) + +soundClips = DUBSTEP_DRUMLOOP_MAIN_006 +beatString = "0+000+++0--0-0--" +measureTotal = 0 + +for measure in range(1, 9): + makeBeat(soundClips, 1, measure, beatString) + measureTotal += 1 + +print("Your beat is " + str(measureTotal) + " measures long.") \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error.js.txt new file mode 100644 index 000000000..120fdad67 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error.js.txt @@ -0,0 +1,10 @@ +// Type Error: Example + +setTempo(120); + +var soundClip = DUBSTEP_DRUMLOOP_MAIN_006; +var measureTotal = readInput("How many measures?"); + +println(measureTotal); + +fitMedia(soundClip, 1, 1, measureTotal + 1); \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error.py.txt new file mode 100644 index 000000000..e135814d9 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-type-error.py.txt @@ -0,0 +1,14 @@ +# Type Error: Example + +from earsketch import * +setTempo(120) + +soundClip = DUBSTEP_DRUMLOOP_MAIN_006 +beatString = "0+000+++0--0-0--" +measureTotal = 0 + +for measure in range(1, 9): + makeBeat(soundClip, 1, measure, beatString) + measureTotal += 1 + +print("Your beat is " + measureTotal + " measures long.") \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt new file mode 100644 index 000000000..67a6b74d9 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt @@ -0,0 +1,9 @@ +# Value error: Correction + +from earsketch import * +setTempo(120) + +drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001] +beatString = "0+2+0+110+1+0+13" + +makeBeat(drumKit, 1, 1, beatString) \ No newline at end of file diff --git a/src/locales/ar/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-value-error.py.txt new file mode 100644 index 000000000..a3da72325 --- /dev/null +++ b/src/locales/ar/v1/code-examples/every-error-explained-in-detail-value-error.py.txt @@ -0,0 +1,9 @@ +# Value Error: Example + +from earsketch import * +setTempo(120) + +drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001] +beatString = "1+3+1+221+2+1+24" + +makeBeat(drumKit, 1, 1, beatString) \ No newline at end of file diff --git a/src/locales/ar/v1/every-effect-explained-in-detail.adoc b/src/locales/ar/v1/every-effect-explained-in-detail.adoc index 3c56caf95..f52da48f9 100644 --- a/src/locales/ar/v1/every-effect-explained-in-detail.adoc +++ b/src/locales/ar/v1/every-effect-explained-in-detail.adoc @@ -1,5 +1,6 @@ [[ch_28]] -== شرح كل تأثير بالتفصيل +== Every Effect Explained in Detail + :nofooter: [[bandpass]] @@ -7,351 +8,713 @@ ++++
myArray 0 (مصفوفتي)>
-* أنواع بيانات myArray 0 (مصفوفتي)>
-* عرض ال myArray 0 (مصفوفتي)>
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
--
[role="curriculum-javascript"]
[question]
--
-ما هو التركيب اللغوي لمصفوفتين (` arrayA ` و ` arrayB `)؟
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
[answers]
* `arrayA.concat(arrayB)`
* `arrayA.concatenate(arrayB)`
@@ -514,10 +478,20 @@ Thank you video
[role="curriculum-javascript"]
[question]
--
-كيف يمكنك الحصول على مصفوفة من ` oldArray ` بدون العنصر الأول والأخير؟
+How can you get an array from `oldArray` without the first and last elements?
+
[answers]
-* `oldArray.slice(1,oldArray.length-1]`
-* `oldArray.slice(1,oldArray.length)`
-* `oldArray.slice(0,oldArray.length)`
-* `oldArray.slice(2:oldArray.length-1)`
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/ar/v2/effects-and-envelopes.adoc b/src/locales/ar/v2/effects-and-envelopes.adoc
index 2e6ba4fb2..92b9ab79b 100644
--- a/src/locales/ar/v2/effects-and-envelopes.adoc
+++ b/src/locales/ar/v2/effects-and-envelopes.adoc
@@ -1,13 +1,16 @@
[[effectsandenvelopes]]
-== المؤثرات والمغلفات
+== Effects and Envelopes
+
:nofooter:
-يسمح EarSketch للملحن بتغيير مقاطع الصوت لإنتاج أصوات جديدة وفريدة من نوعها. يتم تحقيق ذلك من خلال الدالة `setEffect()` ، وهي محور هذا الفصل.
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
[[effectsinearsketch]]
-=== استخدام التأثيرات في EarSketch
+=== Use Effects in EarSketch
+
+:nofooter:
-*Effects*التأثيرات, تسمح لنا بتغيير جودة الأصوات. على غرار الطريقة التي نضيف بها مُنقي يُؤدي إلى تغيير الصورة ، فإن إضافة تأثير صوتي يغير الصوت. على سبيل المثال ، يمكنك تغيير مستوى الصوت وإضافة بعض صدى الصوت أو صدى ...
+*Effects* allow us to change qualities of sounds. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
[role="curriculum-python curriculum-mp4"]
[[video4py]]
@@ -17,88 +20,98 @@ video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
[[video4js]]
video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
-نستخدم الوظيفة`setEffect()` ، والتي تأخذ 4 عوامل ، على غرار `fitMedia()`:
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
-. *trackNumber*: المسار الذي سيتم إضافة التأثير إليه.
-. *effectName*: التأثير المحدد المُستخدم.
-. *effectParameter*: العامل أو الإعداد للتأثير.
-. *effectValue*: قيمة العامل: رقم في نطاق معين. النطاق يعتمد على عامل التأثير.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
-.تدريب
+.PRACTICE
****
-اكتب أغنية جديدة مع مسارين وعدّل مستوى الصوت لكلا المسارين باستخدام الدالة ` setEffect () `.
-في هذه الحالة ، يكون اسم التأثير (الوسيطة الثانية) هو VOLUME ، وعامل التأثير (الوسيطة الثالثة) هي GAIN. قيمة التأثير (الوسيطة الرابعة) هي عدد ديسيبل (ديسيبل) ، بين -60 و +12.
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
****
-فيما يلي مثال:
+Here is an example below:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-volume-effect.py.txt[]
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-volume-effect.js.txt[]
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
----
-لقد' رأينا تأثير `VOLUME`. دعونا 'ننظر الآن إلى `DELAY`. استمع إلى مقطعين أدناه ، أحدهما بدون تأثير والآخر بتأثير *delay*.
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
+
+No effect:
-بدون تأثير:
++++
audioMedia/reference.mp3
++++
-مع تأثير Delay:
+Delay effect:
+
++++
audioMedia/delay2.mp3
++++
-في هذه الحالة ، يكون اسم التأثير (الوسيطة الثانية) هو ` DELAY ` ، ويمكن أن يكون عامل التأثير (الوسيطة الثالثة) إما ` DELAY_TIME ` (كم من الوقت قبل صدى "الإجابات") أو ` DELAY_FEEDBACK ` (مدى ارتفاع صدى صوتك). قيمة ` DELAY_TIME ` بالمللي ثانية (1000 مللي ثانية هي ثانية واحدة) وقيمة ` DELAY_FEEDBACK ` هي رقم بين -120 و -1.
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
-.تدريب
+.PRACTICE
****
-. Read about the delay effect in the list of effects chapter here: <>
-. ثم قم بتشغيل المقطع البرمجي أدناه واستمع إلى الموسيقى بدون تأثيرات
-. ثم قم بإلغاء التعليق عن السطر الأول ` setEffect () ` واستمع إلى الفرق
-. ثم قم بإلغاء التعليق عن السطر الثاني ` setEffect () ` واستمع إلى الفرق ("uncomment" تعني محو صيغة التعليق ، ` # ` أو ` // ` من كتلة من التعليمات البرمجية)
-لاحظ أن وقت ، 500delay مللي ثانية ، هو طول نبضة واحدة. نظرًا لأن الإيقاع يبلغ 120 نبضة في الدقيقة ، فهناك نبضة واحدة كل 60/120 = 1/2 ثانية. 1 ثانية تساوي 1000 مللي ثانية ، لذا 1/2 ثانية هي 1000/2 = 500 مللي ثانية.
-يمكنك محاولة تعديل وقت الdelay ومراقبة ما إذا كانت موسيقاك تبدو أفضل أم لا.
+. Read about the delay effect in the list of effects chapter here: <>
+. Then run the code below and listen to the music without effects
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
****
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-delay-effect.py.txt[]
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-delay-effect.js.txt[]
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
----
+{nbsp} +
+
[[functionsandmoreeffects]]
-=== دوال وتأثيرات أكثر
+=== Functions and more effects
-حتى الآن '، كنت تستخدم العديد من الدوال في EarSketch مثل ` fitMedia () ` أو ` setEffect () `. لاحظ أن أسماء الدوال تبدأ دائمًا بحرف صغير ، وغالبًا ما تكون فعل. تُرشد الأقواس الحاسوي أن * يستدعي * ، أو * ينفذ * ، الدالة. * العوامل * (تسمى أحيانًا الوسائط) ، داخل الأقواس ، مفصولة بفواصل.
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Note that the function names always start with a lower-case letter, and are often a verb. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
[role="curriculum-python"]
-* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` تستقبل عوامل. هم جزء من *Application Programming Interface*او, *API*. تضيف EarSketch أو EarSketch API ميزات موسيقية إلى لغة Python. مثال آخر على API هو Google Maps API: مجموعة من الأدوات لتضمين الخرائط في مواقع الويب أو التطبيقات.
-* في فصل لاحق ، ستتعلم' أيضًا كيفية إنشاء الدوال المخصصة الخاصة بك.
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
[role="curriculum-javascript"]
-* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` تستقبل عوامل. هم جزء من *Application Programming Interface*او, *API*. تضيف EarSketch أو EarSketch API ميزات موسيقية إلى لغة JavaScript. مثال آخر على API هو Google Maps API: مجموعة من الأدوات لتضمين الخرائط في مواقع الويب أو التطبيقات.
-* في فصل لاحق ، ستتعلم' أيضًا كيفية إنشاء الدوال المخصصة الخاصة بك.
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
-يمكن أن تحتوي عوامل الدالة على نوع بيانات محدد. ترتيب العوامل مهم. فيما يلي بعض أمثلة لأنواع البيانات:
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
-* *Numbers- ارقام*. *Integers- عدد صحيح*(أو "int") هي أعداد صحيحة ، مثل 0 أو 5 أو -26. *Floating point-اعداد عشرية* أعداد عشرية مثل 0.125 أو 21.0-. على سبيل المثال ، فإن وسيطات/ عوامل رقم المسار وبدء القياس والنهاية للدالة ` fitMedia () ` كلها أرقام.
-* *Strings-سلسلة*. يتم استخدام سلسلة إيقاعية مثل ` "0000 ---- 0000 ----" ` ، كعامل في دالة ` makeBeat () `.
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
-الآن ، دعونا'نستمر باللعب مع الدالة ` setEffect () `. يوضح الفيديو التالي كيفية استخدام بعض التأثيرات:
+Now, let's play more with the `setEffect()` function. The following video shows how to use some effects:
////
VIDEO IS BEEING MADE
@@ -106,168 +119,173 @@ more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNP
("videos revamping" tab)
////
-*Reverb-تردد *(اختصار لصدى) هو صوت يرتد من الجدران ويعود إلى أذنيك. يمنح صوتك إحساسًا بالمساحة. فكر في الفرق بين التحدث في غرفة نوم صغيرة والتحدث في كنيسة كبيرة. كلما كانت الغرفة أكبر و "أكثر انبساطًا" ، كلما استغرقت الموجات وقتًا أطول للعودة إلى أذنيك ، ومن هنا يأتي صوت "غرفة الصدى الكبيرة". يحتوي التأثير ` REVERB ` على عوامل للتحكم في وقت الاضمحلال (` REVERB_DECAY `) ومقدار التأثير الموجود (` MIX `).
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
+
+Listen to the clips below to hear the result of adding reverb to a track:
-استمع إلى المقاطع أدناه لسماع نتيجة إضافة صدى إلى مسار:
+No effect:
-بدون تأثير:
++++
audioMedia/reverbReference.mp3
++++
-تأثير الصدى:
+Reverb effect:
+
++++
audioMedia/reverbEffect.mp3
++++
-.تدريب
+{nbsp} +
+
+.PRACTICE
****
-Go to this chapter for a complete list of effects: <>.
-قم بإنشاء أغنية ذات تأثير صوت وتأثيران آخران. لا تنس' كتابة ما تفعله في التعليقات وإنشاء متغيرات عند الضرورة.
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
****
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
-[[effectsandenvelopes]]
-=== المؤثرات والمغلفات
-
-في بعض الأحيان' ، نريد تغيير' التأثير بمرور الوقت:على سبيل المثال ، نريد أن يتلاشى الصوت(حجم الصوت يرتفع) في بداية الأغنية.
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
-*Envelopes*تسمح لنا بتحديد كيفية تغير التأثير بمرور الوقت.
+*Envelopes* allow us to define how an effect changes over time.
-سنستخدم زوجان وقت- قيمة. يحتوي كل زوج على قيمة تأثير ومقياس مناسب. على سبيل المثال ، (-60 ، 1 ، 0 ، 3) تعني أن النقطة موضوعة عند القيمة -60 عند المقياس 1 ، ونقطة أخرى توضع عند القيمة 0 عند المقياس 3. ينشئ المغلف خطًا بين هذه النقاط ، يسمى * ramp -منحدر *:
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
[[envelopepoints]]
-.مغلفات (مع ملاحظات) في EarSketch
-[caption="Figure 5.1: "]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
image::../media/U2/NewEnvelope.png[Alt Text]
-لتغيير مغلف ، تحتاج فقط إلى الدالة ` setEffect () ` مع 7 عوامل. العوامل الأربعة الأخيرة هي زوجان قيمة الوقت.
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
-. trackNumber
-- رقم المسار
-. effectName-اسم التأثير
-. effectParameter-عامل التأثير
-. effectStartValue-تأثير بداية القيمة
-. effectStartLocation-تأثير بداية الموقع
-. effectEndValue-تأثير نهاية القيمة
-. effectEndLocation-تأثير بداية الموقع
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
-العوامل الثلاثة الأخيرة من أصل 7 هي * optional parameters-عوامل اختيارية *. إذا تُركت بدون تحديد ، كما كان الحال عندما استخدمنا ` setEffect () ` مع 4 عوامل فقط ، فسيتم تطبيق التأثير على المسار بأكمله.
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
-هذا مثال على fade-التلاشي:
+Here is an example of fade in:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-envelopes.py.txt[]
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-envelopes.js.txt[]
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
----
-شاهد الآن هذا الفيديو لأمثلة المغلفات الأخرى
+Now watch this video for other envelope examples
[role="curriculum-python curriculum-mp4"]
[[video5b]]
video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
-
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
----
-
[role="curriculum-javascript curriculum-mp4"]
video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
----
-.تدريب
+{nbsp} +
+
+.PRACTICE
****
-أنشئ أغنية جديدة. استخدم حلقة for لإضافة غلاف إلى جميع المسارات (على سبيل المثال ، التلاشي والتلاشي لجميع المسارات) ، أو لتكرار كل تأثير في نفس المسار. يمكنك استخدام أي تأثير تريده.
-اجعل صديقك يستمع إلى أغنيتك ، مع وبدون التأثير (لسماع أغنيتك بدون تأثير ، قم بتحويل الاسطر في المقطع البرمجي التي تحد التأثير الى ملاحظة). يجب على صديقك تخمين التأثير الذي أضفته.
+Create a new song. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
****
-مثالا على ذلك. يضيف كل تكرار للحلقة مقطعًا طويلاً من المغلف بقياس واحد. يؤدي التغيير التلقائي لعامل GAIN إلى حدوث شدة تسوس إيقاعي. هذا تأثير شائع على موسيقى الرقص الإلكترونية EDM ، موضحة في أغنيةhttps://www.youtube.com/watch?v=Us_U-d2YN5Y[ -Rhythm إيقاع ] لLvly. حاول إيقاف تشغيل التأثير وتشغيله في DAW لسماع تأثير التأثير (باستخدام زر "bypass-تجاوز" على يسار قناة التأثير في DAW).
-
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
----
-وهنا مثال على التلاشي والتلاشي على جميع المسارات:
+And here is an example of fade in and fade out on all the tracks:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
----
+
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
----
+{nbsp} +
[[chapter5summary]]
-=== الفصل 5 ملخص
-
-* *Effects-تأثيرات *تغيير صفات الصوت لجعلها أكثر تميزًا.
-* *Volume- الصوت *يغير الحجم الصوت. *Delay*يخلق صدى. *Reverb-صدى *يجعلك تشعر وكأن الصوت يتم تشغيله في غرفة كبيرة. *Panning*يضع الموسيقى الخاصة بك على الجانب الأيسر أو الأيمن.
-* يتم تنفيذ التأثيرات في EarSketch باستخدام الدالة ` setEffect () `. تركيبها هو ` setEffect (trackNumber ، effectName ، effectParameter ، effectValue) `.
-** *trackNumber:*المسار التي سيتم إضافة التأثير إليه.
-** *effectName:*التأثير المحدد نفسه.
-** *effectParameter:*الإعداد المستخدم للتأثير.
-** *effectValue:*قيمة العامل: رقم في نطاق معين.
-* *Functions*تحتوي على تعليمات لجهاز الكمبيوتر لتنفيذها. يتم إرسال البيانات إلى الدوال بواسطة *arguments- عوامل* ، مما يؤثر على كيفية تنفيذ الدالة. صيغة *call* لدالة ذات عاملين هي: `myFunction(argument1, argument2)`. مثال على بناء الجملة المستخدمة في دالة *call* مع 4 عوامل هو `makeBeat(kick, 2, measure, kickBeat)`.
-* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
-* *Envelopes-مغلفات *تحديد كيفية تغير عامل التأثير بمرور الوقت. يتم تعريفها باستخدام أزواج القيمة الزمنية ، مثل _ (القيمة-value ، الوقت-time ، القيمة-value ، الوقت-time) _.
-* بالنسبة للمغلف ، فإن الوسيطات المكونة من 7 عوامل ` setEffect () ` هي: `setEffect(trackNumber, effectName, effectParameter, startEffectValue, effectStartLocation, endEffectValue, effectEndLocation)`.
-
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
[[chapter-questions]]
-=== الأسئلة
+=== Questions
[question]
--
-ما الذي يسمح لك التأثير بالقيام به في EarSketch؟
+What does an effect allow you to do in EarSketch?
+
[answers]
-* غيّر نوعية الصوت داخل المشروع
-* أضف صوت إلى المسار
-* انشئ قرع طبلة
-* غيّر وتيرة الأغنية
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
--
[question]
--
-أي مما يلي ليس وسيط ` setEffect () `؟
+Which of these is NOT a `setEffect()` argument?
+
[answers]
-* Clip Name-اسم المقطع
-* Effect Name-اسم التأثير
-* Effect Value-قيمة التأثير
-* Track Number-رقم المسار
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
--
[question]
--
-كيف يمكن ضبط وقت تأخير delay time تأثير التأخير ، في القناة الثالثة ، على 50 مللي ثانية؟
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
[answers]
* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
@@ -277,24 +295,27 @@ include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js
[question]
--
-أي مما يلي ليس معاملًا مستخدمًا لتعريف مغلفات باستخدام الدالة ` () setEffect `؟
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
[answers]
-* Clip Length-طول المقطع
-* Start Value-قيمه البدايه
-* Track Number-رقم المسار
-* Effect-تأثير
+* Clip Length
+* Start Value
+* Track Number
+* Effect
--
[question]
--
-ماذا ستفعل الدالة التالية ` setEffect () ` ؟
+What would the following `setEffect()` function do?
+
[source,python]
----
-setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 10)
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
----
+
[answers]
-* قم بزيادة مقدار التشويه على المسار 1 عبر 10 مقاييس.
-* تقليل مقدار التشويه على المسار 1 عبر 50 مقياسًا.
-* قم بزيادة حجم المسار 1 على 10 مقاييس.
-* قم بتقليل مستوى الصوت على المسار 1 عبر 50 مقياسًا.
---
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/ar/v2/get-user-input.adoc b/src/locales/ar/v2/get-user-input.adoc
index cc8876baf..27edbca84 100644
--- a/src/locales/ar/v2/get-user-input.adoc
+++ b/src/locales/ar/v2/get-user-input.adoc
@@ -1,15 +1,14 @@
[[getuserinput]]
-== Get user input
-:nofooter:
+== Get User Input
--إدخال المستخدم
+:nofooter:
-في هذا الفصل ، ستتعلم كيفية طلب المدخلات من المستخدمين وتكييف موسيقاك وفقًا لذلك. لذلك ، سنلقي نظرة' على دوال الإرجاع والوظيفة `readInput()`.
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. For that, we'll look at return statements and the `readInput()` function.
[[returnstatement]]
-=== تعليمات الارجاع- Return
+=== Return Statement
-شاهد الفيديو أولا:
+Watch this video first:
[role="curriculum-python curriculum-mp4"]
[[video131py]]
@@ -19,365 +18,191 @@ video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
[[video131js]]
video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
-. بالإضافة إلى أخذ بعض المدخلات (العوامل) ، يمكن للدوال إخراج قيمة. في البرمجة ، نسمي هذا إرجاع قيمة.
-. عبارة الارجاع *return * هي عبارة داخل جسم الدالة: أ. تخبر الدالة بإرجاع قيمة عند استدعائها. B. يشير الى إنهاء تشغيل الدالة. إذا كان لديك أي عبارات بعد `return` ، فسيتم تجاهلها.
-. لاستخدام القيمة التي تُرجعها الدالة ، أنشئ متغيرًا وعيِّنه لاستدعاء الدالة.
-. الامر return ليس إلزاميا. بدون الامر return ، لا تنتج الدالة أي قيمة. `fitMedia()` و `setEffect()`هي أمثلة على الدوال التي لا تعيد' أي شيء.
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. B. signals the function to stop. If you have any statements after the `return` keyword, they will be ignored.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
-مثال للمقطع البرمجي:
+Here is a code example:
[role="curriculum-python"]
[source,python]
----
-# Return Statements: Linking two beats together with return statements
-
-# Setup
-from earsketch import *
-setTempo(100)
-
-rhythm1 = "0+++0+0+0+--0+00"
-rhythm2 = "0+0-00++0-000+++"
-
-# Music
-def createBeat(startMeasure, soundClip, beatString):
- endMeasure = startMeasure + 3
- for measure in range(startMeasure, endMeasure):
- makeBeat(soundClip, 1, measure, beatString)
-
- # Return ending measure so we can use it outside function
- return endMeasure
-
-# Function calls
-# Assigning the value we return to a variable
-newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
-
-# Passing the returned value into another function
-createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
+include::code-examples/get-user-input-return-statements.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Return Statements: Linking two beats together with return statements
-
-// Setup
-setTempo(100);
-
-var rhythm1 = "0+++0+0+0+--0+00";
-var rhythm2 = "0+0-00++0-000+++";
-
-// Music
-function createBeat(startMeasure, soundClip, beatString) {
- var endMeasure = startMeasure + 3;
- for (var measure = startMeasure; measure < endMeasure; measure++) {
- makeBeat(soundClip, 1, measure, beatString);
- }
-
- // Return ending measure so we can use it outside function
- return endMeasure;
-}
-
-// Function calls
-// Assigning the value we return to a variable
-var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
-
-// Passing the returned value into another function
-createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
+include::code-examples/get-user-input-return-statements.js.txt[]
----
-مع تعليمات return-الارجاع ، يبدو تدفق التحكم الكامل للدالة كما يلي:
+With the return statement, the complete control flow for a function looks like this:
[[return]]
-.التحكم في تدفق تعليمات Return
-[caption="Figure 13.1: "]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
image::../media/U2/Return.png[Alt Text]
-.تدريب
+.PRACTICE
****
-اكتب دالة تنشئ مقطوعة موسيقية ، مع:
+Create a function that will implement a musical section with:
-* عامل واحد فقط ، يسمى `start` ، الذي يمثل بداية مقياس.
-* عبارة return-إرجاع واحدة تُرجع نهاية المقياس.
-* جسم دالة يحتوي على استدعاءات لدوال `fitMedia()`.
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
-يمكن أن يستمر قسمك بأي عدد تريده من المقاييس.
-ثم اتصل بالدالة ، واطبع مقياس النهاية.
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
****
-مثالا على ذلك:
+Here is an example:
[role="curriculum-python"]
[source,python]
----
-# Return Statements 2: Returning the end measure of a section function
-
-# Setup
-from earsketch import *
-setTempo(120)
-
-melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
-drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
-
-# Function definition
-def verse(start):
- end = start + 4
- fitMedia(melody1, 1, start, end)
- fitMedia(drums1, 2, start, end)
- return end
-
-# Function calls
-endMeasure = verse(1) # calling verse function and start is measure 1
-print(endMeasure)
+include::code-examples/get-user-input-return-statements-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Return Statements 2: Returning the end measure of a section function
-
-// Setup
-setTempo(120);
-
-var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
-var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
-
-// Function definition
-function verse(start) {
- var end = start + 4;
- fitMedia(melody1, 1, start, end);
- fitMedia(drums1, 2, start, end);
- return end;
-}
-// Function calls
-var endMeasure = verse(1); // calling verse function and start is measure 1
-println(endMeasure);
+include::code-examples/get-user-input-return-statements-2.js.txt[]
----
-.تدريب
+{nbsp} +
+
+.PRACTICE
****
-لنفترض' أن لديك قسم "أ" ، لكنك تريده أن يختلف قليلاً عند' استدعائه في لحظات مختلفة من الأغنية. ستقوم بإنشاء دالة تسمى `sectionA()` مع استدعائين`fitMedia()`.
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
-يجب أن تستقبل الدالة عاملين: `start`وعامل منطقي `variation` يسمح للمستخدم بالتغيير عند استدعاء الدالة.
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
-في جسم الدالة، يجب أن يكون لديك عبارة شرطية(if) تقوم بتقييم العامل. بناءً على قيمة العامل ، ستقوم بتغيير مقطع الصوت المستخدم في إحدى مكالماتك في `fitMedia()`.
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
-ثم قم باستدعاء الدالة في مقاييس مختلفة مع اختلافات مختلفة.
+Then call the function at different measures with different variations.
****
-مقطع برمجي مثالا على ذلك:
+Here is an example:
[role="curriculum-python"]
[source,python]
----
-# Conditional statement: Using a boolean to create variation in a function
-
-# Setup
-from earsketch import *
-setTempo(120)
-
-melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
-melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
-drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
-
-# Function definition
-def verse(start, variation):
- # variation is either equal to True or False
- if variation:
- fitMedia(melody1, 1, start, start + 4)
- else:
- fitMedia(melody2, 1, start, start + 4)
- fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
-
-# Function calls
-verse(1, True)
-verse(7, False)
+include::code-examples/get-user-input-conditional-statement.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Conditional statement: Using a boolean to create variation in a function
-
-// Setup
-setTempo(120);
-
-var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
-var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
-var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
-
-// Function definition
-function verse(start, variation) {
- // variation is either equal to true or false
- if (variation) {
- fitMedia(melody1, 1, start, start + 4);
- } else {
- fitMedia(melody2, 1, start, start + 4);
- }
- fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
-}
-
-// Function calls
-verse(1, true);
-verse(7, false);
+include::code-examples/get-user-input-conditional-statement.js.txt[]
----
+{nbsp} +
+
[[userinput]]
-=== الحصول على مُدخلات المستخدم
+=== Get User Input
-نحن'سنرى كيف نطلب إدخال المستخدم عند الضغط على زر "تشغيل". هذا ممكن بفضل دالة `readInput()`. تحتوي هذه الدالة على عامل من نوع سلسلة( string) ، مثل: "ما هو الإيقاع الذي تريده للموسيقى الخاصة بك؟". عندما يقوم المستخدم بتشغيل المقطع البرمجي ، سيرى نافذة جديدة تحتوي على السلسلة وسيُطلب منه كتابة إجابة. ترجع الدالة `readInput()` ما يكتبه المستخدم هناك.
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. The `readInput()` function returns what the user types there.
-على سبيل المثال ، انسخ المقطع البرمجي التالي في برنامج نصي جديد ، وقم بتشغيله:
+For example, copy the following code in a new script, and run it:
[role="curriculum-python"]
[source,python]
----
-answer = readInput("What tempo would you like for your music?")
-print(answer)
+include::code-examples/get-user-input-untitled1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-var answer = readInput("What tempo would you like for your music?");
-println(answer);
+include::code-examples/get-user-input-untitled1.js.txt[]
----
-في بعض الأحيان نريد تحويل قيمة من نوع بيانات إلى آخر. فيما يلي دوال مفيدة:
+We might need to convert the returned user input into a different data type. Here are useful functions:
[role="curriculum-python"]
-* `str()` -يحول أي قيمة إلى سلسلة.
-* `int()` - يحول سلسلة تحتوي على أرقام إلى عدد صحيح (على سبيل المثال: `"3"` يُصبح `3`).
-* `float()` -تحويل سلسلة تحتوي على أرقام مع فاصلة عشرية إلى عدد عشري (على سبيل المثال: `"3.5"` يُصبح `3.5`).
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
[role="curriculum-javascript"]
-* `String()` -يحول أي قيمة إلى سلسلة. لاحظ أنه لمرة واحدة' ، إن اسم الدالة يبدأ بحرف كبير.
-* `Number()` -يحول سلسلة إلى رقم(على سبيل المثال:`"3.5"` يُصبح`3.5`).
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
-في المثال أدناه ، يتم استخدام إدخال وحدة التحكم لتحديد إيقاع الأغنية. نتأكد من تحويل مدخلات المستخدم إلى عدد صحيح.
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
[role="curriculum-python"]
[source,python]
----
-# User input 1: Asking the user for the tempo
-
-# Setup
-from earsketch import *
-
-# asking for tempo
-question = "What tempo would you like for your music؟ Choose a number between 45 and 220"
-answer = readInput(question)
-
-# converting to an integer
-tempo = int(answer)
-
-# setting the tempo
-setTempo(tempo)
-
-# music
-fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
+include::code-examples/get-user-input-user-input-1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// User input 1: Asking the user for the tempo
-
-// Setup
-
-// asking for tempo
-var question = "What tempo would you like for your music؟ Choose a number between 45 and 220";
-var answer = readInput(question);
-
-// converting to a number
-var tempo = Number(answer);
-
-// setting the tempo
-setTempo(tempo);
-
-// music
-fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
+include::code-examples/get-user-input-user-input-1.js.txt[]
----
-فيما يلي مثال آخر لما يمكنك فعله بإدخال المستخدم.
+Here is another example of what you can do with user input.
-*Concatenation*هي وسيلة لربط السلاسل معًا باستخدام الرمز `+`. على سبيل المثال ، ربط السلاسل `"hello"`و`"world"`عائدات الى `"helloworld"`. في المثال التالي ، يُطلب من المستخدم تحديد رقم مقطع. الرقم متسلسل مع`DUBSTEP_BASS_WOBBLE_0` لإنشاء الاسم الكامل للمقطع مثل `DUBSTEP_BASS_WOBBLE_010`.
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
[role="curriculum-python"]
[source,python]
----
-# User input 2: Creating a dubstep song with user-specified parameters
-
-# Setup
-from earsketch import *
-setTempo(120)
-
-# Music
-clipNumber = readInput("Type a clip number between 10 and 46: ")
-dubStepClip = "DUBSTEP_BASS_WOBBLE_0"
-finalClip = dubStepClip + clipNumber
-
-# user selected dubstep wobbles
-fitMedia(finalClip, 1, 1, 5)
+include::code-examples/get-user-input-user-input-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// User input 2: Creating a dubstep song with user-specified parameters
-
-// Setup
-setTempo(120);
-
-// Music
-var clipNumber = readInput("Type a clip number between 10 and 46: ");
-var dubStepClip = "DUBSTEP_BASS_WOBBLE_0";
-var finalClip = dubStepClip + clipNumber;
-
-// user-selected dubstep wobbles
-fitMedia(finalClip, 1, 1, 5);
+include::code-examples/get-user-input-user-input-2.js.txt[]
----
-.تدريب
+{nbsp} +
+
+.PRACTICE
****
-اطلب إدخال من المستخدم لتعديل شيء ما في أغنيتك.
+Ask for a user input to modify something in your song.
-فيما يلي أفكار حول الأدوات التي يمكنك استخدامها:
+Here are ideas of tools you can use:
-. تسلسل السلسلة ،
-. تحويل البيانات،
-. إنشاء عامل مُحدد في وظيفة مخصصة
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
****
+{nbsp} +
+
[[booleanlogic]]
=== Boolean Logic
--المنطق البوليني
-دمج المنطق المنطقي والمدخلات من المستخدم في مثال آخر لتفاعل المستخدم.
+We will now combine boolean logic and user input for another example of user interaction.
[role="curriculum-python"]
-أولاً ، سوف' نتعلم عن المنطق البوليني. هل تعلم أن *comparison operatorsعوامل المقارنة- * تساعد في إنشاء قيمة منطقية. على سبيل المثال ، العامل `==`يتحقق مما إذا كانت قيمتان متساويتين ، وإذا كان الأمر كذلك ، يتم تعيين القيمة المنطقية الى`True`.
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
[role="curriculum-javascript"]
-أولاً ، سوف' نتعلم عن المنطق البوليني. هل تعلم أن comparison operatorsعوامل المقارنة-0-عوامل المقارنة> تساعد في إنشاء قيمة منطقية. على سبيل المثال ، العامل `===` يتحقق مما إذا كانت قيمتان متساويتين ، وإذا كان الأمر كذلك ، يتم تعيين القيمة المنطقية الى`True`.
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
-الآن دعونا نلقي 'نظرة على * العوامل المنطقية-boolean operators *: هذه تساعد في الجمع بين عدة قيم منطقية. هناك 3 عوامل منطقية:
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
[role="curriculum-python"]
-* `and-و`: يستقبل تعبيرين منطقيين ، ويعيد `True` فقط إذا كان كلاهما `True` ، غير ذلك فإنه يُرجع `False`.
-* `or-او`: يستقبل تعبيرين منطقيين ، ويعيد `True` فقط إذا كان أحدهما على الأقل `True` ، غير ذلك فإنه يُرجع `False`.
-* `not-ليس`: يستقبل مُدخلا منطقيًا واحدًا ويعيد القيمة المنطقية المعاكسة (القيمة العكسية).
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
[role="curriculum-javascript"]
-* `&&`: is called "and", it takes 2 boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
-* `||`: is called "or": it takes 2 boolean inputs and returns `true` when at least 1 input is `true`, otherwise returns `false`.
-* `!`: يسمى "ليس": يستقبل مدخلًا منطقيًا واحدًا ويعيد القيمة المنطقية المعاكسة (القيمة العكسية).
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
-على سبيل المثال ، إذا كنت تبلغ من العمر 16 عامًا ، فإن الجملة "أنا ' عُمري هو 16" صحيحة والجمل "أنا ' عُمري هو 17" خاطئة. الجملة "'عُمري16 وايضا' 17" (صح وخطأ) غير صحيح لأنك لست تبلغ من العمر 16 و 17 عامًا معًا. لكن الجملة' 16 او'17(صواب أو خطأ) هذا صحيح.
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
[role="curriculum-python"]
-.تدريب
+.PRACTICE
****
-ما رأيك في تقييم التعبيرات التالية؟ `True` or `False`؟
+What do you think the following expressions evaluate to? `True` or `False`?
* `not True`
* `True and False`
@@ -389,55 +214,34 @@ fitMedia(finalClip, 1, 1, 5);
****
[role="curriculum-javascript"]
-.تدريب
+.PRACTICE
****
-ما رأيك في تقييم التعبيرات التالية؟ `true` or `false`؟
+What do you think the following expressions evaluate to? `true` or `false`?
* `!true`
* `true && false`
* `true || false`
* `true && true`
-* `(صحيح && خطأ) || صحيح`
+* `(true && false) || true`
* `true && !false`
* `!(false || false)`
****
-استخدم المقطع البرمجي التالي لطباعة الإجابات:
+Use the following code to print the answers:
[role="curriculum-python"]
[source,python]
----
-# Boolean expressions: printing boolean expressions
-
-from earsketch import *
-
-print(not True)
-print(True and False)
-print(True or False)
-print(True and True)
-print((True and False) or True)
-print(True and not False)
-print(not (False or False))
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Boolean expressions: printing boolean expressions
-
-// Setup
-setTempo(120);
-
-println(!true);
-println(true && false);
-println(true || false);
-println(true && true);
-println((true && false) || true);
-println(true && !false);
-println(!(false || false);
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
----
-إليك تذكير بإنشاء منطقي، وبعض الأمثلة على العمليات المنطقية:
+Here is a reminder of boolean creation, and some examples of boolean operations:
[role="curriculum-python curriculum-mp4"]
[[video17apy]]
@@ -447,174 +251,114 @@ video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
[[video17ajs]]
video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
-
-.تدريب
+.PRACTICE
****
-سنجمع الآن بين إدخال المستخدم والعمليات المنطقية:
-اكتب نصًا يطلب من المستخدم اختيار النوع ، مع عدد محدود من الخيارات (على سبيل المثال "هيب هوب" و "كلاسيكي"). اعتمادًا على إجابة المستخدم' ، حدد سلسلة إيقاعية تعمل بشكل جيد مع النوع. يمكنك قبول عدة احتمالات ، على سبيل المثال: "HIP HOP" و "hip hop" و "Hip Hop" ستخرج نفس الأغنية.
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
****
-مثالا على ذلك:
+Here is an example:
+
[role="curriculum-python"]
[source,python]
----
-# Boolean operations: Asking user for genre and creating beat accordingly
-
-from earsketch import *
-setTempo(120)
-
-# Sound variables
-kick = OS_KICK02
-hihat = OS_CLOSEDHAT04
-clap = OS_CLAP03
-
-# Beat string variables
-hiphopKickBeat = "0++++---0+++0+++"
-hiphopHihatBeat = "----0---00---000"
-edmKickBeat = "0+++----0+++----"
-edmClapBeat = "----0-------0---"
-
-# Requesting user input
-genre = readInput("What genre is your favourite؟ Hip Hop or EDM?")
-
-# Creating the appropriate rhythm
-if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
- makeBeat(kick, 1, 1, hiphopKickBeat)
- makeBeat(hihat, 2, 1, hiphopHihatBeat)
-elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
- makeBeat(kick, 1, 1, edmKickBeat)
- makeBeat(clap, 2, 1, edmClapBeat)
-else:
- print("Sorry we couldn't read the genre you selected. Please run the code again")
-
-# Adding some reverb on track 2
-setEffect(2, REVERB, MIX, 0.1)
+include::code-examples/get-user-input-boolean-operations.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Boolean operations: Asking user for genre and creating beat accordingly
-
-// Setup
-setTempo(120);
-
-// Sound variables
-var kick = OS_KICK02;
-var hihat = OS_CLOSEDHAT04;
-var clap = OS_CLAP03;
-
-// Beat string variables
-var hiphopKickBeat = "0++++---0+++0+++";
-var hiphopHihatBeat = "----0---00---000";
-var edmKickBeat = "0+++----0+++----";
-var edmClapBeat = "----0-------0---";
-
-// Requesting user input
-var genre = readInput("What genre is your favourite؟ Hip Hop or EDM?");
-
-// Creating the appropriate rhythm
-if ((genre == "Hip Hop") || (genre == "hip hop") || (genre == "HIP HOP")) {
- makeBeat(kick, 1, 1, hiphopKickBeat);
- makeBeat(hihat, 2, 1, hiphopHihatBeat);
-} else if ((genre == "edm") || (genre == "Edm") || (genre == "EDM")) {
- makeBeat(kick, 1, 1, edmKickBeat);
- makeBeat(clap, 2, 1, edmClapBeat);
-} else {
- println("Sorry we couldn't read the genre you selected. Please run the code again");
-}
-
-// Adding some reverb on track 2
-setEffect(2, REVERB, MIX, 0.1);
+include::code-examples/get-user-input-boolean-operations.js.txt[]
----
-.تحدّ
+{nbsp} +
+
+.CHALLENGE
****
-هذا هو تحدي Jukebox: اكتب نصًا يطلب إدخال المستخدم من حيث النوع ، مع 3 خيارات (على سبيل المثال "latino" و "trap" و "dubstep"). بناءً على إجابة المستخدم' ، قم بإنشاء أغنية تتناسب مع النوع.
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
****
+{nbsp} +
+
[[chapter8summary]]
-=== الفصل 8 ملخص
+=== Chapter 8 Summary
[role="curriculum-python"]
-* *Return statements*تستخدم في تعريف الدالة لإخراج نتيجة عند استدعاء الدالة
-* `readInput()`سيطلب إدخال المستخدم عند تشغيل مقطعك البرمجي. العامل الوحيد هي سلسلة سيراها المستخدم. يمكنك بعد ذلك استخدام ما كتبه المستخدم في مقطعك البرمجي ، على سبيل المثال لتغيير الإيقاع أو نوع الموسيقى الخاصة بك.
-* تسمح لك بعض الدوال بتحويل البيانات من نوع إلى آخر. `str()` يحول أي قيمة إلى سلسلة.
-`int()`يحول سلسلة تحتوي على أرقام إلى عدد صحيح. `float()`تحويل سلسلة تحتوي على أرقام بعلامة عشرية.
-* يمكنك ربط*concatenate* (رابط) سلاسل معًا: "Hello"+"World" ستكون قيمتها "HelloWorld"
-* *Boolean logic*يتضمن العمليات المنطقية. فيما يلي عوامل التشغيل المنطقية:
-** `and-و`: يستقبل تعبيرين منطقيين ، ويعيد `True` فقط إذا كان كلاهما `True` ، غير ذلك فإنه يُرجع `False`.
-** `or-او`: يستقبل تعبيرين منطقيين ، ويعيد `True` فقط إذا كان أحدهما على الأقل `True` ، غير ذلك فإنه يُرجع `False`.
-** `not-ليس`: يستقبل مُدخلا منطقيًا واحدًا ويعيد القيمة المنطقية المعاكسة (القيمة العكسية).
-* الآن ، لدينا العديد من الأدوات التي تسمح لنا بإجراء تغييرات: يمكن للإدخال من المستخدم تحديد عناصر معينة في الأغنية. يمكننا إضافة عوامل إلى الدوال التي أنشأناها ، والتي ستحدد ماهية التغيير.
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
[role="curriculum-javascript"]
-* *Return statements*<0 إرجاع البيانات, يمكن تضمينها في تعريف دالة لإخراج نتيجة عند استدعاء الوظيفة
-* `readInput()`يطلب الإدخال من المستخدم أثناء تشغيل المقطع البرمجي. العامل الوحيد هي السلسلة التي سيراها المستخدم. يمكنك بعد ذلك استخدام ما كتبه المستخدم في مقطعك البرمجي ، على سبيل المثال لتغيير الإيقاع أو نوع الموسيقى الخاصة بك.
-* تسمح لك بعض الدوال بتحويل البيانات من نوع إلى آخر. على سبيل المثال ، تقوم() str بتحويل البيانات إلى سلسلة. `String()` يحول أي قيمة إلى سلسلة. لاحظ أنه لمرة واحدة' ، إن اسم الدالة يبدأ بحرف كبير. `() Number`يحول سلسلة إلى رقم.
-* يمكنك ربط*concatenate* (رابط) سلاسل معًا: "Hello"+"World" ستكون قيمتها "HelloWorld"
-* *Boolean logic*يتضمن العمليات المنطقية. هناك عوامل منطقية:
-** `&&`: is called "and", it takes 2 boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
-** `||`: is called "or": it takes 2 boolean inputs and returns `true` when at least 1 input is `true`, otherwise returns `false`.
-** `!`: يسمى "ليس": يستقبل مدخلًا منطقيًا واحدًا ويعيد القيمة المنطقية المعاكسة (القيمة العكسية).
-* الآن ، لدينا العديد من الأدوات التي تسمح لنا بإجراء تغييرات: يمكن للإدخال من المستخدم تحديد عناصر معينة في الأغنية. يمكننا إضافة عوامل إلى الدوال التي أنشأناها ، والتي ستحدد ماهية التغيير.
-
-
-
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
[[chapter-questions]]
-=== الأسئلة
+=== Questions
[question]
--
-أي مما يلي يمكن اعتباره مثالاً على تحويل نوع البيانات؟
+Which of the following would be considered an example of data type conversion?
+
[answers]
-* تحويل السلسلة إلى رقم.
-* يخزن قيمة الإيقاع ، التي يحددها المستخدم ، في متغير.
-* استخدام ` readInput () ` مطالبة نوع ما من المستخدم.
-* إنتاج قيمة منطقية من خلال عامل مقارنة.
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Using `readInput()` to ask a user for a genre.
+* Producing a Boolean through a comparison operator.
--
[role="curriculum-python"]
[question]
--
-ماذا سيكون ناتج مقتطف المقطع البرمجي التالي (على سبيل المثال ، ما الذي سيتم طباعته على وحدة التحكم)؟
+What would the output of this block of code be (what would print to the console)?
+
[source,python]
----
-n = 5
-if (n * 3) == 15:
- m = 5 + n
- print(m)
+not (True and (4 > 5))
----
+
[answers]
-* `10`
-* `n`
* `True`
+* `5`
+* `4`
* `False`
--
[role="curriculum-javascript"]
[question]
--
-ماذا سيكون ناتج مقتطف المقطع البرمجي التالي (على سبيل المثال ، ما الذي سيتم طباعته على وحدة التحكم)؟
+What would the output of this block of code be (what would print to the console)?
+
[source,javascript]
----
-var n = 5;
-if (n * 3 == 15) {
- var m = 5 + n;
- println(m);
-}
+!(true && (4 > 5));
----
+
[answers]
-* `10`
-* `n`
-* `True`
-* `False`
+* `true`
+* `4`
+* `false`
+* `5`
--
[question]
--
-أي مما يلي مثال على التسلسل-concatenation؟
+Which of the following is an example of concatenation?
+
[answers]
* `x = beatstring1 + beatstring2`
* `x = beatstring1.beatstring2`
@@ -625,29 +369,23 @@ if (n * 3 == 15) {
[role="curriculum-python"]
[question]
--
-كيف يتم تقييم التعبير التالي؟
-[source,python]
-----
-not (True and (4 > 5))
-----
+How would you obtain the boolean True with the booleans True and False?
+
[answers]
-* `True`
-* `False`
-* `! true`
-* `"false"`
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
--
[role="curriculum-javascript"]
[question]
--
-كيف يتم تقييم التعبير التالي؟
-[source,javascript]
-----
-!(true && (4 > 5));
-----
+How would you obtain the boolean true with the booleans true and false?
+
[answers]
-* `true`
-* `false`
-* `True`
-* `"false"`
---
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/ar/v2/getting-started.adoc b/src/locales/ar/v2/getting-started.adoc
index cde7e5c8c..c90f659c1 100644
--- a/src/locales/ar/v2/getting-started.adoc
+++ b/src/locales/ar/v2/getting-started.adoc
@@ -1,15 +1,16 @@
[[getstartedwithearsketch]]
-== لنبدأ مع EarSketch
-:nofooter:
+== Getting Started with EarSketch
-في هذا الفصل ستتعلم كيفية عمل برنامج EarSketch ، وكيفية وضع الأصوات (clips) في الموسيقى الخاصة بك، وكيفية تصحيح الكود البرمجي الخاص بك.
+:nofooter:
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
[[discoverearsketch]]
-=== اكتشف EarSketch
+=== Discover EarSketch
+
:nofooter:
-في برنامج EarSketch ، سوف تعطي تعليمات للكمبيوتر عن طريق كتابة كود من التعليمات البرمجية. سطر واحد من الكود (التعليمات البرمجية) هو تعليمة/امر واحدة. جميع التعليمات معاً تسمى برنامج (يمكن أن تسمى هذه التعليمات أيضًا خوارزمية/الغوريثم). تمامًا مثل اتباع وصفة في كتاب طبخ يمكن أن يؤدي إلى وجبة مطبوخة ، فإن تنفيذ برنامج في EarSketch يمكن أن يؤدي إلى أغنية. أين يذهب الكود في البرنامج؟ اكتشف في الفيديو أدناه!
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
[role="curriculum-mp4"]
[[video1a]]
@@ -19,26 +20,24 @@ video::./videoMedia/1_1_Discover_EarSketch.mp4[]
TODO: upload video
////
-لاستخدام EarSketch:
+As you become familiar with EarSketch these are the main panels.
-. يمكنك تصفح واختيار الأصوات من متصفح الصوت sound browser.
-. سوف تكتب التعليمات البرمجية/الكود في محرر التعليمات البرمجية code editor.
-. عند النقر فوق الزر * تشغيل * ، ستظهر الموسيقى الخاصة بك في * محطة عمل الصوت الرقمي * (أو * DAW *)
-. يمكنك بعد ذلك النقر على زر *تشغيل* للاستماع إلى الموسيقى الخاصة بك
-. قم بتغيير التعليمات البرمجية/الكود الخاصة بك حتى تكون راضياً عما تسمعه!
-. يمكنك فتح وإغلاق لوحة المناهج الدراسية هذه باستخدام زر التبديل في الجزء العلوي من اللوحة
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
-_ما هي منصة العمل الصوتية DAW؟_
+{nbsp} +
-* محطة عمل الصوت الرقمي * ، أو *DAWDAW* ، هي جزء من البرنامج ينتج أو يعدل مقاطع الصوت أو الصوت على جهاز كمبيوتر ، سواء كان ذلك في استوديو احترافي أو في كمبيوتر محمول منزلي- الاستوديوهات القائمة.
+_What is a DAW?_
-تتضمن بعض المنصات الصوتية https://www.ableton.com/[Ableton^]و https://www.apple.com/logic-pro/[Logic Pro^],http://www.apple.com/mac/garageband/[GarageBand^],http://www.reaper.fm/[<3>^]3>Reaper3>.
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
-باستخدام DAW ، يمكنك تسجيل الملفات الصوتية, تحريرها, تصورها وتشغيلها. تسمى هذه الملفات الصوتية * مقاطع *.
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
-يشبه EarSketch منصّة عمل صوتيةDAW ، إلا أنه يمكنك برمجة العناصر الموسيقية مباشرةً باستخدام المقطع البرمجي.
+EarSketch is DAW that allows you to create music by writing code.
-إليك كيفية الاستفادة الكاملة من منصة العمل الصوتية-DAW:
+Here is how to make full use of the DAW:
[role="curriculum-mp4"]
[[video1b]]
@@ -48,77 +47,66 @@ video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
////
-
-دعونا 'نحاول تشغيل مثال لمقطع برمجي في EarSketch! في المربع أدناه ، اضغط على أيقونة الحافظة الزرقاء في الزاوية اليمنى العليا. سيؤدي هذا إلى لصق مثال المقطع البرمجي في ملف جديد في* محرر المقطع البرمجي*. لا حاجة لفهم المقطع البرمجي حتى الآن ، فقط اضغط على الزر _ تشغيل _ وستظهر الموسيقى الخاصة بك في منصة العمل الصوتيةDAW. يمكنك الضغط على الزر _ تشغيل _ لسماعه.
-طلب السياق.
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-intro-script.py.txt[]
+include::code-examples/getting-started-intro-script.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-intro-script.js.txt[]
+include::code-examples/getting-started-intro-script.js.txt[]
----
{nbsp} +
-
-
[[createanewscript]]
-=== قم بإنشاء البرنامج النصي الأول الخاص بك!
+=== Create your first script!
-في EarSketch ، سيتوافق كل نص تكتبه مع أغنية واحدة. دعونا 'نرى كيفية إنشاء برنامج نصي:
+Let's see how to create a script from scratch.
-. *تسجيل الدخول أو إنشاء حساب جديد* في الزاوية العلوية اليمنى من شاشتك. إذا قمت بالنقر فوق الزر الأبيض المكتوب عليه "إنشاء / إعادة تعيين الحساب" ، يمكنك إما استعادة كلمة المرور المفقودة ، أو إنشاء حساب جديد ("تسجيل حساب جديد"). _Caution- الحذر:_بشكل عام على الإنترنت ، لا' تستخدم نفس كلمة المرور لجميع حساباتك &؛ لا تشارك كلمات مرورك أبدًا.
-
-. *انقر لإنشاء* إذا لم يكن' لديك أي نصوص مفتوحة ، فانقر على الرابط الأزرق الكبير في محرر المقطع البرمجي الذي ينص على "انقر هنا لإنشاء نص جديد!"
+. *Create.* In the editor tabs, click the white "+" icon.
+
-إذا كان لديك نص أو أكثر مفتوحًا بالفعل ، فانقر على أيقونة "+" البيضاء بجوار علامة التبويب الموجودة في أقصى اليمين.
+If this is your first script, click the large blue text "Click here to create a new script!"
+
[[newscriptplus]]
-.إنشاء نص جديد ، فتح البرامج النصية
+.Create a new script, open scripts
[caption="Figure 1.2.1: "]
image::../media/U1P1/NewScriptPlus.png[Alt Text]
-
-
-. *اختر اسمًا ولغة:*يفتح مربع الحوار "إنشاء برنامج نصي جديد". امنح برنامجك النصي الجديد اسمًا وسيكون اسم أغنيتك. ثم حدد لغة البرمجة (Python أو Javascript). أخيرًا ، انقر فوق الزر "إنشاء".
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
+
[[newscriptpromptpy]]
-.إنشاء صندوق حوار لبرنامج نصي جديد
+.The create a new script dialog box
[role="curriculum-python"]
[caption="Figure 1.2.2: "]
image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
[[newscriptpromptjs]]
-.إنشاء صندوق حوار لبرنامج نصي جديد
+.The create a new script dialog box
[role="curriculum-javascript"]
[caption="Figure 1.2.2: "]
image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+*_What is a programming language?_*
-*_ما هي لغة البرمجة؟_*
-
-تمت كتابة المقطع البرمجي* بلغة برمجة* ، والتي تتضمن مفردات وبناء جملة ، تمامًا مثل اللغة العادية. تحتاج إلى معرفة القواعد النحوية للغة البرمجة الخاصة بك أو لن يتمكن' الكمبيوتر من تنفيذ تعليماتك.
-
-في EarSketch ، يمكنك البرمجة باستخدام Python أو JavaScript.
-
-[role="curriculum-python"]
-_أنت في وضع بايثون-Python. يتم استخدام Python من قبل شركات مثل Google و Yahoo و NASA و Disney ولألعاب البرمجة مثل Civilization 4 و Battlefield 2 و Crystal Space._
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
-[role="curriculum-javascript"]
-_أنت في وضع JavaScript. JavaScript هي إحدى لغات البرمجة العشر الأكثر شيوعًا في العالم. يستخدم كل موقع ويب تقريبًا JavaScript._
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
-في المستوى الأعمق ، تعمل أجهزة الكمبيوتر في مجموعات من 1 و 0: أرقام ثنائية. ذلك 'لأن المكونات الإلكترونية يمكن أن تتفاعل بشكل مختلف إذا كان هناك تيار كهربائي (1) أو إذا لم يكن هناك تيار كهربائي (0). عندما تضغط على الزر * تشغيل * ، يترجم الكمبيوتر تعليمات Python أو JavaScript إلى كود ثنائي. ثم يتم *تنفيذ*الرمز بواسطة الكمبيوتر ، ويمكنك رؤية الموسيقى الخاصة بك تظهر في منصة العمل الصوتية-DAW.
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
[[fitmedia]]
-=== دالة ال `fitMedia()`
+=== The `fitMedia()` function
-الآن بعد أن أنشأت السيناريو الأول ، دعنا' نبدأ العمل على موسيقاك!
+Now that you have created your first script, let's start working on your music!
-شاهد هذا الفيديو لمعرفة كيفية إضافة مقطع صوتي إلى ألاغنية الخاصة بك:
+Watch this video to see how to add an audio clip to your song:
[role="curriculum-python curriculum-mp4"]
[[video110py]]
@@ -128,27 +116,51 @@ video::./videoMedia/1_3_fitmedia_py.mp4[]
[[video110js]]
video::./videoMedia/1_3_fitmedia_js.mp4[]
-لإضافة مقطع صوتي إلى منصة العمل الصوتيةDAW
، نبدأ بكتابة fitMedia()0>. بين القوسين ، سيكون 'لدينا 4 عوامل ، مفصولة بفاصلات:
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
-. * اسم مقطع *: ضع المؤشر بين القوسين ، وانتقل إلى متصفح الصوت ، وحدد مقطعًا ، والصقه باستخدام رمز اللصق الأزرق.
-. * رقم المسار *: المسارات هي الصفوف التي تعمل عبر منصة العمل الصوتيةDAW الرقمية ؛ أنها تساعدك على تنظيم الأصوات الخاصة بك حسب نوع الآلة (غناء ، الغيتار الرئيسي ، إيقاع الغيتار ، الجهير ، الطبول ، إلخ). يمكنك البدء في المسار الأول لصوتك الأول.
-. * بدء القياس *: قياس وقت بدء تشغيل الصوت. القياسات هي وحدات زمنية موسيقية. مقياس واحد هو 4 دقات-ضربات. يمكنك البدء في قياس واحد بصوتك الأول.
-. * نهاية القياس *: القياس وقت توقف الصوت عن التشغيل.
+`fitMedia(sound, track, start, end)`
-_مثال:_``fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)` سيضع الصوت <1>Y18_DRUM_SAMPLES_2` على المسار 1 من القياس 1 إلى القياس 5.
+There are 4 *parameters*, separated by commas.
-ثم اضغط على _ تشغيل _: يجب أن تتخيل صوتك في منصة العمل الصوتية الرقميةDAW. عند الضغط على _ تشغيل _ يمكنك سماعه.
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
-[role="curriculum-javascript"]
-تخبر*العبارة* الحاسوب بتنفيذ إجراء ما. على سبيل المثال,`fitMedia(Y18_DRUM_SAMPLES_1, 1, 1, 5);`هو بيان. كل عبارة في JavaScript *_<1>يجب أن تنتهي بفاصلة منقوطة_*.
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
////
OPTIONAL
////
-* متصفح الصوت *: تصفح أو ابحث عن 4000 مقطع صوتي لاستخدامها في موسيقاك ، من تأليف الموسيقيين / المنتجين https://en.wikipedia.org/wiki/Young_Guru[ Young Guru ^] ، https://en.wikipedia.org/wiki/Richard_Devine[ Richard Devine ^] ، <3 > Ciara و https://en.wikipedia.org/wiki/Common_(rapper)[ Common ^] و https://en.wikipedia.org/wiki/Pharrell_Williams[ Pharrell Williams ^] و Irizarry y Caraballo و https://www.sndbrd.com/[ Milknsizz ^].
+{nbsp} +
+
+*_The Sound Browser_*
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
////
END OF OPTIONAL
@@ -157,55 +169,54 @@ END OF OPTIONAL
////
OPTIONAL
////
-
-شاهد بعض الأمثلة على التعليمات البرمجية باستخدام ` fitMedia () ` (تذكر أنه يمكنك النقر فوق لوحة الحافظة الزرقاء في الزاوية اليمنى العليا من المربع للصق الرمز في ملف جديد):
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia.py.txt[]
+include::code-examples/getting-started-using-fitmedia.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia.js.txt[]
+include::code-examples/getting-started-using-fitmedia.js.txt[]
----
-لتحدي إضافي ، أضف المزيد من استدعاءات `fitMedia()`إلى البرنامج النصي كما نفعل أدناه. لاحظ أننا نستخدم رقم مسار مختلف لكل استدعاء` fitMedia () `:
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia-2.py.txt[]
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia-2.js.txt[]
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
----
{nbsp} +
-.تدريب
+.PRACTICE
****
-باستخدام الأصوات التي تحبها:
+Using sounds that you like:
-. ضع الأصوات على مسارين مختلفين
-. ضع الأصوات من قياس 2 حتى12
-. قم بإنشاء أغنية قصيرة من 3 مسارات بطول 8 مقاييس أو أكثر
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
-لكل تمرين ، يمكنك أن تجعل صديقك يستمع إلى أغنيتك.
+For each exercise, you can have your neighbour listen to your song.
-إذا كانت لديك أخطاء عند تشغيل التعليمات البرمجية الخاصة بك ، فتحقق من الفصل التالي حول تصحيح الأخطاء.
+If you have errors when running your code, check out the next chapter about debugging.
****
-
[[debugging]]
-=== تصحيح التعليمات البرمجية الخاصة بك
+=== Debug your code
-يرتكب المبرمجون أحيانًا أخطاء تؤدي إلى عمل التعليمات البرمجية بشكل غير صحيح أو عدم تشغيلها على الإطلاق. في البرمجة ، تسمى أخطاء الترميز * أخطاء * أو * خلل برمجي *. تسمى عملية البحث عن الأخطاء وإصلاحها * تصحيح الأخطاء *. يمكنك استخدام استراتيجيات التصحيح باستخدام وحدة التحكم.
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. You can use debugging strategies, using the console.
[role="curriculum-python curriculum-mp4"]
[[video3py]]
@@ -223,132 +234,106 @@ TODO: This video needs some revamping. See recommandations here: https://docs.go
OPTIONAL
////
-ما هي أنواع الأخطاء المختلفة؟
+What are the different types of errors?
-. * أخطاء في بناء الجملة *: برنامجك لا يعمل لأن مقطعك البرمجي يكسر قواعد *<0>بناء الجملة* للغة ' (على سبيل المثال: نسيت إغلاق قوس ، أو كتبت fitMedia بشكل غير صحيح).
-. * أخطاء وقت التشغيل *: يبدأ برنامجك في العمل ولكنه يتوقف بسبب خطأ.
-. * أخطاء منطقية *: يعمل برنامجك ، لكنه لا يفعل' ما هو متوقع. يمكنك إصلاحها من خلال النظر إلى منصة العمل الصوتية للتحقق مما إذا كانت المقاطع التي قصدت إضافتها قد تمت إضافتها بالفعل في المكان الصحيح.
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
////
END OF OPTIONAL
////
-
-فيما يلي بعض الأخطاء الشائعة:
+Here are some common errors:
[role="curriculum-python"]
-. * خطأ إملائي: * تدقق من الاملاء عند استخدام دالة مثل ` fitMedia () ` أو ثوابت الصوت.
-. * حساسية حالة الأحرف: * معظم الكلمات المستخدمة في البرمجة حساسة لحالة الأحرف (يتعرف الكمبيوتر على الفرق بين الأحرف الكبيرة وغير الكبيرة). انتبه للأحرف الصغيرة والكبيرة. على سبيل المثال ، اكتب ` fitMedia () ` وليس ` FitMedia () ` أو ` fitmedia () `. تتبع معظم العناصر في البرنامج النصي قاعدة تسمى * camel-caps *: الكلمة الأولى هي أحرف صغيرة ، والحرف الأول من الكلمات اللاحقة مكتوب بأحرف كبيرة ، كما في ` exampleFunctionName () `.
-. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
-. * إعداد البرنامج النصي: * يضيف EarSketch دوال الإعداد إلى برنامج نصي جديد تلقائيًا ، ولكن قد تحذف عن طريق الخطأ ` from earsketch import * ` .
-. * علامات الترقيم: * الفواصل المفقودة أو أخطاء علامات الترقيم الأخرى
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
[role="curriculum-javascript"]
-. * خطأ إملائي: * تدقق من الاملاء عند استخدام دالة مثل ` fitMedia () ` أو ثوابت الصوت.
-. * حساسية حالة الأحرف: * معظم الكلمات المستخدمة في البرمجة حساسة لحالة الأحرف (يتعرف الكمبيوتر على الفرق بين الأحرف الكبيرة وغير الكبيرة). انتبه للأحرف الصغيرة والكبيرة. على سبيل المثال ، اكتب ` fitMedia () ` وليس ` FitMedia () ` أو ` fitmedia () `. تتبع معظم العناصر في البرنامج النصي قاعدة تسمى * camel-caps *: الكلمة الأولى هي أحرف صغيرة ، والحرف الأول من الكلمات اللاحقة مكتوب بأحرف كبيرة ، كما في ` exampleFunctionName () `.
-. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
-. * علامات الترقيم: * الفواصل المفقودة أو أخطاء علامات الترقيم الأخرى
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
-حان وقت التدريب!
-ابحث عن الأخطاء الخمسة في المقطع البرمجي التالي:
+Time to practice!
+Find the five errors in the following code:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-finding-errors.py.txt[]
+include::code-examples/getting-started-finding-errors.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-finding-errors.js.txt[]
+include::code-examples/getting-started-finding-errors.js.txt[]
----
+
////
OPTIONAL
////
-إليك الإجابة
+Here is the answer
-. الدالة `setTempo()`تفتقد إلى الأقواس
-. أول ` fitMedia () ` ينقصه الحرف "e"
-. أول ` fitMedia () ` ينقصه فاصلة بين العاملين الثالث والرابع
-. الثانية ` fitMedia () ` تفتقد إلى حرف كبير "M"
-. في الثانية ` fitMedia () ` ، ترتيب العوامل غير صحيح: يجب أن يكون اسم مقطع الصوت ثم رقم المسار
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
////
END OF OPTIONAL
////
-Take a look at <> for a description of different error types and what you can do to prevent them.
-
+Take a look at <> for a description of different error types and what you can do to prevent them.
////
TODO: when options are ready, modify the link
////
-
-
-
-
-
[[chapter1summary]]
-=== الفصل 1ملخص
-
-[role="curriculum-python"]
-* سطر من التعليمات البرمجية هو تعليمات يجب أن يتم تنفيذها بواسطة الكمبيوتر. كل التعليمات معا تشكل البرنامج.
-* *DAW'*هي برامج كمبيوتر متخصصة لتسجيل وتحرير وتشغيل ملفات الصوت الرقمية أو * مقاطع *. EarSketch هو منصة عمل صوتية تسمح بوضع المقاطع الصوتية في جدول زمني مع رمز.
-* لإنشاء موسيقى في EarSketch ، يتم كتابة المقطع البرمجي أولاً في لوحة محرر المقطع. بعد الضغط على تشغيل ، يتم تشغيل الموسيقى في لوحة DAW.
-* يمكن العثور على مقاطع الصوت في متصفح الصوت. يشار إليهم بكتابة أو لصق اسمهم بأحرف كبيرة.
-* الحسوب * برنامج * وهو سلسلة من التعليمات التي ينفذها الكمبيوتر لإنجاز مهمة محددة.
-* * لغات البرمجة * هي مجموعة من الكلمات والرموز التي يفهمها الحاسوب. تتبع لغة البرمجة بناء الجملة من أجل تنظيم المقطع الرمجي.
-* يتكون برنامج EarSketch النصي من قسم التعليقات وقسم الإعداد وقسم الموسيقى.
-* قم بإنشاء برنامج نصي جديد عن طريق النقر فوق الارتباط الأزرق الكبير أو الرمز "+" إذا كان هناك نص برمجي آخر مفتوح بالفعل.
-* ` fitMedia () ` هي الطريقة الأساسية لإضافة الصوت إلى منصة العمل الصوتية الرقميةDAW. لديها أربع عوامل ، المعلومات التي تحتاجها لصنع الموسيقى:
-** * اسم الملف: * مقطع الصوت الذي يتم وضعه في DAW.
-** * رقم المسار: * المسار الذي يتم وضع الموسيقى عليه.
-** * بداية الموقع: * المقياس الذي سيبدأ عنده مقطع الصوت.
-** * موقع النهاية: * المقياس الذي سينتهي عنده مقطع الصوت.
-* * تصحيح الأخطاء * هي عملية البحث عن* خلل برمجي وإصلاحه * ، الأخطاء التي يرتكبها المبرمج.
-* تحدد قواعد *بناء الجملة * كيفية كتابة التعليمات البرمجية بلغة برمجة معينة.
-* تعرض *وحدة التحكم *معلومات حول حالة البرنامج ، مما يجعلها مفيدة لتصحيح أخطاء بناء الجملة.
-* تتضمن أخطاء المبتدئين الشائعة الأخطاء الإملائية ، والحالة غير الصحيحة ، والأقواس المفقودة ، وإعداد البرنامج النصي غير الصحيح ...؛
-
-[role="curriculum-javascript"]
-* سطر من التعليمات البرمجية هو تعليمات يجب أن يتم تنفيذها بواسطة الحاسوب. كل التعليمات معا تشكل البرنامج.
-* *DAWDAW'*هي برامج حاسوب متخصصة لتسجيل وتحرير وتشغيل ملفات الصوت الرقمية أو <0> مقاطع 0>. EarSketch هو منصة عمل صوتية تسمح بوضع المقاطع الصوتية في جدول زمني مع مقطع برمجي.
-* لإنشاء موسيقى في EarSketch ، يتم كتابة الكود أولاً في لوحة محرر المقطع البرمجي. بعد الضغط على تشغيل ، يتم تشغيل الموسيقى في لوحة DAW.
-* يمكن العثور على مقاطع الصوت في متصفح الصوت. يشار إلى أنهم يكتبون أو يلصقون اسمهم بأحرف كبيرة.
-* الحاسوب * برنامج * وهو سلسلة من التعليمات التي ينفذها الكمبيوتر لإنجاز مهمة محددة.
-* * لغات البرمجة * هي مجموعة من الكلمات والرموز التي يفهمها الحاسوب. تتبع لغة البرمجة بناء الجملة من أجل تنظيم المقطع الرمجي.
-* يتكون برنامج EarSketch النصي من قسم التعليقات وقسم الإعداد وقسم الموسيقى.
-* قم بإنشاء برنامج نصي جديد عن طريق النقر فوق الارتباط الأزرق الكبير أو الرمز "+" إذا كان هناك نص برمجي آخر مفتوح بالفعل.
-* ` fitMedia () ` هي الطريقة الأساسية لإضافة الصوت إلى منصة العمل الصوتية الرقميةDAW. لديها أربع عوامل ، المعلومات التي تحتاجها لصنع الموسيقى:
-** * اسم الملف: * مقطع الصوت الذي يتم وضعه في DAW.
-** * رقم المسار: * المسار الذي يتم وضع الموسيقى عليه.
-** * بداية الموقع: * المقياس الذي سيبدأ عنده مقطع الصوت.
-** * موقع النهاية: * المقياس الذي سينتهي عنده مقطع الصوت.
-* * تصحيح الأخطاء * هي عملية البحث عن* خلل برمجي وإصلاحه * ، الأخطاء التي يرتكبها المبرمج.
-* تحدد قواعد *بناء الجملة * كيفية كتابة التعليمات البرمجية بلغة برمجة معينة.
-* تعرض *وحدة التحكم *معلومات حول حالة البرنامج ، مما يجعلها مفيدة لتصحيح أخطاء بناء الجملة.
-* تتضمن أخطاء المبتدئين الشائعة الأخطاء الإملائية ، والحالة غير الصحيحة ، والأقواس المفقودة ، وإعداد البرنامج النصي غير الصحيح ...؛
-
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
[[chapter-questions]]
-=== الأسئلة
+=== Questions
[question]
--
-أي مما يلي ليس مجال في مساحة عمل EarSketch؟
+Which of the following is NOT a panel in the EarSketch workspace?
+
[answers]
-* متصفح التأثيرات
-* محرر المقطع البرمجي
-* منصة العمل الصوتيةDAW
-* وحدة التحكم
+* The effects browser
+* The code editor
+* The DAW
+* The console
--
[question]
--
-كم عدد العوامل التي تحتاجها لدالة ` fitMedia () `؟
+How many parameters do you need for your `fitMedia()` function?
+
[answers]
* 4
* 6
@@ -358,40 +343,44 @@ TODO: when options are ready, modify the link
[question]
--
-أحد البرامج النصية يتوافق مع ...
+One script corresponds to...
+
[answers]
-* أغنية EarSketch واحدة
-* سطر واحد من التعليمات البرمجية
-* لغة برمجة واحدة
-* مبرمج واحد
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
--
[question]
--
-ما هو المقياس؟
+What is a measure?
+
[answers]
-* وحدة زمنية موسيقية
-* وحدة حجم الصوت
-* خط في منصة العمل الصوتية الرقميةDAW
-* وحدة التسلسل
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
--
[question]
--
-أي مما يلي ليس نوعًا شائعًا من الأخطاء الموجودة في التعليمات البرمجية؟
+Which of the following is NOT a common type of error found in code?
+
[answers]
-* الأخطاء النحوية
-* أخطاء وقت التشغيل
-* أخطاء منطقية
-* أخطاء نحوية
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
--
[question]
--
-في أي مكان في مساحة عمل EarSketch يمكنك الحصول على معلومات حول أخطائك؟
+Where in the EarSketch workspace can you get information about your bugs?
+
[answers]
-* وحدة التحكم
-* متصفح الصوت
-* متصفح البرنامج النصي
-* منصة العمل الصوتيةDAW
---
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/ar/v2/legacy.adoc b/src/locales/ar/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/ar/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/ar/v2/loops-and-layers.adoc b/src/locales/ar/v2/loops-and-layers.adoc
index f8a270728..52974c50d 100644
--- a/src/locales/ar/v2/loops-and-layers.adoc
+++ b/src/locales/ar/v2/loops-and-layers.adoc
@@ -1,16 +1,16 @@
[[loopandlayers]]
-== الحلقات والطبقات!
-:nofooter:
+== Loops and Layers
-في هذا الفصل سوف تتعلم عن حلقة ` for `وكيف يمكنك إنشاء تكرار في الكود بالموسيقى الخاصة بك. وسوف نتعلم أيضا عن الطبقات الموسيقية والقوام نعرض بعض النصائح عن تصحيح الأخطاء.
+:nofooter:
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. We will also cover musical layers and textures as well as some debugging tips.
[[forloops]]
-=== حلقات`for`
+=== `for` loops
-تماما كما يقوم الموسيقيين بتشغيل مقطع موسيقي مرارا وتكرارا في *حلقة*، يمكن للمبرمجين أن يطلب من الكمبيوتر اكمال وتنفيذ المهام مرارا وتكرارا... في *حلقة*! هذا أكثر نجاعة: بدلاً من كتابة التعليمات عدة مرات، تكتب حلقة واحدة (loop) مع التعليمات، والكمبيوتر يقوم بتكرارها.
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
-على سبيل المثال، إذا كنت ترغب في تكرار ()makeBeat التي قمت بإنشائها، بدلاً من كتابة عدة أسطر من الدالة ()makeBeat، يمكنك إنشاء حلقة for. إليك كيف:
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
////
add new video
@@ -18,113 +18,117 @@ more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPu
in the "revamping videos" tab (includes link to script)
////
-فيما يلي الكود النهائي من الفيديو:
-
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-looping-my-beats.py.txt[]
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-looping-my-beats.js.txt[]
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
----
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
-من أجل تتبع مراحل تنفيذ الكود الذي كتبته، يمكنك استخدام الامر `print` . اذا يمكنك عن طريقه عرض المعلومات بالكونسول (console)، اثناء تنفيذ الكود.
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+[[loop-components-PY]]
+.The basic components of a for loop
[role="curriculum-python"]
-`print` تقوم *بحساب* تعبير:فهي تقوم بتبسيطه لشكله الاساسي، حسب نوع معلوماته، وتعرضه بالكونسول. انتبهوا انه بلغة بايثون `print` تختلف عن باقي الدوال لانكم لستم ملزمون بوضع الاقواس دائما بعد اسم الدالة.
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+[[loop-components-JS]]
+.The basic components of a for loop
[role="curriculum-javascript"]
-الدالة `println` تقوم *بحساب* تعبير: فهي تقوم بتبسيطه لشكله الاساسي، حسب نوع معلوماته، وتعرضه بالكونسول.
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
[role="curriculum-python"]
-.تدريب
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
+.PRACTICE
****
-قبل تشغيل الكود التالي، حاول تخمين ما سيعرض الكونسول لكل امر`print` .
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
****
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
[role="curriculum-javascript"]
-.تدريب
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
****
-قبل تشغيل الكود التالي، حاول تخمين ما سيعرض الكونسول لكل امر`println` .
+Before running the following code, try to guess what the console will display for each `print()` call.
****
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-printing.py.txt[]
+include::code-examples/loops-and-layers-printing.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-printing.js.txt[]
+include::code-examples/loops-and-layers-printing.js.txt[]
----
-وهنا سوف ترى بالكونسول الاسطر التالية:
+Here, you will see in your console the following lines:
+
----
4 (this is 1+3, simplified)
1 (initially your counter measure is equal to 1)
-"ok"
+ok
2 (now your counter measure is equal to 2)
-"ok" (every time we go through one loop, we print "ok", that's why it's repeated)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
3
-"ok"
+ok
4
-"ok"
+ok
----
-وينتهي هناك لأن العداد يجب أن يكون أقل من 5، لذلك 4 هو الحد الاخير.
-.تدريب
-****
-. قم بإنشاء حلقة `for` مع العداد "measure" للحصول على `()makeBeat` من measure 1 إلى 4، مثل في الفيديو
-. قم بتعديل الكود للانتقال من measures 3 إلى 7
-. ثم قم بتعديل الكود لجعل البيت على المسار 2 بدلاً من المسار 1،انتبه انك لا تزال من measures 3 إلى 7
-. ثم قم بتعديل اسم العداد الخاص بك، اختيار مسار و measures، وأنشئ حلقة ` for` مناسبة.
-. أظهر لصديقك حلقة `for` الاخيره، واطب منه ان يجد في اي مسارات الايقاع (beat)، واي عدادات تعمل،وما هي اسماء العدادات.
-****
-
-يمكن أن يكون لديك أكثر من سطر واحد من التعليمات داخل حلقة `for`.
-
-[role="curriculum-python"]
-حلقة for في لغة بايثون (Python) مركبة من 3 اجزاء اساسية:
-
-[role="curriculum-javascript"]
-حلقة for في لغة جاڤاسكربت (JavaScript) مركبة من 4 اجزاء اساسية:
-
-[[loop-components-PY]]
-.المكونات الأساسية لحلقة for
-[role="curriculum-python"]
-[caption="Figure 12.2: "]
-image::../media/U1P2/Loop_Components_PY.png[Alt Text]
-
-[[loop-components-JS]]
-.المكونات الأساسية لحلقة for
-[role="curriculum-javascript"]
-[caption="Figure 12.2: "]
-image::../media/U1P2/Loop_Components_JS.png[Alt Text]
-
-[role="curriculum-python"]
-* *جسم الحلقة*: جسم الحلقة يحتوي على تعليمات سيتم تكرارها. وهذه التعليمات تكتب مع * ازاحة * الى الامام باستعمال الزر _ tab _ وبعد النقطتين ` :`
-* *عداد الحلقة*: ننشئ متغير لاستخدامه عدادا للحلقة.
-* *المجال او Range*: دالة التي تنتج قائمة من الاعداد بمجال معين التي يستخدمها عداد الحلقة. الكلمة `in` تفحص اذا كانت قيمة عداد الحلقة في المجال المحدد. الدالة ` ()rang ` تاخذ بارامترين، الاول يمثل بداية المجال والثاني يمثل نهاية المجال ولكن نهاية المجال لا تحوي العدد نفسه: `range(startingNumber, endingNumber)`
-
-[role="curriculum-javascript"]
-* *جسم الحلقة*: جسم الحلقة يحتوي على تعليمات سيتم تكرارها. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key).
-* *اعطاء قيمة اولية*: هذا ينشئ متغير ليستخدم كـ *عداد الحلقة* قبل تشغيل الحلقة الأولى.
-* *امر التغيير*: امر يقوم بتغيير عداد الحلقة. وهو يعد كل تكرار.
-* *شرط الحلقة*: هذا يفحص ما إذا كان يجب تشغيل الحلقة مرة أخرى. إذا كان الشرط صحيحاً، تقوم الحلقة بتنفيذ الكود المكتوب بجسمها مرة أخرى. وإذا وصلت قيمة العداد الى نهاية المجال المحدد، سيحصل الشرط على القية خطأ، ونخرج من الحلقة. ثم يواصل الكمبيوتر تنفيذ الكود الذي بعد الحلقة.
-
-يمكن أن يكون لديك أكثر من سطر واحد من الكود داخل حلقة `for`.
+and it ends there since measure has to be lower than 5, so 4 is your limit.
[[controlflow]]
-=== التحكم بمراحل التنفيذ
+=== Control Flow
-فيما يلي مثال آخر على كيفية استخدام `for`:
+Here is another example of how you can use `for` loops:
[role="curriculum-python curriculum-mp4"]
[[video12bpy]]
@@ -134,36 +138,35 @@ video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
[[video12bjs]]
video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
-يمكنك إنشاء تكرار في الموسيقى عن طريق كتابة
-()fitMedia
مرارا، مع أرعداد مختلفة للعداد measure:
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-no-loops.py.txt[]
+include::code-examples/loops-and-layers-no-loops.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-no-loops.js.txt[]
+include::code-examples/loops-and-layers-no-loops.js.txt[]
----
-يمكننا استخدام حلقة `for` لإنشاء نفس الموسيقى بدقة أكثر . العداد هنا هو "measure". لاحظ أن جسم الحلقة يحتوي على سطرين من التعليمات البرمجية، وكلاهما يستخدم "measure" العداد.
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-loops.py.txt[]
+include::code-examples/loops-and-layers-loops.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-loops.js.txt[]
+include::code-examples/loops-and-layers-loops.js.txt[]
----
-يقوم *المترجم * بقراءة وتنفيذ البرنامج (السكريبت). الترتيب الذي يتم التنفيذ به يسمى * تدفق التحكم *. عادة ما يتم الانتقال سطرا سطرا ، من أعلى إلى أسفل. هذا هو السبب في أننا نحتاج إلى تحديد المتغيرات قبل استدعائها في المقطع البرمجي.
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
A loop is a *control flow statement*, which changes the order. At the end of a loop body, it jumps back to the top of the loop.
@@ -172,12 +175,12 @@ This animation shows how the control flow moves in a `for` loop, and how the val
[[loop-py]]
.Stepping through a for loop
[role="curriculum-python"]
-[caption="Figure 12.4: "]
+[caption="Figure 4.2.1: "]
image::../media/U1P2/LoopPy_updated.gif[Alt Text]
.Stepping through a for loop
[role="curriculum-javascript"]
-[caption="Figure 12.4: "]
+[caption="Figure 4.2.1: "]
[[loop-js]]
image::../media/U1P2/LoopJS_updated.gif[Alt Text]
@@ -190,56 +193,69 @@ BMW
One last interesting thing about `for` loops is incrementation.
[role="curriculum-python"]
-Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen 2 parameters for range: `startingNumber` and `endingNumber` (which is exclusive). There is an optional third parameter: `increment`. By default, `increment` is equal to 1, but you can use it to increment by more than one.
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
[role="curriculum-javascript"]
-Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by 1 for every loop. It's possible to increment it by more than one, like `measure = measure + 4`.
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
-.تدريب
-*****
-قبل تشغيل المقطع البرمجي التالي ، حاول تخمين ما سيفعله.
-*****
+{nbsp} +
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-incrementing.py.txt[]
+include::code-examples/loops-and-layers-incrementing.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-incrementing.js.txt[]
+include::code-examples/loops-and-layers-incrementing.js.txt[]
----
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. This means measure is now equal to its former value plus one. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
[role="curriculum-python"]
-استخدمنا هنا الدالة ` range () ` ، ولكن يمكنك أيضًا زيادة (زيادة) أو إنقاص (تقليل) متغير باستخدام هذا النوع من التعبير: ` مقياس = قياس + 1 `. هذا يعني أن المقياس يساوي الآن قيمته السابقة زائد واحد. يمكنك استخدام الاختصار ` + = ` (أو ` - = ` للتقليل). وإليك الطريقة: ` مقياس + = 1 ` يعادل ` قياس = قياس + 1 `. و ` قياس - = 1 ` يكافئ ` قياس = قياس - 1 `
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
[role="curriculum-javascript"]
-كتبنا هنا ` مقياس = قياس + 4 ` ، مما يعني أن المقياس الآن يساوي قيمته السابقة زائد أربعة. يمكنك استخدام بعض الاختصارات:
- ` + = ` (أو ` - = ` للتناقص). فيما يلي طريقة مختصرة لزيادة (أو إنقاص) العداد:
-
-* ` قياس ++ ` ، أو ` قياس + = 1 ` زيادات قياس بمقدار 1. إذا كنت تريد الزيادة بأكثر من واحد ، فاستخدم ` مقياس + = 2 `.
-* ` قياس - ` ، أو ` قياس - = 1 ` تناقص القياس بمقدار 1. إذا كنت تريد الإنقاص بأكثر من واحد ، فاستخدم ` مقياس - = 2 `.
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). The following is a shorthand method for incrementing (or decrementing) a counter:
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
[[debuggingtips]]
-=== نصائح التصحيح
+=== Debugging Tips
-البرمجة ليست مجرد كتابة مقطع برمجي. إنه'&أيضًا يعمل على تصحيح أخطائه وصيانته. التصحيح يعني حل الأخطاء. جرب اتباع هذه الخطوات إذا واجهك خطأ:
+Programming is not only writing code. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
[role="curriculum-python"]
-. * اقرأ وحدة التحكم للحصول على أدلة *.
-. * حدد موقع الخطأ في التعليمات البرمجية: * لديك 3 خيارات. 1. إذا قدمت وحدة التحكم رقم سطر ، فقم بإلقاء نظرة على هذا السطر والسطر السابق في التعليمات البرمجية الخاصة بك. 2. استخدم طريقة "التعليق خارج". يمكنك تضييق نطاق الخطأ عن طريق وضع صيغة لبناء الجملة حول كتلة من التعليمات البرمجية ، أو * التعليق عليها * ، وتشغيل الكود. إذا لم يكن هناك خطأ ، فسيكون الخطأ في مكان ما في الكتلة المعلقة. 3. يمكن أيضًا استخدام * تصحيح أخطاء الطباعة * لتحديد موقع الخطأ. اقرأ قسم المشكلة في التعليمات البرمجية الخاصة بك وحاول اتباع المنطق. أدخل عبارات ` print ` حيث لا تكون متأكدًا من المنطق ، والحصول على قيمة المتغيرات والتحقق من حالة البرنامج. يساعدك هذا في التحقق من فهمك للبرنامج مقابل ما يحدث بالفعل.
-. * قم بتحطيم الخطأ * تحقق من وجود أخطاء وقم بتحرير المقطع المخالف، ثم قم بتشغيله للتحقق من صحته.
-. *Ask for help*: If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
[role="curriculum-javascript"]
. *Read the console for clues*.
-. *Locate the error in your code:* You have 3 options here. 1. If the console provided a line number, take a look at that line and the previous line in your code. 2. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *Commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block. 3. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
-. *Ask for help*: If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
Below, we walk through an example of printing variables to help debug a script:
@@ -251,25 +267,23 @@ video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
[[video15js]]
video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
-You've seen a list of potential errors in chapter 1. Here are some other errors that you might encounter:
+You've seen a list of potential errors in Chapter 1. Here are some other errors that you might encounter:
[role="curriculum-python"]
-. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign values to your variables at the top of your script.
-. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
-. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
-. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
[role="curriculum-javascript"]
-. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign values to your variables at the top of your script. Don't forget to initialize variables with `var`!
-. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
-. *Semicolons:* Including semicolons after every statement is highly recommended in JavaScript.
-. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
-. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
-
-
-Take a look at <> for a full description of different error types and what you can do to prevent them.
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+Take a look at <> for a full description of different error types and what you can do to prevent them.
[[musicaltips]]
=== Musical tips
@@ -278,11 +292,11 @@ Now that you have many tools to create your music, like `fitMedia()`, `makeBeat(
Let's start with the *key* of your song:
-* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
-* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
-* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
-Listen to the audio clip below to hear the difference between major and minor keys:
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
++++
audioMedia/MajorMinor.mp3
@@ -290,57 +304,56 @@ Listen to the audio clip below to hear the difference between major and minor ke
Now let's talk about the different types of tracks you can have. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
-* Melody is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar...
-* Harmony is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
-* You also have a bass line. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard...
-* Then there is percussion. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
-These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain 1 or 2 of the 4. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes... explore ideas and keep the ones you like most!
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
-Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the mere exposure effect. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
-Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used. A good example of contrast comes around 0'21 (second 21) and 1'01 (minute 1, second 1) of the song https://www.youtube.com/watch?v=AjjlABP5t1Q[Dream State] by Son Lux.
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
-.تدريب
+.PRACTICE
****
-قم بإنشاء أغنية كاملة باستخدام:
+Create a complete song with:
* A theme (please mention your chosen theme in your commented intro in the code)
* The `fitMedia()` and `makeBeat()` functions
* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
-* At least 4 tracks
-* At least 16 measures
+* At least four tracks
+* At least sixteen measures
* At least one uploaded sound
* Comments and variables to organize your code
Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
****
-
+{nbsp} +
[[chapter4summary]]
=== Chapter 4 Summary
[role="curriculum-python"]
-* A *`for` loop* instructs the computer to execute a code section repeatedly, creating more efficient code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
* The *control flow* represents the order in which statements are executed by the computer.
-* The `print` statement evaluates its accompanying expression and displays the result in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
-* Revisit the expanded list of common programming errors: <>.
+* Revisit the expanded list of common programming errors: <>.
* The *pitch* of a sound determines how high or low it sounds on a relative scale.
* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
[role="curriculum-javascript"]
-* A *`for` loop* instructs the computer to execute a code section repeatedly, creating more efficient code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
* The *control flow* represents the order in which statements are executed by the computer.
-* The `println()` function evaluates its argument and displays the result in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
-* Revisit the expanded list of common programming errors: <>.
+* Revisit the expanded list of common programming errors: <>.
* The *pitch* of a sound determines how high or low it sounds on a relative scale.
* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
-* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
-
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
[[chapter-questions]]
=== Questions
@@ -348,6 +361,7 @@ Remember that you can try things out and keep only the sounds/ideas that you lik
[question]
--
Which of the following is NOT a component of a `for` loop?
+
[answers]
* Loop interpreter
* Loop Counter
@@ -358,6 +372,7 @@ Which of the following is NOT a component of a `for` loop?
[question]
--
Which of the following is NOT a good use of loops in a musical composition?
+
[answers]
* Creating a beat pattern than never repeats
* Placing musical clips on every third measure
@@ -368,6 +383,7 @@ Which of the following is NOT a good use of loops in a musical composition?
[question]
--
Which of the following is NOT a recommended technique for debugging?
+
[answers]
* Copying and pasting code into Google
* Printing variable values to the console
@@ -378,6 +394,7 @@ Which of the following is NOT a recommended technique for debugging?
[question]
--
Which of the following is NOT something that can be printed to the console?
+
[answers]
* Code Comments
* Strings
@@ -388,10 +405,10 @@ Which of the following is NOT something that can be printed to the console?
[question]
--
____ is a quality of sound that determines how high or low it sounds.
+
[answers]
* Pitch
* Tempo
* Rhythm
* Loudness
---
-
+--
\ No newline at end of file
diff --git a/src/locales/ar/v2/mixing-with-conditionals.adoc b/src/locales/ar/v2/mixing-with-conditionals.adoc
index 6fc481093..d41a2af7c 100644
--- a/src/locales/ar/v2/mixing-with-conditionals.adoc
+++ b/src/locales/ar/v2/mixing-with-conditionals.adoc
@@ -1,41 +1,41 @@
[[mixingwithconditionnals]]
-== المزج عن طريق استعمال الشروط!
-:nofooter:
+== Mix with Conditionals!
-في البرمجة، يمكن جعل الاشياء اوتوماتيكية مثال على التشغيل الآلي هو إذا كنت تقوم ببرمجة روبوت بحيث يتوقف عند اكتشاف العقبة: لن يحتاج الروبوت إلى إنسان ليخبره أن يتوقف يدوياً. بدلاً من ذلك، سيكون للروبوت جهاز استشعار للكشف عن العقبات، وإذا كان هناك جهاز كهذا، فإنه سيتوقف. يمكننا القيام بعمليات أتمتة موسيقية في EarSketch، باستخدام مشروطيات ("if"). سنرى كيف نصل إلى التشغيل الآلي لمزج المسارات. المزج يعني إذا كان المسار عالياً جداً، سوف نخفض صوته وإذا كان هادئاً جداً، سوف نزيد من صوته.
+:nofooter:
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
[[analyzetrack]]
=== Use `analyzeTrack()`
-We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Copy and run the following code:
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Import and run the following code:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
----
+You can read in your console that the printed loudness is 0.10306035109110138.
-You can read in your console that the printed loudness is 0.0967737948641.
-
-* The loudness can go from 0 (silence) to 1 (maximum loudness).
-* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means write 5 zeros before the number 17....This is equal to 0,0000174630733714.
-* Most of the sounds will have a loudness under 0.4
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
The `analyzeTrack()` function takes 2 arguments:
-* the track number,
-* the parameter we want to analyze. For loudness it's: `RMS_AMPLITUDE`.
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
.PRACTICE
****
-. You can try this code with different sounds (change the variable "sound") to see what the output is.
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
. Add a second track and use the `analyzeTrack()` function to print its loudness in the console. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
****
@@ -44,7 +44,7 @@ The parameter for `analyzeTrack()` can either be `RMS_AMPLITUDE`, to evaluate th
[[booleansandcomparisons]]
=== Booleans and comparisons
-We will now see how *Boolean logic* works, this will help us automate some tasks.
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
[role="curriculum-python"]
*Booleans* are a data type. The boolean data type only has 2 possible values, `True` and `False`. `True` and `False` start with a capital letter and do not have quotes.
@@ -54,81 +54,92 @@ We will now see how *Boolean logic* works, this will help us automate some tasks
[role="curriculum-python"]
--
-To create a boolean, you can either initialise a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+To create a boolean, you can either initialize a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
[cols="^h,1"]
|===
|==
-| مطابق لـ
+|is equal to
+
|!=
-| ليس مطابقًا لـ
+|is not equal to
+
|>
-| أكبر من
+|is greater than
+
|>=
-| أكبر من أو يساوي
+|is greater than or equal
+
|<
-| اصغر من
+|is less than
+
|\<=
-| أصغر من أو يساوي
+|is less than or equal
|===
-لاحظ الفرق بين:
+Note the difference between:
-1. مقارنة قيمتين لمعرفة ما إذا كانتا متطابقتين: `==`
-2. تخصيص قيمة لمتغير: `=`
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
--
[role="curriculum-javascript"]
--
-لإنشاء قيمة منطقية ، يمكنك إما تهيئة متغير (` var variable1 = true ؛ `) ، أو يمكنك استخدام مقارنة. لإجراء مقارنة ،نستخدم * عامل المقارنة *. فيما يلي عوامل المقارنة:
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
[cols="^h,1"]
|===
-| ===
-| مطابق لـ
+|===
+|is equal to
+
|!==
-| غير مطابقًا لـ
+|is not equal to
+
|>
-| أكبر من
+|is greater than
+
|>=
-| أكبر من أو يساوي
+|is greater than or equal
+
|<
-| اصغر من
+|is less than
+
|\<=
-| أصغر من أو يساوي
+|is less than or equal
|===
-لاحظ الفرق بين:
+Note the difference between:
-1. مقارنة قيمتين لمعرفة ما إذا كانتا متطابقتين: `===`
-2. تخصيص قيمة لمتغير: `=`
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
--
[role="curriculum-python curriculum-mp4"]
[[video17apy]]
-video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
[role="curriculum-javascript curriculum-mp4"]
[[video17ajs]]
-video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
// this video will be cut at 2' to delete the section about boolean operators//
-
[role="curriculum-python"]
-.تدريب
+.PRACTICE
****
-* قم بإنشاء برنامج نصي جديد وإضافة الأصوات على مسارين
-* اطبع ` صحيح ` إذا كان الصوت الأول أعلى من المسار الثاني ، و ` خطأ ` بخلاف ذلك.
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
-* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
****
[role="curriculum-javascript"]
.PRACTICE
****
-* Create a new script and add sounds on 2 tracks
+* Create a new script, and add sounds on two tracks.
* Print `true` if the first track is louder than the second track, and `false` otherwise.
* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
-* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
****
Here is an example:
@@ -136,149 +147,150 @@ Here is an example:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
----
[role="curriculum-python"]
-Note: in this example, we used some print statements with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
[role="curriculum-javascript"]
-Note: in this example, we used some print statements with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
[[conditionalstatements]]
=== Conditional Statements
-What is a conditional statement? A *statements* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
+What is a conditional statement? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
Below is an example of conditional statement, note the similarity with a for loop:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled1.py.txt[]
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled1.js.txt[]
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
----
.PRACTICE
****
-* Create a new script with 2 tracks.
-* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an if statement.
-* You will need a negative gain (between -1 and -60dB) to reduce the volume.
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
****
Here is an example:
+
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
----
-We might want to check several conditions and execute a different set of statements depending on each condition. You can add as many conditions as you like. We use the following syntax:
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled2.py.txt[]
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled2.js.txt[]
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
----
[[mixingyourtracks]]
=== Mix your tracks
-Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
+Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
[role="curriculum-python"]
.PRACTICE
****
* Create a new script.
-* Add sounds on at least 3 tracks for at least 16 measures.
-* You can use the `makeBeat()` function and a for loop to add percussions.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
-* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into accound, as `analyzeTrack()` is not relevant for percussions. `analyzeTrack()` returns indeed a mean whereas percussions are bursts of sound so a mean doesn't raelly evaluate the loudness.
-* Use print statements to show your process in the console. Here is an example of print statement: `print('Is track number' + str(track) + 'greater than 0.01?')`, if the counter `track` is equal to `1`, this will print 'Is track number 1 greater than 0.01?'. The function `str()` converts a number (ex: 1) into a string (ex: '1').
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
****
[role="curriculum-javascript"]
.PRACTICE
****
* Create a new script.
-* Add sounds on at least 3 tracks for at least 16 measures.
-* You can use the `makeBeat()` function and a for loop to add percussions.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
-* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into accound, as `analyzeTrack()` is not relevant for percussions.
-* Use print statements to show your process in the console. Here is an example of print statement: `println('Is track number' + track + 'greater than 0.01?')`, if the counter `track` is equal to `1`, this will print 'Is track number 1 greater than 0.01?'.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
****
-
Let's review some vocabulary:
-1. *Operator*: a character that represents an action. We have seen arithmetic operators (`+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `==`, `!=`).
-2. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1+2` (evaluated to 3) or `1<2` (evaluated to True) or `analyzeTrack(1,RMS_AMPLITUDE)` (evaluated to the loudness of track 1, a float between 0 and 1).
-3. *Statements*: instructions for the computer to execute.
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
----
+{nbsp} +
[[chapter6summary]]
=== Chapter 6 Summary
[role="curriculum-python"]
-* The `analyzeTrack()` function takes two arguments: the track number and a parameter. When the parameter is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the parameter is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
* The *boolean* data type has only two possible values, `True` and `False`.
* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
* An *operator* is a character that represents an action.
* *Expressions* are evaluated by the computer to produce a value.
* A *statement* is an instruction for the computer.
-* A *condition* is an expression that evaluates to `True` or `False`.
-* The _if_ statement only executes its code block when its condition is `True`.
-* In the event that an _if_ statement's condition is `False`, an optional _else_ statement allows an alternative code block to be executed.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
[role="curriculum-javascript"]
-* The `analyzeTrack()` function takes two arguments: the track number and a parameter. When the parameter is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the parameter is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
* The *boolean* data type has only two possible values, `true` and `false`.
-* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
-* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
* An *operator* is a character that represents an action.
* *Expressions* are evaluated by the computer to produce a value.
* A *statement* is an instruction for the computer.
* A *condition* is an expression that evaluates to `true` or `false`.
-* The _if_ statement only executes its code block when its condition is `true`.
-* In the event that an _if_ statement's condition is `false`, an optional _else_ statement allows an alternative code block to be executed.
-
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
[[chapter-questions]]
=== Questions
@@ -286,8 +298,9 @@ include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.j
[question]
--
Which of the following elements is a boolean?
+
[answers]
-* `5+4 == 5`
+* `5+4 === 5`
* `measure = 1`
* `2<3<4`
* `False()`
@@ -297,10 +310,12 @@ Which of the following elements is a boolean?
[question]
--
What would the output of this block of code be (what would print to the console)?
+
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.py.txt[]
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
----
+
[answers]
* 10
* 5
@@ -312,10 +327,12 @@ include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.py.txt[]
[question]
--
What would the output of this block of code be (what would print to the console)?
+
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.js.txt[]
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
----
+
[answers]
* 10
* 5
@@ -326,6 +343,7 @@ include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.js.txt[]
[question]
--
What is mixing?
+
[answers]
* adapting the volume of each track so they sound well balanced
* adapting the pitch of each track so they sound well balanced
@@ -336,9 +354,10 @@ What is mixing?
[question]
--
How many conditions can you check in a conditional statement?
+
[answers]
* any number of conditions
* 1 condition
* 2 conditions
* 3 conditions
---
+--
\ No newline at end of file
diff --git a/src/locales/ar/v2/optional.adoc b/src/locales/ar/v2/optional.adoc
new file mode 100644
index 000000000..a68357880
--- /dev/null
+++ b/src/locales/ar/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+ستتعرف في هذه الوحدة على حلقات for ، والتي تسمح لك بتكرار تعليمات المقطع البرمجي بشكل فعال. سنستعرض أيضًا المؤثرات الصوتية والظروف - تطور التأثيرات مع مرور الوقت. أخيرًا ، ستتعرف على مزج المسارات الخاصة بك واستخدام الشروط.
\ No newline at end of file
diff --git a/src/locales/ar/v2/unit-3.adoc b/src/locales/ar/v2/unit-3.adoc
index 61297b599..3546271c9 100644
--- a/src/locales/ar/v2/unit-3.adoc
+++ b/src/locales/ar/v2/unit-3.adoc
@@ -5,4 +5,4 @@
الآن بعد أن أصبح لديك العديد من الأدوات لإنشاء أغنيتك وإضافة المؤثرات ومزج المقطوعات الموسيقية الخاصة بك ، سننظر الى بنية الأغنية. سنستخدم دوال مخصصة لذلك: هذه هي الدوال التي ستنشئها بنفسك!
-سننظر أيضًا في ادخال المستخدم وكيف يمكن تضمينها في التعليمات البرمجية الخاصة بك لإنشاء أغانٍ خاصة. أخيرًا ، سنرى كيف يمكنك استخدام هياكل البيانات لتبسيط التعليمات البرمجية الخاصة بك.
\ No newline at end of file
+سننظر أيضًا في ادخال المستخدم وكيف يمكن تضمينها في التعليمات البرمجية الخاصة بك لإنشاء أغانٍ مع طابع شخصي خاص بك. أخيرًا ، سنرى كيف يمكنك استخدام هياكل البيانات لتبسيط التعليمات البرمجية الخاصة بك.
\ No newline at end of file
diff --git a/src/locales/ar/v2/welcome.adoc b/src/locales/ar/v2/welcome.adoc
index 93938f4bf..e083793b7 100644
--- a/src/locales/ar/v2/welcome.adoc
+++ b/src/locales/ar/v2/welcome.adoc
@@ -1,19 +1,26 @@
[[welcome]]
-== مرحبا بكم
+== اهلا وسهلا بالطلاب والمعلمين!
+
:nofooter:
-مرحبا بكم في EarSketch!
+Welcome to EarSketch!
+
+* المعلمون *: شاهد https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf دليل المناهج الجديدة ^] ، وقم بزيارة https://www.teachers.earsketch.org [موقع EarSketch للمعلمين ^] للحصول على معلومات إضافية مصادر.
-هنا سوف تتعلم علوم الكمبيوتر وتكنولوجيا الموسيقى جنبا إلى جنب. سوف تستخدم إما Python أو JavaScript لإنشاء الموسيقى الخاصة بك.
+* الطلاب *: تابع أدناه لمعرفة المزيد حول EarSketch
-يكتب الموسيقيون والمبرمجون أكواد الكمبيوتر لإنشاء أصوات وتأثيرات وأغاني جديدة.
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
[role="curriculum-mp4"]
[[video0]]
video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
-تعلم كتابة كود الكمبيوتر "البرمجة" هو مهارة ستكون مفيدة لك في مسارات مهنية متنوعة.
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+ربما ستصبح منتجًا موسيقيًا أسطوريًا أو مهندس التسجيل الأكثر رواجًا في الصناعة! We wish you good luck on your EarSketch journey.
-ربما 'll ستصبح منتجا موسيقيا اسطوريا او مهندس التسجيل الاكثر مشهورا في الصناعة'! نتمنى لك حظًا سعيدًا في رحلة ب EarSketch.
+Click on the right arrow at the top of this text to get started.
-انقر فوق السهم الأيمن أعلى هذا النص للبدء.
\ No newline at end of file
+يمكن للمعلمين الوصول إلى مواد المعلم المجانية و المجتمع https://www.teachers.earsketch.org/[هنا ^]!
\ No newline at end of file
diff --git a/src/locales/ar/v2/your-first-song.adoc b/src/locales/ar/v2/your-first-song.adoc
index 1e01fe44d..4e9f6aa2f 100644
--- a/src/locales/ar/v2/your-first-song.adoc
+++ b/src/locales/ar/v2/your-first-song.adoc
@@ -1,174 +1,167 @@
[[customizeyourfirstsong]]
-== تخصيص أغنيتك الأولى
+== Customize your first song
+
:nofooter:
-في هذا الفصل ستتعلم كيفية تغيير إيقاع أغنيتك وإضافة التعليقات إلى الكود الخاص بك وتحميل الأصوات الخاصة بك لتحسين رسالة أغنيتك.
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
[[settempo]]
-=== الدالة
- ()setTempo
+=== The `setTempo()` function
[role="curriculum-python"]
--
-لقد لاحظت الآن أنه عند إنشاء سكريبت، هناك عناصر موجودة مسبقًا يجب عليك الاحتفاظ بها تمامًا حتى يعمل الكود الخاصة بك:
-
-. هناك ملاحظات التي تبدأ بـ `#` باللون الرمادي: سوف نغطي شرح ذلك في القسم التالي.
-. السطر
-from Earsketch import*
-الذي يضيف دوال Earsketch مثل
- ()fitMedia
-للمشروع
-. الدالة `setTempo(120)` التي سنشرحها بالتفصيل أدناه
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
--
[role="curriculum-javascript"]
--
-لقد لاحظت الآن أنه عند إنشاء سكريبت، هناك عناصر موجودة مسبقًا يجب عليك الاحتفاظ بها تمامًا حتى يعمل الكود الخاصة بك:
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
-. هناك ملاحظات التي تبدأ بـ`//` باللون الرمادي: سوف نغطي شرح ذلك في القسم التالي.
-. الدالة `setTempo(120)` التي سنشرحها بالتفصيل أدناه.
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
--
-ستحدد دالة ()setTempo سرعة أغنيتك. tempo (إيقاع بالعربية) في الموسيقى الغربية. هو عدد النبضات (beats) في الدقيقة (bpm). في EarSketch ، يتم تعيين الإيقاع الافتراضي (أي القيمة الأولية لtempo) إلى 120 جزء من المليون، وهو ما يقابل للمشي السريع في حياتنا. لتغيير الايقاع tempo، فقط قم بتغيير الرقم بين قوسين لوظيفة `setTempo()`. كلما ارتفع الايقاع tempo كلما زادت سرعة موسيقاك. يمكنك تحديد الإيقاع بين 45 bpm و 220 bpm.
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. To change the tempo, just change the number between the parentheses of the `setTempo()` function. The higher the tempo, the faster your music. You can select a tempo between _45bpm and 220bpm_.
-.تدريب
+.PRACTICE
****
-. إنشاء سكريبت جديد.
-. ضع الأصوات على مسارين مختلفين،
-. قم بتعديل الإيقاع الخاص بك والاستماع إلى الأغنية،
-. شغل أغنيتك في 3 ايقاعات مختلفة لصديق. ثم اطلب منهم ترتيب الايقاعات من الأبطأ إلى الأسرع.
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
****
-القالب الموسيقي هو فئة من الانتاجات الفنية مثل (الموسيقى) والتي تتشابه بصفاتها وشكلها او محتواها. قوالب مختلفة لها ايقاعات مختلفة على سبيل المثال:
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
[cols="^3*"]
|===
-|القالب الفني|BPM|مثال
+|GENRE |BPM |EXAMPLE
-|Hip Hop
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
-|85-95
+"I Wanna Dance With Somebody" - Whitney Houston
-|Coolio - Gangsta Paradise (feat. L.V.)
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
-|البوب Pop
-|110-130
+"Fight the Power" - Public Enemy
-|Lizzo - Juice
-
-|تكنو Techno
-|120-125
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
-|Boris Brejcha - Schleierwolken
-|إلكترو Electro
-|100-130
+"Jolene" - Dolly Parton
-|Apashe - Behind My Eyes (feat. LIA)
-
-|هاوس House
-|115-130
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
-|DJ Breezy - Kimpinstik (feat. Dahlin Gage & Medikal)
-|دب ستيب & تراب Dubstep and Trap
+"Good Vibrations" - Marky Mark
+|Dubstep / Trap
|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
-|Jessica Audiffred & Walshy Fire - Stupid Love (feat. Nia V)
-|درام & باس Drum & Bass
-|160-180
-
-|Mollie Collins - Lost & Found
+"Turn Down for What" - Lil Jon
|===
-.تدريب
+.PRACTICE
****
-. اختر فنانًا واحداً تحبه حقًا و اكتشف نوع القالب الفني الذي ينتمي إليه.
-. ابحث عن هذا النوع من القالب الفني (على ساوندكلود أو ما شابه ذلك) واستمع إلى بضعة من الأغاني هذا النوع.
-. اصغي لأوجه التشابه بين الأغاني.
-. بإمكانك أيضاً أن تبحث عن نوع القالب في ويكيبيديا للحصول على مزيد من المعلومات عنه.
+. Select one artist you really like and find out what genre they belong to.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
****
-
-لاحظ أن مقطع صوت واحد سيبدو في بعض الأحيان مختلفا جدا عند معاينته وعند تشغيله في أغنيتك. قد يكون ذلك لأن سرعة ايقاع مقطع الصوت مختلفة عن سرعة ايقاع أغنيتك temp. لمعرفة الإيقاع الدقيق للمقطع، مرر الماوس (الفأره) فوق اسم المقطع في متصفح (Browser) الصوت. وعندها يمكنك تعديل إيقاع أغنيتك وفقًا لذلك أو اختيار مقطع صوت يتناسب بشكل أفضل مع إيقاع أغنيتك.
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
[[comments]]
-=== أضف الملاحظات إلى تعليماتك البرمجية (الكود)
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
[role="curriculum-python"]
-*الملاحظات في Python* هي أسطر من التعليمات البرمجية التي لا يتم تنفيذها بواسطة الكمبيوتر. وهي تستخدم فقط من قبل الانسان لجعل التعليمات البرمجية (الكود) أسهل فهمها، أو للمساعدة في تنظيم التعليمات البرمجية أو لعمل ملاحظات للاستخدام في المستقبل. في Python، يشار إلى الملاحظات بواسطة سطر يبدأ بالرمز `#`
+In Python, comments are indicated by a line starting with a pound `#` symbol.
[role="curriculum-javascript"]
-*الملاحظات في JavaScript* هي أسطر من التعليمات البرمجية التي لا يتم تنفيذها بواسطة الكمبيوتر. وهي تستخدم فقط من قبل الانسان لجعل التعليمات البرمجية (الكود) أسهل فهمها، أو للمساعدة في تنظيم التعليمات البرمجية أو لعمل ملاحظات للاستخدام في المستقبل. في JavaScript، يشار إلى التعليقات بواسطة سطر يبدأ بخطين أمامين، `//`.
-
-لاحظ أن السطر الأول من كل سكريبت هو ملاحظات التي تصف النص البرمجي (الكود). لكل سريبت جديد، سوف تحتاج إلى ملء هذه المعلومات. هذا يجعل من الأسهل على المبرمجين الآخرين فهم ما هو الكود الخاص بك.
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
-.تدريب
+.PRACTICE
****
-على السكريبت الحالي الخاص بك، قم بتعبئة المعلومات التالية في الملاحظات في بداية الكود الخاص بك:
-
-. اسم السكريبت: اسم أغنيتك،
-. المؤلف : اسمك،
-. الوصف: هنا اكتب وصفاً مختصراً لمشروعك
+In your current script, write a comment with a description of your song on the first line.
****
-يمكنك أيضًا استخدام الملاحظات لوصف ما تفعله الأقسام المختلفة من الكود. فيما يلي مثال: يمكنك لصق الكود وتشغيله. لاحظ كيف تصف الملاحظات الفروع المختلفة:
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/your-first-song-comments.py.txt[]
+include::code-examples/your-first-song-comments.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/your-first-song-comments.js.txt[]
+include::code-examples/your-first-song-comments.js.txt[]
----
+{nbsp} +
[[uploadingsounds]]
-=== تحميل الأصوات الخاصة بك
+=== Uploading your own sounds
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
-يمكنك تحميل الصوت الخاص بك من خلال متصفح الصوت. افتح متصفح الصوت الخاص بك وانقر على زر "إضافة صوت" أسفل الفلاتر (إذا لم يظهر الزر، تأكد من أنك مسجل الدخول)-- ستفتح نافذة، لنستكشف الخيارات الثلاثة الأولى:
+You must be logged in to upload sounds.
-. *تحميل صوت جديد* يسمح لك باختيار ملفات صوتية (.mp3, .aiff, وما إلى ذلك) من جهاز الكمبيوتر الخاص بك. يمكنك تعديل اسم الملف إذا لزم الأمر ("constant value(required)")، وانقر على "UPLOAD".
-. *تسجيل سريع* يتيح لك تسجيل مقطوعات قصيرة مباشرة في مكتبة EarSketch. شاهد الفيديو أدناه لمزيد من المعلومات.
-. *Freesound* تسمح لك باستيراد الأصوات مباشرة من Freesound.org، قاعدة بيانات صوتية مفتوحة المصدر. في شريط البحث، يمكنك البحث عن نوع من الصوت المطلوب (على سبيل المثال: أغاني الطيور، الأمطار، الشارع المزدحم..). تحت "النتائج"، ستظهر قائمة بالأصوات. يمكنك معاينة الأصوات بالنقر على زر التشغيل، وإذا أعجبتك، انقر زر التبديل أمام اسم الملف ثم انقر فوق "UPLOAD" في الأسفل تماما.
+Let's explore the first three options.
-للعثور على الصوت الذي قمت برفعه أو تسجيله للتو، اكتب اسمه في شريط البحث في متصفح الصوت.
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
[role="curriculum-mp4"]
[[video101rec]]
video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
-.تدريب
+.PRACTICE
****
-الموسيقى، والفن بشكل عام، غالباً ما تكون طريقة لنقل رسالة. ويمكن أن يكون إما من خلال كلمات الأغنية، و/أو من خلال نوع الأغنية. نود أن نصنع أغنية قصيرة تعبر عن شيء ما. يمكن أن يكون الشعور الذي ترغب'في مشاركته، أو قصة.
-
-. فكر في ما ترغب'في التعبير عنه
-. ثم 1- إما أن تكتب بعض كلمات الأغنية وتسجل نفسك تغنيها أو تقرأها أو 2- تسجيل أو تحميل بعض الأصوات الموسيقية المرتبطة برسالتك
-. أضف هذه التسجيلات إلى أغنيتك باستخدام دالة fitMedia()
-. ثم أضف بعض المقاطع الإضافية من EarSketch باستخدام دالة fitMedia()
-. اعرض اغنيتك لصديق
-. يمكنك مناقشة أغنيتك والأشياء التي كنت تحاول التعبير عنها
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
****
-////
-OPTIONAL
-////
+An active computer program is called a *process*.
-* العمليات * ، أو المهام ، هي برامج تعمل على جهاز الحاسوب الخاص بك. تقوم وحدة المعالجة' المركزية للحاسوب ، أو * وحدة المعالجة المركزية * بتنفيذها.
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
-تحتفظ ذاكرة الحاسوب' * * بالبيانات وتعليمات المعالجة لاستخدام وحدة المعالجة المركزية. الذاكرة ، وتسمى أيضًا التخزين الأساسي أو ذاكرة الوصول العشوائي (ذاكرة الوصول العشوائي) ، تخزن بياناتها مؤقتًا. يتم تخزين المعلومات الخاصة بالعمليات التي يتم تشغيلها بنشاط فقط في ذاكرة الوصول العشوائي RAM. يتيح ذلك الوصول السريع إلى الإرشادات والبيانات الخاصة بوحدة المعالجة المركزية CPU.
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
-هناك فرق بين الذاكرة (أو التخزين قصير المدى) والتخزين طويل المدى. يشار إلى التخزين طويل المدى ، مثل محرك الأقراص الثابتة أو السحابة(cloud) ، على أنه تخزين ثانوي. * التخزين الثانوي * يحتوي على كميات كبيرة من البيانات لفترات طويلة من الوقت ، حتى بعد إيقاف تشغيل الحاسوب. لا تتفاعل وحدة المعالجة المركزية-CPU-بشكل مباشر مع وحدات التخزين الثانوية. عندما تنفذ وحدة المعالجة المركزية CPU عملية ما ، يجب أولاً وضع البيانات من التخزين الثانوي في الذاكرة حتى تتمكن وحدة المعالجة المركزيةCPU من الوصول إليها بسرعة.
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
-في بعض الأحيان ، تأتي البيانات الموجودة في الذاكرة لاستخدام وحدة المعالجة المركزيةCPU من جهاز إدخال بدلاً من التخزين الثانوي. * المدخلات * هي الإشارات أو البيانات التي يتلقاها الكمبيوتر ، مثل الصوت من الميكروفون. وبالمثل ، فإن مخرجات * * هي الإشارات أو البيانات المرسلة منه ، مثل الصوت عبر مكبر الصوت. الإدخال / الإخراج ، أو I / O ، هو كيفية تواصل الحاسوب مع العالم الخارجي ، بما في ذلك البشر!
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
-دعونا 'نفحص تسجيل الصوت في EarSketch كمثال للعملية. أولاً ، نقوم بتسجيل البيانات في الحاسوب باستخدام جهاز الإدخال ، الميكروفون. تقوم وحدة المعالجة المركزيةCPU بتخزين تلك البيانات الصوتية في ذاكرتها. إذا قمت بالضغط على زر التشغيل لسماع التسجيل الخاص بك ، فإن وحدة المعالجة المركزيةCPU تصل إلى البيانات وترسلها إلى أحد المخرجات أو مكبرات الصوت أو سماعات الرأس. عندما تضغط على زر التحميل ، تقوم وحدة المعالجة المركزيةCPU بتشغيل عملية تقوم بتحويل البيانات الصوتية إلى تنسيق ملف صوتي قياسي (ملف WAV أو .wav) وترسله إلى خادم EarSketch. الخادم (The server) هو نظام خارجي يوفر خدمات لجميع مستخدمي EarSketch ، بما في ذلك جهاز الكمبيوتر الخاص بك. يحفظ خادم EarSketch ملف الصوت من الذاكرة إلى التخزين الثانوي للخوادم 'بحيث يمكنك الوصول إليه في المستقبل.
+Let's examine recording a sound into EarSketch as an example process. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
-شاهد الشرح بالفيديو التالي:
+Check out the following supplementary video:
[role="curriculum-mp4"]
[[video11cpu]]
@@ -179,124 +172,119 @@ END OF OPTIONAL
////
[[copyright]]
-=== استخدم حقوق النشر بحكمة
+=== Use Copyright Wisely
-* حقوق الطبع والنشر * هي جزء من القانون يغطي * الملكية الفكرية * ، أو ملكية العمل الإبداعي ، مثل الموسيقى. عند استخدام عينات (مقطوعات صغيرة من الموسيقى) أو إعادة مزج الموسيقى الموجودة ، فأنت بحاجة إلى منح الفضل للمؤلفين ، ويمكنك القيام بذلك في تعليقات التعليمات البرمجية الخاصة بك. قبل استخدام أصوات الموسيقيين الآخرين ومشاركة الموسيقى الخاصة بك ، تعرف على المزيد حول حقوق النشر!
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
-* حقوق الطبع والنشر * هي جزء من القانون يغطي * الملكية الفكرية * ، أو ملكية العمل الإبداعي ، مثل الموسيقى.
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
-عندما تنشئ شيئًا أصليًا وكبيرًا بدرجة كافية ، تحصل على حقوق الطبع والنشر تلقائيًا! في الولايات المتحدة ، هذا يعني أنه يمكنك: عمل نسخ وإجراء تعديلات ومشاركة ما تقوم بإنشائه.
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
-هناك نوعان من حقوق الطبع والنشر للأغنية: حقوق الأغنية (للكاتب أو الملحن) وحقوق التسجيل الصوتي (غالبًا بواسطة شركة التسجيل). تذهب عائدات العروض العامة إلى كاتب الأغاني وتذهب معظم الارباح من مبيعات التسجيلات إلى شركة التسجيلات.
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
-يعد * انتهاك حقوق الطبع والنشر * انتهاكًا لحقوق الطبع والنشر ، مثل تنزيل الموسيقى بشكل غير قانوني. في الولايات المتحدة ، يسمح * الاستخدام العادل * باستخدام المحتوى المحمي بحقوق الطبع والنشر في ظل ظروف معينة ، مثل الأغراض التعليمية أو الحرجة ، وإعادة استخدام كميات صغيرة فقط من العمل. يتم تحديد الاستخدام العادل لكل حالة من قبل الحكم على أساس كل حالة على حدة.
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
-إلى جانب الاستخدام العادل ، هناك طريقة لاستخدام الموسيقى ومشاركتها بشكل مفتوح. يجب أن تساعدنا حقوق الطبع والنشر في صنع ومشاركة المزيد من الفن ، وليس أقل. يعمل EarSketch لأن الفنانين شاركوا أعمالهم معك من خلال * امثلة لعينات * (جزء صغير من التسجيل الصوتي) في مكتبة الأصوات. شارك هؤلاء الفنانون عيناتهم بموجب ترخيص * المشاع الإبداعي * ، والذي يمنح الإذن للآخرين لاستخدام أعمالهم. في EarSketch ، لديك إذن وصول مفتوح إلى هذه العينات ، وكل الموسيقى التي تنشئها في EarSketch قابلة للمشاركة ، على الرغم من أنه لا يمكنك بيعها. تعد مشاركة الموسيقى الخاصة بك أو السماح للطلاب الآخرين بإعادة مزج التعليمات البرمجية الخاصة بك طريقة لدفع هذا الأمر إلى الأمام والمساعدة في وضع فن جديد في العالم.
-
-تتيح تراخيص المشاع الإبداعي (أو CC) للمبدعين تحديد الحقوق التي يحتفظون بها والحقوق التي يتنازلون عنها. فيما يلي الأجزاء الممكنة من رخصة المشاع الإبداعي: "يمكنك استخدام هذا العمل كيفما تشاء ، باستثناء ...
-
-* ...عليك أن تضع اسمي عليها " - Attribution (BY) - بدون مشتقات (ND)
-* ...&8203لا يمكنك تغييره على الإطلاق." - No Derivatives (ND)
-- بدون مشتقات (ND)
-* ...لا يمكنك كسب المال منه " Non-Commercial (NC) - بدون مشتقات (ND)
-* ...عليك مشاركة أي شيء جديد تصنعه بموجب نفس الترخيص " - شارك على حد سواء (SA)
-
-لتحديد ترخيص المشاع الإبداعي ، كل ما عليك فعله هو اختيار نوع ووضعه في عملك. في EarSketch ، عندما تشارك نصًا ، سيُطلب منك تحديد ترخيص لأغنيتك.
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
[[chapter2summary]]
-=== ملخص الفصل 2
+=== Chapter 2 Summary
[role="curriculum-python"]
-* * الإيقاع * هو السرعة التي يتم بها تشغيل مقطوعة موسيقية ، محددة بعدد الدقات في الدقيقة (دقة في الدقيقة). الإيقاع مرتبط بالنوع الموسيقي.
-* يتم تنظيم المقاطع الموجودة في مكتبة اصوات EarSketch في مجلدات من الأصوات ذات الصلة. لمعرفة الإيقاع الدقيق للمقطع ، مرر مؤشر الماوس فوق الاسم في متصفح الصوت.
-* التعليقات هي أسطر من التعليمات البرمجية لا يتم تنفيذها بواسطة الحاسوب. ومع ذلك ، فهي مفيدة لادخال الملاحظات داخل البرنامج النصي.
-* `من مستورد earsketch*` يضيف EarSketch API إلى مشروعك. يجب أن يتم تضمينه في الجزء العلوي من كل نص.
-* `setTempo()`يتيح لك تحديد إيقاع أغنيتك. يجب تضمينه في كل برنامج نصي من EarSketch.
-* يمكنك تحميل الأصوات الخاصة بك إلى EarSketch من خلال مكتبة الاصوات. فقط انقر فوق "إضافة صوت".
-* المعالجة/0> هي مهمة تعمل على الحاسوب. تتم المعالجة بواسطة جهاز الحاسوب' * وحدة المعالجة المركزية CPU * ، وهو المسؤول عن تنفيذ تعليمات البرنامج.
-* * الذاكرة * (المعروفة أيضًا باسم ذاكرة الوصول العشوائي أو التخزين الأساسي) تحتفظ بالبيانات وتعليمات المعالجة مؤقتًا لاستخدام وحدة المعالجة المركزية.
-* * التخزين الثانوي * يشير إلى التخزين طويل المدى للبيانات ، غالبًا بكميات كبيرة. يجب وضع البيانات من التخزين الثانوي في الذاكرة قبل أن تتمكن وحدة المعالجة المركزية CPU من الوصول إليها.
-* * حقوق الطبع والنشر * هي جزء من القانون يغطي ملكية العمل الإبداعي ، مثل الموسيقى. إنه مهم للموسيقيين لأنه يحدد كيف يمكن استخدام عمل شخص آخر 'ومشاركته.
-* إذا أنشأت عملاً موسيقيًا ملموسًا وجديدًا ، فلديك حقوق نشر تلقائية. بمعنى آخر ، لديك حقوق على العمل الذي قمت بإنشائه.
-* * ترخيص * يمنح للآخرين الإذن باستخدام مقطوعة موسيقية. في بعض الأحيان ، يتم الاحتفاظ بحقوق معينة للعمل مع تراخيص * المشاع الإبداعي *. يسمح لك EarSketch بإضافة تراخيص Creative Commons-المشاع الإبداعي إلى الموسيقى الخاصة بك عبر نافذة المشاركة.
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
[role="curriculum-javascript"]
-* * الإيقاع * هو السرعة التي يتم بها تشغيل مقطوعة موسيقية ، محددة بعدد الدقات في الدقيقة (دقة في الدقيقة). الإيقاع مرتبط بالنوع الموسيقي.
-* يتم تنظيم المقاطع الموجودة في مكتبة EarSketch Sounds في مجلدات من الأصوات ذات الصلة. لمعرفة الإيقاع الدقيق للمقطع ، مرر مؤشر الماوس فوق الاسم في متصفح الصوت.
-* التعليقات هي أسطر من التعليمات البرمجية لا يتم تنفيذها بواسطة الحاسوب. ومع ذلك ، فهي مفيدة لتدوين الملاحظات داخل البرنامج النصي.
-* `setTempo();`يتيح لك تحديد إيقاع أغنيتك. يجب تضمينه في كل برنامج نصي من EarSketch.
-* يمكنك تحميل الأصوات الخاصة بك إلى EarSketch من خلال متصفح الصوت. فقط انقر فوق "إضافة صوت".
-* *عملية * هي مهمة تعمل على الكمبيوتر. تتم المعالجة بواسطة وحدة المعالجة المركزية CPU ، وهي المسؤولة عن تنفيذ تعليمات البرنامج.
-* * الذاكرة * (المعروفة أيضًا باسم ذاكرة الوصول العشوائي أو التخزين الأساسي RAM) تحتفظ بالبيانات وتعليمات المعالجة مؤقتًا لاستخدام وحدة المعالجة المركزية.
-* * التخزين الثانوي * يشير إلى التخزين طويل المدى للبيانات ، غالبًا بكميات كبيرة. يجب وضع البيانات من التخزين الثانوي في الذاكرة قبل أن تتمكن وحدة المعالجة المركزية من الوصول إليها.
-* * حقوق الطبع والنشر * هي جزء من القانون يغطي ملكية العمل الإبداعي ، مثل الموسيقى. إنه مهم للموسيقيين لأنه يحدد كيف يمكن استخدام ومشاركة عمل الأشخاص الآخرين.
-* إذا أنشأت عملاً موسيقيًا ملموسًا وجديدًا ، فلديك حقوق نشر تلقائية. بمعنى آخر، لديك حقوق على العمل الذي قمت بإنشائه.
-* *الترخيص* قطعة من الموسيقى تعطي الآخرين الإذن لاستخدامها. في بعض الأحيان ، يتم الاحتفاظ بحقوق معينة للعمل مع تراخيص *Creative Commons*. يسمح لك EarSketch بإضافة تراخيص اCreative Commons إلى الموسيقى الخاصة بك عبر نافذة المشاركة.
-
-
-
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
[[chapter-questions]]
-=== الأسئلة
+=== Questions
[question]
--
-ماذا تسمح لك `()setTempo` بفعله في EarSketch؟
+What does `setTempo()` allow you to do in EarSketch?
+
[answers]
-* غيّر وتيرة الأغنية
-* أضف صوت إلى المسار
-* اصنع قرع طبلة
-* غيّر نوعية الصوت داخل المشروع
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
--
[question]
--
-ما هي الوحدة للتمبو؟
+What is the unit for tempo?
+
[answers]
-* بيتات لكل دقيقة (BPM)
-* قياس
-* ديسيبلس(دبي)
-* ثوانٍ
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
--
[question]
--
-ما الهدف من استخدام الملاحظات؟
+What can you use comments for?
+
[answers]
-* كل ما ورد اعلاه
-* تنظيم التعليمات البرمجية/الكود الخاصة بك
-* كتابة وصف للسكريبت في بداية السكريبت الخاص بك
-* جعل التعليمات البرمجية (الكود) الخاصة بك سهلة القراءة للمبرمجين الآخرين
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
--
[question]
--
-أي من التصريحات التالية صحيحة؟
+Which of the following statements is true?
+
[answers]
-* القرص الصلب هو مثال للتخزين الثانوي
-* يتم حفظ بيانات الصوت في وحدة المعالجة المركزية للكمبيوتر
-* تحتوي وحدة المعالجة المركزية على بيانات تعليمية للبرامج
-* بيانات المخازن الثانوية لفترات قصيرة
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
--
[question]
--
-كيف تحصل على حقوق التأليف والنشر؟
+How do you get a copyright?
+
[answers]
-* عن طريق إنشاء ونشر أي عمل جديد
-* عن طريق شراء براءة اختراع
-* بالانضمام إلى منظمة سرية
-* عن طريق اختيار ترخيص لعملك
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
--
[question]
--
-ما هو المشاع الإبداعي (Creative Commons)؟
+What is a music license?
+
[answers]
-* رخصة لمشاركة عملك علناً بموجب قيود معينة
-* عملية التأليف
-* الحق في مقاضاة أي شخص يستخدم موسيقاك
-* رخصة تسمح لك بجمع الإتاوات
---
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/ca/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/ca/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/ca/v1/every-effect-explained-in-detail.adoc b/src/locales/ca/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..f52da48f9
--- /dev/null
+++ b/src/locales/ca/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTER
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/ca/v1/every-error-explained-in-detail.adoc b/src/locales/ca/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..9b0dfc157
--- /dev/null
+++ b/src/locales/ca/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*.
+
+The process of finding and fixing bugs is called *debugging*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/ca/v1/the-earSketch-api.adoc b/src/locales/ca/v1/the-earSketch-api.adoc
new file mode 100644
index 000000000..90e09c349
--- /dev/null
+++ b/src/locales/ca/v1/the-earSketch-api.adoc
@@ -0,0 +1,6 @@
+[[ch_27]]
+== The EarSketch API
+
+:nofooter:
+
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/ca/v2/add-beats.adoc b/src/locales/ca/v2/add-beats.adoc
new file mode 100644
index 000000000..3757cb508
--- /dev/null
+++ b/src/locales/ca/v2/add-beats.adoc
@@ -0,0 +1,339 @@
+[[addsomebeats]]
+== Add some Beats!
+
+:nofooter:
+
+In this chapter you will learn how to make your own beats! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
+
+[[variables]]
+=== Variables
+
+[role="curriculum-python curriculum-mp4"]
+[[video2py]]
+video::./videoMedia/002-05-Variables-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video2js]]
+video::./videoMedia/002-05-Variables-JS.mp4[]
+
+What is a variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
+
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
+
+To use a variable,
+
+[role="curriculum-python"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. You can only use the variable after it has been assigned, not before. For example, write `fitMedia(synth1, 1, 1, 3)`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-javascript"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. We also use the command `var` at the beginning of the line. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. For example, write `fitMedia(synth1, 1, 1, 3);`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-instead-of-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-instead-of-this.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+In your previous scripts, use variables to store your sound constants. Look at the examples below for help. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-variables.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-variables.js.txt[]
+----
+
+Note that it's important to name your variable in an understandable and descriptive way. For example, specify `synth1` instead of `music1` or `test`, which don't provide any information. This way, when you or someone else reads your code, they can see what you are referring to.
+
+A *constant* is similar to a variable because it stores values. However, the value of a constant never changes. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. By convention, constant names are capitalized and use underscores instead of spaces.
+
+[[drumbeatstrings]]
+=== Beat Strings
+
+Let's first learn some basic concepts about rhythm:
+
+* *Rhythm* is a pattern of sound, often repeated.
+* The *tempo* is the speed of the music in BPM (beats per minute).
+* A *beat* is like the "steady pulse" of a song. When members of an audience clap their hands in a concert, they're clapping on the beat.
+* A *measure* is a musical time unit with a predetermined number of beats. In EarSketch, 1 *measure* is 4 beats long. Since there are 4 beats in 1 measure, beats are also called *quarter (1/4) notes*.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. When you are counting 1/4 notes, you say "1, 2, 3, 4...." When counting 1/8 notes, you can use "ands": "1 and 2 and 3 and 4 and...."
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Note that the sum of all notes in one measure must be equal to 1. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* A *metronome* helps the musician set the rhythm of his or her piece by making a clicking noise on the beat. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
+
+[[imediameasurepng]]
+.A measure
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
+
+[[imediabeatpng]]
+.A beat
+[caption="Figure 3.2.2: "]
+image::../media/U1P1/beat.png[A beat]
+
+[[imediasixteenthnotepng]]
+.A sixteenth note
+[caption="Figure 3.2.3: "]
+image::../media/U1P1/sixteenthnote.png[A sixteenth note]
+
+.PRACTICE
+****
+Listen to your favorite song, and try to clap on the beat. You can do this exercise with your neighbor.
+****
+
+We'll compose each of our rhythms in a *beat* string.
+
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
+
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` starts playing the percussive sound clip (one hit of the drum, for example).
+* `+` extends the audio clip into the next sub-beat. It always follows a `0` or `+`.
+* `-` is a rest, meaning silence.
+
+.PRACTICE
+****
+For each of the following drumbeat strings, try clapping on the zeros. Then listen to the corresponding audio and verify if you were right. This exercise will help you understand how the drumbeat strings work.
+****
+
+Here are some examples of 1-measure beat strings:
+
+Quarter notes: `"0\+++0+++0\+++0+++"`
+(read: "1, 2, 3, 4")
+
+++++
+audioMedia/beatString1.mp3
+++++
+
+Eighth notes: `"0+0+0+0+0+0+0+0+"`
+(read: "1 and 2 and 3 and 4")
+
+++++
+audioMedia/beatString11.mp3
+++++
+
+Sixteenth notes: `"0000000000000000"`
+(that's very fast, depending on the tempo)
+
+++++
+audioMedia/beatString12.mp3
+++++
+
+`"0-0-0---0-0-0---"`
+(read: "1 and 2, 3 and 4")
+
+++++
+audioMedia/beatString2.mp3
+++++
+
+`"0---0---0-0-0---"`
+(read: "1, 2, 3 and 4")
+
+++++
+audioMedia/beatString3.mp3
+++++
+
+`"0---0---0---0000"`
+(read: "1, 2, 3, 4 e and a")
+
+++++
+audioMedia/beatString4.mp3
+++++
+
+{nbsp} +
+
+////
+ADDITIONAL VIDEO TO BE ADDED
+See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+video revamping tab
+////
+
+[[makebeat]]
+=== The `makeBeat()` function
+
+Now let's see how you can make your own beat. Here we use the term "beat" as a shorthand for drumbeat: a repeated rhythmic pattern of percussive sounds. We will use the `makeBeat()` function, with 4 arguments:
+
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
+
+Let's see more details with this video:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12py]]
+video::./videoMedia/3_3_makebeat_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12js]]
+video::./videoMedia/3_3_makebeat_js.mp4[]
+
+Here is the example shown in the video:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-multi-beat.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-multi-beat.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new `beatString1` variable, a 16-character string with the characters `"0"`, `"+"`, and `"-"`.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
+Please note that:
+
+. You should assign your variables with the `=` symbol before using them.
+. Just like `fitMedia()`, the `makeBeat()` function starts with a lowercase letter (`m`) and has an uppercase letter in the middle (`B`).
+. Just like `fitMedia()`, the `makeBeat()` function has 4 parameters separated by commas.
+
+When you hear your music, if you don't like your first version, tweak your beat to make it sound better and better, until you like what you have.
+****
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. You can either play them simultaneously, on two different tracks, or one after the other on one single track.
+****
+
+[[beatsandgenres]]
+=== Create a beat based on your musical genre
+
+Now that you've started working with `makeBeat()` and beat strings, let's explore some basic beat patterns that you can use.
+You've learned that a musical genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Similarly, some genres have signature beat patterns. Below are some examples:
+
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
+
+Here is the corresponding code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-examples-of-beats.js.txt[]
+----
+
+[[chapter3summary]]
+=== Chapter 3 Summary
+
+* In EarSketch, 1 measure is divided into 4 beats, or 4 quarter notes. 1 beat is divided into 4 sixteenth notes.
+* *Variables* create a space in computer memory to store data.
+* You first need to assign the value (data) to the variable name using the sign `=`. Then you can use the variable by writing its name in the code.
+* A *string* is a data type that consists of a series of characters encapsulated by single or double quotes.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Strings are used with the `makeBeat()` function to create rhythmic patterns in EarSketch. `makeBeat()` takes a beat string to define each sixteenth note of its pattern. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` takes four arguments:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these options is a string?
+
+[answers]
+* "Five"
+* 5
+* FIVE
+* Five
+--
+
+[question]
+--
+What does "0" represent in a beat pattern string?
+
+[answers]
+* Start playing the clip
+* Rest
+* Extend the clip
+* End the clip
+--
+
+[question]
+--
+In EarSketch, one measure is...
+
+[answers]
+* 4 beats long
+* 4 sub-beats long
+* 16 beats long
+* 1 quarter note
+--
+
+[question]
+--
+One sixteenth note is...
+
+[answers]
+* a quarter of a quarter note
+* half a beat
+* a quarter of a measure
+* 1 measure
+--
+
+[question]
+--
+To use the `makeBeat()` function, what is the order of parameters you need to provide?
+
+[answers]
+* clip name, track, start measure, beat string
+* tempo, track, start measure, end measure
+* clip name, start measure, end measure, beat string
+* beat string, track, start measure, clip name
+--
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/ca/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..6788ccea1
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // This is the "boom" sound.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/ca/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..39b8de864
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # This is the "boom" sound.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # This is the "ts" sound.
+
+# Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/ca/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/ca/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/ca/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..2bbded58b
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Setup
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/ca/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..02f305a40
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-variables.js.txt b/src/locales/ca/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..892e9ee9e
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Setup
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/add-beats-variables.py.txt b/src/locales/ca/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..615531008
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..b47ffdbce
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..8bfd9ef2b
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..f17f7606e
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..2bb8b3f8e
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/ca/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/ca/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..fe86e34c5
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Setup
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..5e0318ee0
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..b193b59d7
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Setup
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..7c13d7605
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Setup
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..fc4ac0026
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Setup
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..02b9bf3fd
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/ca/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/ca/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/ca/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..5393649b3
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Setup
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/ca/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..e7bcaac25
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-arrays.js.txt b/src/locales/ca/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..6f979e08f
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/ca/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..fc1a83742
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/ca/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..35d2a3f43
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/ca/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/ca/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/ca/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..c3be55257
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/ca/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..ddb76404f
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-list.py.txt b/src/locales/ca/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c6cfcd632
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/ca/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..0ccfffc88
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Setup
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/ca/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..9747b5b4a
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/ca/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..81e2dbe01
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Setup
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/ca/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dae36a455
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/ca/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..5fbe4a7ac
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Setup
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/ca/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..91f9bf807
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..1aaddaf46
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..3c2ae73a2
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..cd446e98c
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Setup
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..ca104ee90
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..a639ba4f0
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..0da37e8be
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..d123caa9a
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Setup
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..b0902254f
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..7221572eb
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..1b2cc9748
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..f5b833522
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Setup
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/ca/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..00ff28b70
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/ca/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..013470826
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Setup
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/ca/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/ca/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..8979b5185
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Setup
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/ca/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/ca/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..02ab97eb8
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/ca/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..ce6ff834d
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/ca/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..998a9d803
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/ca/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..c735d5b8f
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/ca/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..687c5da0f
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Setup
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/ca/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..d1fb96a5c
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/ca/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/ca/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/ca/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..93ca1ae9d
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Setup
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/ca/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..ef85ce675
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Setup
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/ca/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..67ba71708
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Setup
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/ca/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..d7cf9db54
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/ca/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/ca/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/ca/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/ca/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..1f9f0fea3
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..64a5b22b0
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/ca/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/ca/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/ca/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/ca/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..91f3bdf73
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/ca/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..95b76a723
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/ca/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..355a11de2
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/ca/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..f15821b9e
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/ca/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..dfe4c8900
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/ca/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..903928096
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Setup
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/ca/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..c5595e80f
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..79b65068e
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Setup
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..9d1438f4b
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..a0f162eeb
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..14b374cc9
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..9d8960e5c
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Setup
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..b2ac152d1
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..479e0e3fd
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..98ff5f56b
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/your-first-song-comments.js.txt b/src/locales/ca/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..d25a49cec
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Setup
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/ca/v2/code-examples/your-first-song-comments.py.txt b/src/locales/ca/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..a077c3b76
--- /dev/null
+++ b/src/locales/ca/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/ca/v2/custom-functions.adoc b/src/locales/ca/v2/custom-functions.adoc
new file mode 100644
index 000000000..748232c60
--- /dev/null
+++ b/src/locales/ca/v2/custom-functions.adoc
@@ -0,0 +1,285 @@
+[[customfunctionssongstructure]]
+== Custom Functions and Song Structure
+
+:nofooter:
+
+The song structure is the song's organization over time. The goal is to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own function, custom functions, to structure your songs!
+
+[[asongsstructure]]
+=== A song's structure
+
+:nofooter:
+
+A song can be divided into *sections*. A section is made up of several measures (musical time units), and it expresses an idea or feeling. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
+
+A common and simple *form*, or song structure, is ABA. A and B are two different sections, for example chorus and verse. The B section adds variety, while returning to the A section invokes familiarity. The code below creates an ABA form. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
+
+[[imediau2sections_052016png]]
+.An ABA form within the EarSketch DAW
+[caption="Figure 9.2: "]
+image::../media/U2/sections_052016.png[Alt Text]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Select a song that you like. Listen to it and try to notice the different sections. Can you tell when the musicians change sections? How many times do you hear the chorus and verse? What kind of contrasts can you observe? Share your example with your neighbor.
+****
+
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
+
+[[creatingyourcustomfunctions]]
+=== Create your custom functions
+
+In the previous example with the ABA song, the code is large, and the code is repeated for the second A section. There is a way to be more concise, thanks to *custom functions*! We will define a function that will represent section A, then call the function twice.
+
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. Here is how you would define section A:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-untitled1.js.txt[]
+----
+
+. `sectionA()` is the name we chose for our function. You can choose any name you like. Try to name your function in a descriptive way so your code is easier to read.
+. The instructions are the *body* of the function. They are indented.
+
+.PRACTICE
+****
+Paste this code in a new script, and run it. You should see that your DAW remains empty.
+That's because you need to *call* a function to use it.
+To call your function, add the line `sectionA()`, unindented, after your function definition. When running the code, you should see section A in your DAW
+****
+
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. To remedy this issue, we will create *parameters* for our function.
+
+.PRACTICE
+****
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. When you call your function, add the parameters `1` and `5` between the parentheses. Run the code to make sure there is no error.
+1. Add a second function call, this time with the parameters `9` and `13`. Run the code to make sure there is no error.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
+****
+
+Here is what your code could look like:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+----
+
+//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
+
+[role="curriculum-python curriculum-mp4"]
+[[video93py]]
+video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video93js]]
+video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
+
+[[transitionstrategies]]
+=== Transition Strategies
+
+Now that you know how to create custom functions to structure your song, let's look at transitions. *Transitions* help one section smoothly go into the next. They can connect verse and chorus, build up to a drop, mix between tracks (DJing), or change keys. The goal of a transition is to grab the listener's attention and let them know a change is about to occur.
+
+Following are some popular strategies for creating musical transitions:
+
+. *Crash Cymbal*: Placing a crash cymbal on the first beat of a new section.
+. *Drum Fill*: A rhythmic variation to fill the gap before a new section.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Melody Variation*: Introducing a variation of the chords, bass line, or melody before the new section. Often, a folder within the EarSketch sound library contains variations of a similar riff.
+. *Riser*: A note or noise that increases in pitch. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. You can use the search term "riser" in the Sound Browser. A reversed crash cymbal can be used as a riser, like YG_EDM_REVERSE_CRASH_1.
+. *Snare Roll*: A sequence of repeated snare hits, with increasing density, pitch, or amplitude. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping*: Repeating a short segment of melody before a new section.
+. *Crossfading*: Decreasing the volume of one section while increasing the volume of a new section.
+. *Anacrusis*: When the melody of the new section starts a couple beats early.
+
+.PRACTICE
+****
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. You can work in pairs. Once you've thought about it, you can have a look at the examples below.
+
+The transition should be placed one or two measures before the new section. You can use several transition techniques at the same time.
+****
+
+Drum fills:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+----
+
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. An example is shown below.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+----
+
+The next example uses multiple risers and a crash cymbal during the transition.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
+----
+
+{nbsp} +
+
+[[yourfullsong]]
+=== Your full song
+
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. Functions are one kind of abstraction used in computer science. They pack multiple statements into one tool so they can be easily referred to. Abstractions can make the form of a program clearer.
+
+.PRACTICE
+****
+Let's create a full song using all the tools you've discovered in EarSketch! Here is a suggestion of how to work, but you can adapt it as you like:
+
+. Choose a theme for your song. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. Then select a simple structure.
+. And finally, start coding! Start with some `fitMedia()` functions to select sounds.
+. Use `makeBeat()` to add some percussion.
+. You can upload your own sounds.
+. Use `for` loops to reduce repetition in your code.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
+. Add one or several conditional statements.
+. Make sure you use variables to store some information such as sound constants.
+. Make sure you use comments to explain what you are doing.
+. Don't forget to regularly run your code and listen to your song. This will help you modify it until you like the sound of it.
+. Choose a name for your song.
+****
+
+Here is an example of a full song:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+----
+
+In this example, we have used a `for` loop inside a custom function! We have used parameters of the function (`start` and `end`) inside the for loop.
+
+[[chapter7summary]]
+=== Chapter 7 Summary
+
+* *Sections* are related musical units consisting of multiple measures. Each expresses an idea or feeling.
+* *Transitions* are passages of music used to connect consecutive musical sections.
+* The structure and variety found within a song is known as its *form*. A common musical form is A-B-A.
+* *Custom functions* are unique functions written by the programmer to accomplish a specific task. You have to create a custom function to be able to call it. You can create as many parameters as you want.
+* An *abstraction* is the bundling of ideas to form a single, often less complex, concept. Functions are an example of abstraction.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these is NOT an example of a musical section?
+
+[answers]
+* Drums
+* Intro
+* Verse
+* Chorus
+--
+
+[question]
+--
+What is an abstraction?
+
+[answers]
+* A bundling of ideas to form a single concept
+* A variety of sounds throughout sections
+* Parts of a song that are related, but also are distinct from each other
+* A statement that returns a value to the function call
+--
+
+[role="curriculum-python"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
+* `myFunction(2, 5)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
+* `myFunction(2, 5)`
+--
+
+[question]
+--
+Which of these is NOT an example of a transition?
+
+[answers]
+* Melody Consistency
+* Crash Cymbal
+* Riser
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/ca/v2/data-structures.adoc b/src/locales/ca/v2/data-structures.adoc
new file mode 100644
index 000000000..392a3b3e5
--- /dev/null
+++ b/src/locales/ca/v2/data-structures.adoc
@@ -0,0 +1,497 @@
+[[getorganizedwithdatastructures]]
+== Data Structures
+
+:nofooter:
+
+[role="curriculum-python"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called lists, and a new functionality of `makeBeat()`.
+
+[role="curriculum-javascript"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called arrays, and a new functionality of `makeBeat()`.
+
+[[datastructures]]
+=== What is a Data Structure
+
+[role="curriculum-python"]
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-javascript"]
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
+----
+
+[role="curriculum-python"]
+If you have replaced variables with a list, how will you reference the content of the list? We use indices. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+[role="curriculum-javascript"]
+If you have replaced variables with an array, how will you reference the content of the array? We use indices. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+.PRACTICE
+****
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-list.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-arrays.js.txt[]
+----
+
+//.The EarSketch Share window for collaboration (Let Others Edit)
+
+//[caption="Figure 21.4.2: "]
+
+image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
+
+[role="curriculum-python"]
+We've seen that `list[index]` will reference an element of the list. This can also be used to modify an element of the list. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+[role="curriculum-javascript"]
+We've seen that `array[index]` will reference an element of the array. This can also be used to modify an element of the array. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+.PRACTICE
+****
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. You can use the track number as the counter.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
+****
+
+Below is an example. You can have a look in the console to see what is printed when you run the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
+----
+
+[role="curriculum-python"]
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-javascript"]
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-additive-introduction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-additive-introduction.js.txt[]
+----
+
+{nbsp} +
+
+[[usingdatastructureswithmakebeat]]
+=== Use Data Structures with `makeBeat()`
+
+[role="curriculum-python"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
+
+[role="curriculum-javascript"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
+
+[role="curriculum-python"]
+* Like lists, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[role="curriculum-javascript"]
+* Like arrays, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[cols="h,^,^,^,^,^,^,^,^,^"]
+|===
+|Character
+|E
+|a
+|r
+|S
+|k
+|e
+|t
+|c
+|h
+
+|Index
+|0
+|1
+|2
+|3
+|4
+|5
+|6
+|7
+|8
+|===
+
+[role="curriculum-python"]
+* You can concatenate lists together like you do with strings. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
+
+[role="curriculum-javascript"]
+* You can concatenate arrays together like you do with strings. We use the `concat` *method*. A method is similar to a function as it has parentheses which contain parameters. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
+
+[role="curriculum-python"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
+
+[role="curriculum-javascript"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your lists.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your arrays.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+Here is an example of a solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
+----
+
+This is an example of how you can use string operations with `makeBeat()`:
+
+[role="curriculum-python curriculum-mp4"]
+[[video13py]]
+video::./videoMedia/013-03-Substrings-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video13js]]
+video::./videoMedia/013-03-Substrings-JS.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-operations.js.txt[]
+----
+
+[role="curriculum-python"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-javascript"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Copy the code example in chapter 3.4 for beats by genre. Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
+****
+
+Here is the solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-examples-of-beats.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. You can refer to the video in chapter 3.4 for beats by genre. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
+****
+
+{nbsp} +
+
+[[evaluatingcorrectness]]
+=== Evaluate Correctness
+
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Here are some elements that you can check:
+
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Here are some questions that can help you make your code more concise:
+** Did I copy/paste function calls several times in a row? If so, simplify with a loop!
+** Am I reusing any blocks of code? If so, put them in a function!
+** Are there sound constants or mathematical expressions that I use repeatedly throughout my code? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. If your peers are getting lost or confused by your code, it is probably unclear. Here are some questions to help you make your code clear:
+** Are the names of my variables and functions descriptive? If not, rename them.
+** Have I used comments to explain each block of code and any potentially confusing lines of code?
+** Have I used computational structures like custom functions and loops to help organize my code?
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
+
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. When giving feedback:
+
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
+
+Likewise, when receiving feedback:
+
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. This will allow your peers to provide feedback that is most helpful to you.
+* *Listen* - Wait to respond until your peer has finished speaking. Be attentive to the information your peer is conveying. Comment your code based on their feedback. These comments can be useful when revising.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in a list.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in an array.
+****
+
+[[chapter9summary]]
+=== Chapter 9 Summary
+
+[role="curriculum-python"]
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Items stored within a list, or elements, can be any data type.
+* Like strings, list elements get assigned an index. List indices start at 0.
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[role="curriculum-javascript"]
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
+* Like strings, array elements get assigned an index. Array indices start at 0.
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following operations is used to join lists/arrays?
+
+[answers]
+* Concatenation
+* Slicing
+* Combination
+* Addition
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the index number of the first element of a list in Python?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What does `len(myList)` return?
+
+[answers]
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
+[answers]
+* `listA + listB`
+* `listA ++ listB`
+* `listA and listB`
+* `listB + listA`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How can you get a list from oldList without the first and last elements?
+
+[answers]
+* `oldList[1:len(oldList) - 1]`
+* `oldList[1:len(oldList)]`
+* `oldList[0:len(oldList)]`
+* `oldList[2:len(oldList - 1)]`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the index number of the first element of an array in Javascript?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What does `myArray.length` return?
+
+[answers]
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
+[answers]
+* `arrayA.concat(arrayB)`
+* `arrayA.concatenate(arrayB)`
+* `arrayB.concat(arrayA)`
+* `arrayB.concatenate(arrayB)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How can you get an array from `oldArray` without the first and last elements?
+
+[answers]
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
+--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/ca/v2/effects-and-envelopes.adoc b/src/locales/ca/v2/effects-and-envelopes.adoc
new file mode 100644
index 000000000..92b9ab79b
--- /dev/null
+++ b/src/locales/ca/v2/effects-and-envelopes.adoc
@@ -0,0 +1,321 @@
+[[effectsandenvelopes]]
+== Effects and Envelopes
+
+:nofooter:
+
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
+
+[[effectsinearsketch]]
+=== Use Effects in EarSketch
+
+:nofooter:
+
+*Effects* allow us to change qualities of sounds. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
+
+[role="curriculum-python curriculum-mp4"]
+[[video4py]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video4js]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
+
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
+
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+
+.PRACTICE
+****
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
+****
+
+Here is an example below:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
+----
+
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
+
+No effect:
+
+++++
+audioMedia/reference.mp3
+++++
+
+Delay effect:
+
+++++
+audioMedia/delay2.mp3
+++++
+
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
+
+.PRACTICE
+****
+. Read about the delay effect in the list of effects chapter here: <>
+. Then run the code below and listen to the music without effects
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
+----
+
+{nbsp} +
+
+[[functionsandmoreeffects]]
+=== Functions and more effects
+
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Note that the function names always start with a lower-case letter, and are often a verb. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
+
+[role="curriculum-python"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+[role="curriculum-javascript"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
+
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
+
+Now, let's play more with the `setEffect()` function. The following video shows how to use some effects:
+
+////
+VIDEO IS BEEING MADE
+more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+("videos revamping" tab)
+////
+
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
+
+Listen to the clips below to hear the result of adding reverb to a track:
+
+No effect:
+
+++++
+audioMedia/reverbReference.mp3
+++++
+
+Reverb effect:
+
+++++
+audioMedia/reverbEffect.mp3
+++++
+
+{nbsp} +
+
+.PRACTICE
+****
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
+****
+
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
+
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
+
+*Envelopes* allow us to define how an effect changes over time.
+
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
+
+[[envelopepoints]]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
+image::../media/U2/NewEnvelope.png[Alt Text]
+
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
+
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
+
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
+
+Here is an example of fade in:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
+----
+
+Now watch this video for other envelope examples
+
+[role="curriculum-python curriculum-mp4"]
+[[video5b]]
+video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript curriculum-mp4"]
+video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new song. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
+****
+
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+----
+
+And here is an example of fade in and fade out on all the tracks:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter5summary]]
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does an effect allow you to do in EarSketch?
+
+[answers]
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
+--
+
+[question]
+--
+Which of these is NOT a `setEffect()` argument?
+
+[answers]
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
+--
+
+[question]
+--
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
+[answers]
+* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
+* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
+* `fitMedia(DELAY, 3, DELAY_TIME, 50.0)`
+* `setEffect(50, DELAY_FEEDBACK, 1)`
+--
+
+[question]
+--
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
+[answers]
+* Clip Length
+* Start Value
+* Track Number
+* Effect
+--
+
+[question]
+--
+What would the following `setEffect()` function do?
+
+[source,python]
+----
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
+----
+
+[answers]
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/ca/v2/get-user-input.adoc b/src/locales/ca/v2/get-user-input.adoc
new file mode 100644
index 000000000..27edbca84
--- /dev/null
+++ b/src/locales/ca/v2/get-user-input.adoc
@@ -0,0 +1,391 @@
+[[getuserinput]]
+== Get User Input
+
+:nofooter:
+
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. For that, we'll look at return statements and the `readInput()` function.
+
+[[returnstatement]]
+=== Return Statement
+
+Watch this video first:
+
+[role="curriculum-python curriculum-mp4"]
+[[video131py]]
+video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video131js]]
+video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
+
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. B. signals the function to stop. If you have any statements after the `return` keyword, they will be ignored.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
+
+Here is a code example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements.js.txt[]
+----
+
+With the return statement, the complete control flow for a function looks like this:
+
+[[return]]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
+image::../media/U2/Return.png[Alt Text]
+
+.PRACTICE
+****
+Create a function that will implement a musical section with:
+
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
+
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
+
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
+
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
+
+Then call the function at different measures with different variations.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-conditional-statement.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-conditional-statement.js.txt[]
+----
+
+{nbsp} +
+
+[[userinput]]
+=== Get User Input
+
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. The `readInput()` function returns what the user types there.
+
+For example, copy the following code in a new script, and run it:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-untitled1.js.txt[]
+----
+
+We might need to convert the returned user input into a different data type. Here are useful functions:
+
+[role="curriculum-python"]
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
+
+[role="curriculum-javascript"]
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
+
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-1.js.txt[]
+----
+
+Here is another example of what you can do with user input.
+
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ask for a user input to modify something in your song.
+
+Here are ideas of tools you can use:
+
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
+****
+
+{nbsp} +
+
+[[booleanlogic]]
+=== Boolean Logic
+
+We will now combine boolean logic and user input for another example of user interaction.
+
+[role="curriculum-python"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
+
+[role="curriculum-javascript"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
+
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
+
+[role="curriculum-python"]
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
+
+[role="curriculum-javascript"]
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
+
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `True` or `False`?
+
+* `not True`
+* `True and False`
+* `True or False`
+* `True and True`
+* `(True and False) or True`
+* `True and not False`
+* `not (False or False)`
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `true` or `false`?
+
+* `!true`
+* `true && false`
+* `true || false`
+* `true && true`
+* `(true && false) || true`
+* `true && !false`
+* `!(false || false)`
+****
+
+Use the following code to print the answers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
+----
+
+Here is a reminder of boolean creation, and some examples of boolean operations:
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+
+.PRACTICE
+****
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-operations.js.txt[]
+----
+
+{nbsp} +
+
+.CHALLENGE
+****
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
+****
+
+{nbsp} +
+
+[[chapter8summary]]
+=== Chapter 8 Summary
+
+[role="curriculum-python"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[role="curriculum-javascript"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following would be considered an example of data type conversion?
+
+[answers]
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Using `readInput()` to ask a user for a genre.
+* Producing a Boolean through a comparison operator.
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+not (True and (4 > 5))
+----
+
+[answers]
+* `True`
+* `5`
+* `4`
+* `False`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+!(true && (4 > 5));
+----
+
+[answers]
+* `true`
+* `4`
+* `false`
+* `5`
+--
+
+[question]
+--
+Which of the following is an example of concatenation?
+
+[answers]
+* `x = beatstring1 + beatstring2`
+* `x = beatstring1.beatstring2`
+* `x = (beatstring1, beatstring2)`
+* `x = beatstring1[beatstring2]`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How would you obtain the boolean True with the booleans True and False?
+
+[answers]
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How would you obtain the boolean true with the booleans true and false?
+
+[answers]
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/ca/v2/getting-started.adoc b/src/locales/ca/v2/getting-started.adoc
new file mode 100644
index 000000000..c90f659c1
--- /dev/null
+++ b/src/locales/ca/v2/getting-started.adoc
@@ -0,0 +1,386 @@
+[[getstartedwithearsketch]]
+== Getting Started with EarSketch
+
+:nofooter:
+
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
+
+[[discoverearsketch]]
+=== Discover EarSketch
+
+:nofooter:
+
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
+
+////
+TODO: upload video
+////
+
+As you become familiar with EarSketch these are the main panels.
+
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
+
+{nbsp} +
+
+_What is a DAW?_
+
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
+
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
+
+EarSketch is DAW that allows you to create music by writing code.
+
+Here is how to make full use of the DAW:
+
+[role="curriculum-mp4"]
+[[video1b]]
+video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-intro-script.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-intro-script.js.txt[]
+----
+
+{nbsp} +
+
+[[createanewscript]]
+=== Create your first script!
+
+Let's see how to create a script from scratch.
+
+. *Create.* In the editor tabs, click the white "+" icon.
++
+If this is your first script, click the large blue text "Click here to create a new script!"
++
+[[newscriptplus]]
+.Create a new script, open scripts
+[caption="Figure 1.2.1: "]
+image::../media/U1P1/NewScriptPlus.png[Alt Text]
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
++
+[[newscriptpromptpy]]
+.The create a new script dialog box
+[role="curriculum-python"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
+[[newscriptpromptjs]]
+.The create a new script dialog box
+[role="curriculum-javascript"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+
+*_What is a programming language?_*
+
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
+
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
+
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
+
+[[fitmedia]]
+=== The `fitMedia()` function
+
+Now that you have created your first script, let's start working on your music!
+
+Watch this video to see how to add an audio clip to your song:
+
+[role="curriculum-python curriculum-mp4"]
+[[video110py]]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video110js]]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
+
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
+
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
+
+////
+OPTIONAL
+////
+
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
+
+////
+END OF OPTIONAL
+////
+
+////
+OPTIONAL
+////
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia.js.txt[]
+----
+
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using sounds that you like:
+
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
+
+For each exercise, you can have your neighbour listen to your song.
+
+If you have errors when running your code, check out the next chapter about debugging.
+****
+
+[[debugging]]
+=== Debug your code
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. You can use debugging strategies, using the console.
+
+[role="curriculum-python curriculum-mp4"]
+[[video3py]]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video3js]]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+////
+OPTIONAL
+////
+
+What are the different types of errors?
+
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
+
+////
+END OF OPTIONAL
+////
+
+Here are some common errors:
+
+[role="curriculum-python"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
+
+[role="curriculum-javascript"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
+
+Time to practice!
+Find the five errors in the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-finding-errors.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-finding-errors.js.txt[]
+----
+
+////
+OPTIONAL
+////
+
+Here is the answer
+
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
+
+////
+END OF OPTIONAL
+////
+
+Take a look at <> for a description of different error types and what you can do to prevent them.
+
+////
+TODO: when options are ready, modify the link
+////
+
+[[chapter1summary]]
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a panel in the EarSketch workspace?
+
+[answers]
+* The effects browser
+* The code editor
+* The DAW
+* The console
+--
+
+[question]
+--
+How many parameters do you need for your `fitMedia()` function?
+
+[answers]
+* 4
+* 6
+* 2
+* 3
+--
+
+[question]
+--
+One script corresponds to...
+
+[answers]
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
+--
+
+[question]
+--
+What is a measure?
+
+[answers]
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
+--
+
+[question]
+--
+Which of the following is NOT a common type of error found in code?
+
+[answers]
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
+--
+
+[question]
+--
+Where in the EarSketch workspace can you get information about your bugs?
+
+[answers]
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/ca/v2/legacy.adoc b/src/locales/ca/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/ca/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/ca/v2/loops-and-layers.adoc b/src/locales/ca/v2/loops-and-layers.adoc
new file mode 100644
index 000000000..52974c50d
--- /dev/null
+++ b/src/locales/ca/v2/loops-and-layers.adoc
@@ -0,0 +1,414 @@
+[[loopandlayers]]
+== Loops and Layers
+
+:nofooter:
+
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. We will also cover musical layers and textures as well as some debugging tips.
+
+[[forloops]]
+=== `for` loops
+
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
+
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
+
+////
+add new video
+more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=0
+in the "revamping videos" tab (includes link to script)
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
+----
+
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
+
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+
+[[loop-components-PY]]
+.The basic components of a for loop
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.The basic components of a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
+.PRACTICE
+****
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
+[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `print()` call.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-printing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-printing.js.txt[]
+----
+
+Here, you will see in your console the following lines:
+
+----
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
+3
+ok
+4
+ok
+----
+
+and it ends there since measure has to be lower than 5, so 4 is your limit.
+
+[[controlflow]]
+=== Control Flow
+
+Here is another example of how you can use `for` loops:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12bpy]]
+video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12bjs]]
+video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
+
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-no-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-no-loops.js.txt[]
+----
+
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-loops.js.txt[]
+----
+
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
+
+A loop is a *control flow statement*, which changes the order. At the end of a loop body, it jumps back to the top of the loop.
+
+This animation shows how the control flow moves in a `for` loop, and how the value of the loop counter changes on each *iteration*, or repetition of the loop body:
+
+[[loop-py]]
+.Stepping through a for loop
+[role="curriculum-python"]
+[caption="Figure 4.2.1: "]
+image::../media/U1P2/LoopPy_updated.gif[Alt Text]
+
+.Stepping through a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.2.1: "]
+[[loop-js]]
+image::../media/U1P2/LoopJS_updated.gif[Alt Text]
+
+////
+Although it is valid syntax, a `*monospace bold phrase*` causes a build error in AsciidocFX. Might be something to do with DocBook conversion. No bold for now. May see how ES handles it in the future.
+
+BMW
+////
+
+One last interesting thing about `for` loops is incrementation.
+
+[role="curriculum-python"]
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
+
+[role="curriculum-javascript"]
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-incrementing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-incrementing.js.txt[]
+----
+
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. This means measure is now equal to its former value plus one. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
+
+[role="curriculum-python"]
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[role="curriculum-javascript"]
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). The following is a shorthand method for incrementing (or decrementing) a counter:
+
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[[debuggingtips]]
+=== Debugging Tips
+
+Programming is not only writing code. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
+
+[role="curriculum-python"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+[role="curriculum-javascript"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+Below, we walk through an example of printing variables to help debug a script:
+
+[role="curriculum-python curriculum-mp4"]
+[[video15py]]
+video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video15js]]
+video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
+
+You've seen a list of potential errors in Chapter 1. Here are some other errors that you might encounter:
+
+[role="curriculum-python"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+[role="curriculum-javascript"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+Take a look at <> for a full description of different error types and what you can do to prevent them.
+
+[[musicaltips]]
+=== Musical tips
+
+Now that you have many tools to create your music, like `fitMedia()`, `makeBeat()` and `for` loops, we will look at musical ideas.
+
+Let's start with the *key* of your song:
+
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
+
+++++
+audioMedia/MajorMinor.mp3
+++++
+
+Now let's talk about the different types of tracks you can have. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
+
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
+
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
+
+.PRACTICE
+****
+Create a complete song with:
+
+* A theme (please mention your chosen theme in your commented intro in the code)
+* The `fitMedia()` and `makeBeat()` functions
+* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
+* At least four tracks
+* At least sixteen measures
+* At least one uploaded sound
+* Comments and variables to organize your code
+
+Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
+****
+
+{nbsp} +
+
+[[chapter4summary]]
+=== Chapter 4 Summary
+
+[role="curriculum-python"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[role="curriculum-javascript"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a component of a `for` loop?
+
+[answers]
+* Loop interpreter
+* Loop Counter
+* Loop Body
+* Loop Range
+--
+
+[question]
+--
+Which of the following is NOT a good use of loops in a musical composition?
+
+[answers]
+* Creating a beat pattern than never repeats
+* Placing musical clips on every third measure
+* Repeating a beat on several consecutive measures
+* Placing musical clips on odd measures
+--
+
+[question]
+--
+Which of the following is NOT a recommended technique for debugging?
+
+[answers]
+* Copying and pasting code into Google
+* Printing variable values to the console
+* Looking at error lines identified in the console
+* Asking others for help
+--
+
+[question]
+--
+Which of the following is NOT something that can be printed to the console?
+
+[answers]
+* Code Comments
+* Strings
+* Mathematical Expressions
+* Variables
+--
+
+[question]
+--
+____ is a quality of sound that determines how high or low it sounds.
+
+[answers]
+* Pitch
+* Tempo
+* Rhythm
+* Loudness
+--
\ No newline at end of file
diff --git a/src/locales/ca/v2/mixing-with-conditionals.adoc b/src/locales/ca/v2/mixing-with-conditionals.adoc
new file mode 100644
index 000000000..d41a2af7c
--- /dev/null
+++ b/src/locales/ca/v2/mixing-with-conditionals.adoc
@@ -0,0 +1,363 @@
+[[mixingwithconditionnals]]
+== Mix with Conditionals!
+
+:nofooter:
+
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
+
+[[analyzetrack]]
+=== Use `analyzeTrack()`
+
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Import and run the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+----
+
+You can read in your console that the printed loudness is 0.10306035109110138.
+
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
+
+The `analyzeTrack()` function takes 2 arguments:
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
+
+.PRACTICE
+****
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
+. Add a second track and use the `analyzeTrack()` function to print its loudness in the console. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
+****
+
+The parameter for `analyzeTrack()` can either be `RMS_AMPLITUDE`, to evaluate the loudness, or `SPECTRAL_CENTROID` to analyze the brightness of the sound. We'll focus on analyzing loudness in this chapter.
+
+[[booleansandcomparisons]]
+=== Booleans and comparisons
+
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
+
+[role="curriculum-python"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `True` and `False`. `True` and `False` start with a capital letter and do not have quotes.
+
+[role="curriculum-javascript"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `true` and `false`. `true` and `false` start with a lower-case letter and do not have quotes.
+
+[role="curriculum-python"]
+--
+To create a boolean, you can either initialize a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|==
+|is equal to
+
+|!=
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-javascript"]
+--
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|===
+|is equal to
+
+|!==
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
+
+// this video will be cut at 2' to delete the section about boolean operators//
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `true` if the first track is louder than the second track, and `false` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+----
+
+[role="curriculum-python"]
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
+
+[role="curriculum-javascript"]
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
+
+[[conditionalstatements]]
+=== Conditional Statements
+
+What is a conditional statement? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
+
+Below is an example of conditional statement, note the similarity with a for loop:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
+----
+
+.PRACTICE
+****
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+----
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
+----
+
+[[mixingyourtracks]]
+=== Mix your tracks
+
+Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
+****
+
+Let's review some vocabulary:
+
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
+
+Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter6summary]]
+=== Chapter 6 Summary
+
+[role="curriculum-python"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `True` and `False`.
+* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
+
+[role="curriculum-javascript"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `true` and `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `true` or `false`.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following elements is a boolean?
+
+[answers]
+* `5+4 === 5`
+* `measure = 1`
+* `2<3<4`
+* `False()`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[question]
+--
+What is mixing?
+
+[answers]
+* adapting the volume of each track so they sound well balanced
+* adapting the pitch of each track so they sound well balanced
+* adding a fade in
+* adding a fade out
+--
+
+[question]
+--
+How many conditions can you check in a conditional statement?
+
+[answers]
+* any number of conditions
+* 1 condition
+* 2 conditions
+* 3 conditions
+--
\ No newline at end of file
diff --git a/src/locales/ca/v2/optional.adoc b/src/locales/ca/v2/optional.adoc
new file mode 100644
index 000000000..1d412d2ad
--- /dev/null
+++ b/src/locales/ca/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/ca/v2/reference.adoc b/src/locales/ca/v2/reference.adoc
new file mode 100644
index 000000000..d08f7ea27
--- /dev/null
+++ b/src/locales/ca/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effects, Errors, and EarSketch Functions
+
+:nofooter:
+
+In this unit you will find references to all effects, errors and EarSketch API functions.
\ No newline at end of file
diff --git a/src/locales/ca/v2/unit-1.adoc b/src/locales/ca/v2/unit-1.adoc
new file mode 100644
index 000000000..7f48189fe
--- /dev/null
+++ b/src/locales/ca/v2/unit-1.adoc
@@ -0,0 +1,18 @@
+[[unit1]]
+== Unit 1: Compose and Add Beats
+
+:nofooter:
+
+In this unit you will learn how EarSketch works, you will place sounds (clips) into your music, debug your code, customize your song, and add beats based on your musical genre.
+
+Anyone (especially you) can learn to program! Like learning a musical instrument, it takes consistent practice to make progress. Don't get discouraged if you get stuck, this is part of the process. Ask for help in your class or look online if needed.
+
+We wish you the best of luck, and before you start here's an example of what you can do with EarSketch:
+
+[role="curriculum-python curriculum-mp4"]
+[[video1livepy]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video1livejs]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-JS.mp4[]
\ No newline at end of file
diff --git a/src/locales/ca/v2/unit-2.adoc b/src/locales/ca/v2/unit-2.adoc
new file mode 100644
index 000000000..d4fd5122b
--- /dev/null
+++ b/src/locales/ca/v2/unit-2.adoc
@@ -0,0 +1,6 @@
+[[unit2]]
+== Unit 2: Loops, Effects, Mixing
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/ca/v2/unit-3.adoc b/src/locales/ca/v2/unit-3.adoc
new file mode 100644
index 000000000..9f3f26d37
--- /dev/null
+++ b/src/locales/ca/v2/unit-3.adoc
@@ -0,0 +1,8 @@
+[[unit3]]
+== Unit 3: Structure your Songs
+
+:nofooter:
+
+Now that you have many tools to create your song, add effects and mix your tracks, we will be looking at the song's structure. We'll be using custom functions for that: these are functions that you will create yourself!
+
+We will also look at user inputs and how they can be embedded in your code to create personalize songs. Finally, we'll see how you can use data structures to simplify your code.
\ No newline at end of file
diff --git a/src/locales/ca/v2/welcome.adoc b/src/locales/ca/v2/welcome.adoc
new file mode 100644
index 000000000..f89bcfba2
--- /dev/null
+++ b/src/locales/ca/v2/welcome.adoc
@@ -0,0 +1,26 @@
+[[welcome]]
+== Welcome Students and Teachers!
+
+:nofooter:
+
+Welcome to EarSketch!
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
+
+*Students*: Continue below to learn more about EarSketch
+
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
+
+[role="curriculum-mp4"]
+[[video0]]
+video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
+
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+Maybe you'll become a legendary music producer or the industry's most sought-after recording engineer! We wish you good luck on your EarSketch journey.
+
+Click on the right arrow at the top of this text to get started.
+
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/ca/v2/your-first-song.adoc b/src/locales/ca/v2/your-first-song.adoc
new file mode 100644
index 000000000..4e9f6aa2f
--- /dev/null
+++ b/src/locales/ca/v2/your-first-song.adoc
@@ -0,0 +1,290 @@
+[[customizeyourfirstsong]]
+== Customize your first song
+
+:nofooter:
+
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
+
+[[settempo]]
+=== The `setTempo()` function
+
+[role="curriculum-python"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+[role="curriculum-javascript"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. To change the tempo, just change the number between the parentheses of the `setTempo()` function. The higher the tempo, the faster your music. You can select a tempo between _45bpm and 220bpm_.
+
+.PRACTICE
+****
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
+****
+
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
+
+[cols="^3*"]
+|===
+|GENRE |BPM |EXAMPLE
+
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
+|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
+|===
+
+.PRACTICE
+****
+. Select one artist you really like and find out what genre they belong to.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
+****
+
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
+
+[[comments]]
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
+
+[role="curriculum-python"]
+In Python, comments are indicated by a line starting with a pound `#` symbol.
+
+[role="curriculum-javascript"]
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
+
+.PRACTICE
+****
+In your current script, write a comment with a description of your song on the first line.
+****
+
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/your-first-song-comments.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/your-first-song-comments.js.txt[]
+----
+
+{nbsp} +
+
+[[uploadingsounds]]
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
+
+You must be logged in to upload sounds.
+
+Let's explore the first three options.
+
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
+
+[role="curriculum-mp4"]
+[[video101rec]]
+video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
+
+.PRACTICE
+****
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
+****
+
+An active computer program is called a *process*.
+
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
+
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
+
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
+
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
+
+Let's examine recording a sound into EarSketch as an example process. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
+
+Check out the following supplementary video:
+
+[role="curriculum-mp4"]
+[[video11cpu]]
+video::./videoMedia/010-02-ProcessesandMemory-PY-JS.mp4[]
+
+////
+END OF OPTIONAL
+////
+
+[[copyright]]
+=== Use Copyright Wisely
+
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
+
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
+
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
+
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
+
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
+
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
+
+[[chapter2summary]]
+=== Chapter 2 Summary
+
+[role="curriculum-python"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[role="curriculum-javascript"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does `setTempo()` allow you to do in EarSketch?
+
+[answers]
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
+--
+
+[question]
+--
+What is the unit for tempo?
+
+[answers]
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
+--
+
+[question]
+--
+What can you use comments for?
+
+[answers]
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
+--
+
+[question]
+--
+Which of the following statements is true?
+
+[answers]
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
+--
+
+[question]
+--
+How do you get a copyright?
+
+[answers]
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
+--
+
+[question]
+--
+What is a music license?
+
+[answers]
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/de/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/de/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/de/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/de/v1/every-effect-explained-in-detail.adoc b/src/locales/de/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..f52da48f9
--- /dev/null
+++ b/src/locales/de/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTER
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/de/v1/every-error-explained-in-detail.adoc b/src/locales/de/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..9b0dfc157
--- /dev/null
+++ b/src/locales/de/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*.
+
+The process of finding and fixing bugs is called *debugging*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/de/v1/the-earSketch-api.adoc b/src/locales/de/v1/the-earSketch-api.adoc
new file mode 100644
index 000000000..90e09c349
--- /dev/null
+++ b/src/locales/de/v1/the-earSketch-api.adoc
@@ -0,0 +1,6 @@
+[[ch_27]]
+== The EarSketch API
+
+:nofooter:
+
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/de/v2/add-beats.adoc b/src/locales/de/v2/add-beats.adoc
new file mode 100644
index 000000000..3757cb508
--- /dev/null
+++ b/src/locales/de/v2/add-beats.adoc
@@ -0,0 +1,339 @@
+[[addsomebeats]]
+== Add some Beats!
+
+:nofooter:
+
+In this chapter you will learn how to make your own beats! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
+
+[[variables]]
+=== Variables
+
+[role="curriculum-python curriculum-mp4"]
+[[video2py]]
+video::./videoMedia/002-05-Variables-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video2js]]
+video::./videoMedia/002-05-Variables-JS.mp4[]
+
+What is a variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
+
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
+
+To use a variable,
+
+[role="curriculum-python"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. You can only use the variable after it has been assigned, not before. For example, write `fitMedia(synth1, 1, 1, 3)`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-javascript"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. We also use the command `var` at the beginning of the line. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. For example, write `fitMedia(synth1, 1, 1, 3);`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-instead-of-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-instead-of-this.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+In your previous scripts, use variables to store your sound constants. Look at the examples below for help. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-variables.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-variables.js.txt[]
+----
+
+Note that it's important to name your variable in an understandable and descriptive way. For example, specify `synth1` instead of `music1` or `test`, which don't provide any information. This way, when you or someone else reads your code, they can see what you are referring to.
+
+A *constant* is similar to a variable because it stores values. However, the value of a constant never changes. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. By convention, constant names are capitalized and use underscores instead of spaces.
+
+[[drumbeatstrings]]
+=== Beat Strings
+
+Let's first learn some basic concepts about rhythm:
+
+* *Rhythm* is a pattern of sound, often repeated.
+* The *tempo* is the speed of the music in BPM (beats per minute).
+* A *beat* is like the "steady pulse" of a song. When members of an audience clap their hands in a concert, they're clapping on the beat.
+* A *measure* is a musical time unit with a predetermined number of beats. In EarSketch, 1 *measure* is 4 beats long. Since there are 4 beats in 1 measure, beats are also called *quarter (1/4) notes*.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. When you are counting 1/4 notes, you say "1, 2, 3, 4...." When counting 1/8 notes, you can use "ands": "1 and 2 and 3 and 4 and...."
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Note that the sum of all notes in one measure must be equal to 1. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* A *metronome* helps the musician set the rhythm of his or her piece by making a clicking noise on the beat. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
+
+[[imediameasurepng]]
+.A measure
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
+
+[[imediabeatpng]]
+.A beat
+[caption="Figure 3.2.2: "]
+image::../media/U1P1/beat.png[A beat]
+
+[[imediasixteenthnotepng]]
+.A sixteenth note
+[caption="Figure 3.2.3: "]
+image::../media/U1P1/sixteenthnote.png[A sixteenth note]
+
+.PRACTICE
+****
+Listen to your favorite song, and try to clap on the beat. You can do this exercise with your neighbor.
+****
+
+We'll compose each of our rhythms in a *beat* string.
+
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
+
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` starts playing the percussive sound clip (one hit of the drum, for example).
+* `+` extends the audio clip into the next sub-beat. It always follows a `0` or `+`.
+* `-` is a rest, meaning silence.
+
+.PRACTICE
+****
+For each of the following drumbeat strings, try clapping on the zeros. Then listen to the corresponding audio and verify if you were right. This exercise will help you understand how the drumbeat strings work.
+****
+
+Here are some examples of 1-measure beat strings:
+
+Quarter notes: `"0\+++0+++0\+++0+++"`
+(read: "1, 2, 3, 4")
+
+++++
+audioMedia/beatString1.mp3
+++++
+
+Eighth notes: `"0+0+0+0+0+0+0+0+"`
+(read: "1 and 2 and 3 and 4")
+
+++++
+audioMedia/beatString11.mp3
+++++
+
+Sixteenth notes: `"0000000000000000"`
+(that's very fast, depending on the tempo)
+
+++++
+audioMedia/beatString12.mp3
+++++
+
+`"0-0-0---0-0-0---"`
+(read: "1 and 2, 3 and 4")
+
+++++
+audioMedia/beatString2.mp3
+++++
+
+`"0---0---0-0-0---"`
+(read: "1, 2, 3 and 4")
+
+++++
+audioMedia/beatString3.mp3
+++++
+
+`"0---0---0---0000"`
+(read: "1, 2, 3, 4 e and a")
+
+++++
+audioMedia/beatString4.mp3
+++++
+
+{nbsp} +
+
+////
+ADDITIONAL VIDEO TO BE ADDED
+See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+video revamping tab
+////
+
+[[makebeat]]
+=== The `makeBeat()` function
+
+Now let's see how you can make your own beat. Here we use the term "beat" as a shorthand for drumbeat: a repeated rhythmic pattern of percussive sounds. We will use the `makeBeat()` function, with 4 arguments:
+
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
+
+Let's see more details with this video:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12py]]
+video::./videoMedia/3_3_makebeat_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12js]]
+video::./videoMedia/3_3_makebeat_js.mp4[]
+
+Here is the example shown in the video:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-multi-beat.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-multi-beat.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new `beatString1` variable, a 16-character string with the characters `"0"`, `"+"`, and `"-"`.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
+Please note that:
+
+. You should assign your variables with the `=` symbol before using them.
+. Just like `fitMedia()`, the `makeBeat()` function starts with a lowercase letter (`m`) and has an uppercase letter in the middle (`B`).
+. Just like `fitMedia()`, the `makeBeat()` function has 4 parameters separated by commas.
+
+When you hear your music, if you don't like your first version, tweak your beat to make it sound better and better, until you like what you have.
+****
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. You can either play them simultaneously, on two different tracks, or one after the other on one single track.
+****
+
+[[beatsandgenres]]
+=== Create a beat based on your musical genre
+
+Now that you've started working with `makeBeat()` and beat strings, let's explore some basic beat patterns that you can use.
+You've learned that a musical genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Similarly, some genres have signature beat patterns. Below are some examples:
+
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
+
+Here is the corresponding code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-examples-of-beats.js.txt[]
+----
+
+[[chapter3summary]]
+=== Chapter 3 Summary
+
+* In EarSketch, 1 measure is divided into 4 beats, or 4 quarter notes. 1 beat is divided into 4 sixteenth notes.
+* *Variables* create a space in computer memory to store data.
+* You first need to assign the value (data) to the variable name using the sign `=`. Then you can use the variable by writing its name in the code.
+* A *string* is a data type that consists of a series of characters encapsulated by single or double quotes.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Strings are used with the `makeBeat()` function to create rhythmic patterns in EarSketch. `makeBeat()` takes a beat string to define each sixteenth note of its pattern. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` takes four arguments:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these options is a string?
+
+[answers]
+* "Five"
+* 5
+* FIVE
+* Five
+--
+
+[question]
+--
+What does "0" represent in a beat pattern string?
+
+[answers]
+* Start playing the clip
+* Rest
+* Extend the clip
+* End the clip
+--
+
+[question]
+--
+In EarSketch, one measure is...
+
+[answers]
+* 4 beats long
+* 4 sub-beats long
+* 16 beats long
+* 1 quarter note
+--
+
+[question]
+--
+One sixteenth note is...
+
+[answers]
+* a quarter of a quarter note
+* half a beat
+* a quarter of a measure
+* 1 measure
+--
+
+[question]
+--
+To use the `makeBeat()` function, what is the order of parameters you need to provide?
+
+[answers]
+* clip name, track, start measure, beat string
+* tempo, track, start measure, end measure
+* clip name, start measure, end measure, beat string
+* beat string, track, start measure, clip name
+--
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/de/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..6788ccea1
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // This is the "boom" sound.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/de/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..39b8de864
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # This is the "boom" sound.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # This is the "ts" sound.
+
+# Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/de/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/de/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/de/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..2bbded58b
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Setup
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/de/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..02f305a40
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-variables.js.txt b/src/locales/de/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..892e9ee9e
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Setup
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/add-beats-variables.py.txt b/src/locales/de/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..615531008
--- /dev/null
+++ b/src/locales/de/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/de/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..b47ffdbce
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/de/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..8bfd9ef2b
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/de/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..f17f7606e
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/de/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..2bb8b3f8e
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/de/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/de/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..fe86e34c5
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Setup
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..5e0318ee0
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..b193b59d7
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Setup
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..7c13d7605
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Setup
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..fc4ac0026
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Setup
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..02b9bf3fd
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/de/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/de/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/de/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/de/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..5393649b3
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Setup
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/de/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..e7bcaac25
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-arrays.js.txt b/src/locales/de/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..6f979e08f
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/de/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..fc1a83742
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/de/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..35d2a3f43
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/de/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/de/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/de/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..c3be55257
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/de/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..ddb76404f
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-list.py.txt b/src/locales/de/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c6cfcd632
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/de/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..0ccfffc88
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Setup
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/de/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..9747b5b4a
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/de/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..81e2dbe01
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Setup
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/de/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dae36a455
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/de/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..5fbe4a7ac
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Setup
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/de/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..91f9bf807
--- /dev/null
+++ b/src/locales/de/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..1aaddaf46
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..3c2ae73a2
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..cd446e98c
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Setup
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..ca104ee90
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..a639ba4f0
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..0da37e8be
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..d123caa9a
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Setup
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..b0902254f
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..7221572eb
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..1b2cc9748
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..f5b833522
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Setup
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/de/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..00ff28b70
--- /dev/null
+++ b/src/locales/de/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/de/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..013470826
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Setup
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/de/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/de/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..8979b5185
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Setup
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/de/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/de/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..02ab97eb8
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/de/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..ce6ff834d
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/de/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..998a9d803
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/de/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..c735d5b8f
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/de/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..687c5da0f
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Setup
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/de/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..d1fb96a5c
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/de/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/de/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/de/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..93ca1ae9d
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Setup
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/de/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..ef85ce675
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Setup
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/de/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..67ba71708
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Setup
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/de/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..d7cf9db54
--- /dev/null
+++ b/src/locales/de/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/de/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/de/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/de/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/de/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/de/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/de/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/de/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..1f9f0fea3
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/de/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..64a5b22b0
--- /dev/null
+++ b/src/locales/de/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/de/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/de/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/de/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/de/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..91f3bdf73
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/de/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..95b76a723
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/de/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..355a11de2
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/de/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..f15821b9e
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/de/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..dfe4c8900
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/de/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..903928096
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Setup
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/de/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..c5595e80f
--- /dev/null
+++ b/src/locales/de/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..79b65068e
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Setup
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..9d1438f4b
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..a0f162eeb
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..14b374cc9
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..9d8960e5c
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Setup
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..b2ac152d1
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..479e0e3fd
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..98ff5f56b
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/de/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/your-first-song-comments.js.txt b/src/locales/de/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..d25a49cec
--- /dev/null
+++ b/src/locales/de/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Setup
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/de/v2/code-examples/your-first-song-comments.py.txt b/src/locales/de/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..a077c3b76
--- /dev/null
+++ b/src/locales/de/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/de/v2/custom-functions.adoc b/src/locales/de/v2/custom-functions.adoc
new file mode 100644
index 000000000..748232c60
--- /dev/null
+++ b/src/locales/de/v2/custom-functions.adoc
@@ -0,0 +1,285 @@
+[[customfunctionssongstructure]]
+== Custom Functions and Song Structure
+
+:nofooter:
+
+The song structure is the song's organization over time. The goal is to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own function, custom functions, to structure your songs!
+
+[[asongsstructure]]
+=== A song's structure
+
+:nofooter:
+
+A song can be divided into *sections*. A section is made up of several measures (musical time units), and it expresses an idea or feeling. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
+
+A common and simple *form*, or song structure, is ABA. A and B are two different sections, for example chorus and verse. The B section adds variety, while returning to the A section invokes familiarity. The code below creates an ABA form. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
+
+[[imediau2sections_052016png]]
+.An ABA form within the EarSketch DAW
+[caption="Figure 9.2: "]
+image::../media/U2/sections_052016.png[Alt Text]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Select a song that you like. Listen to it and try to notice the different sections. Can you tell when the musicians change sections? How many times do you hear the chorus and verse? What kind of contrasts can you observe? Share your example with your neighbor.
+****
+
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
+
+[[creatingyourcustomfunctions]]
+=== Create your custom functions
+
+In the previous example with the ABA song, the code is large, and the code is repeated for the second A section. There is a way to be more concise, thanks to *custom functions*! We will define a function that will represent section A, then call the function twice.
+
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. Here is how you would define section A:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-untitled1.js.txt[]
+----
+
+. `sectionA()` is the name we chose for our function. You can choose any name you like. Try to name your function in a descriptive way so your code is easier to read.
+. The instructions are the *body* of the function. They are indented.
+
+.PRACTICE
+****
+Paste this code in a new script, and run it. You should see that your DAW remains empty.
+That's because you need to *call* a function to use it.
+To call your function, add the line `sectionA()`, unindented, after your function definition. When running the code, you should see section A in your DAW
+****
+
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. To remedy this issue, we will create *parameters* for our function.
+
+.PRACTICE
+****
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. When you call your function, add the parameters `1` and `5` between the parentheses. Run the code to make sure there is no error.
+1. Add a second function call, this time with the parameters `9` and `13`. Run the code to make sure there is no error.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
+****
+
+Here is what your code could look like:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+----
+
+//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
+
+[role="curriculum-python curriculum-mp4"]
+[[video93py]]
+video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video93js]]
+video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
+
+[[transitionstrategies]]
+=== Transition Strategies
+
+Now that you know how to create custom functions to structure your song, let's look at transitions. *Transitions* help one section smoothly go into the next. They can connect verse and chorus, build up to a drop, mix between tracks (DJing), or change keys. The goal of a transition is to grab the listener's attention and let them know a change is about to occur.
+
+Following are some popular strategies for creating musical transitions:
+
+. *Crash Cymbal*: Placing a crash cymbal on the first beat of a new section.
+. *Drum Fill*: A rhythmic variation to fill the gap before a new section.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Melody Variation*: Introducing a variation of the chords, bass line, or melody before the new section. Often, a folder within the EarSketch sound library contains variations of a similar riff.
+. *Riser*: A note or noise that increases in pitch. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. You can use the search term "riser" in the Sound Browser. A reversed crash cymbal can be used as a riser, like YG_EDM_REVERSE_CRASH_1.
+. *Snare Roll*: A sequence of repeated snare hits, with increasing density, pitch, or amplitude. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping*: Repeating a short segment of melody before a new section.
+. *Crossfading*: Decreasing the volume of one section while increasing the volume of a new section.
+. *Anacrusis*: When the melody of the new section starts a couple beats early.
+
+.PRACTICE
+****
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. You can work in pairs. Once you've thought about it, you can have a look at the examples below.
+
+The transition should be placed one or two measures before the new section. You can use several transition techniques at the same time.
+****
+
+Drum fills:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+----
+
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. An example is shown below.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+----
+
+The next example uses multiple risers and a crash cymbal during the transition.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
+----
+
+{nbsp} +
+
+[[yourfullsong]]
+=== Your full song
+
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. Functions are one kind of abstraction used in computer science. They pack multiple statements into one tool so they can be easily referred to. Abstractions can make the form of a program clearer.
+
+.PRACTICE
+****
+Let's create a full song using all the tools you've discovered in EarSketch! Here is a suggestion of how to work, but you can adapt it as you like:
+
+. Choose a theme for your song. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. Then select a simple structure.
+. And finally, start coding! Start with some `fitMedia()` functions to select sounds.
+. Use `makeBeat()` to add some percussion.
+. You can upload your own sounds.
+. Use `for` loops to reduce repetition in your code.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
+. Add one or several conditional statements.
+. Make sure you use variables to store some information such as sound constants.
+. Make sure you use comments to explain what you are doing.
+. Don't forget to regularly run your code and listen to your song. This will help you modify it until you like the sound of it.
+. Choose a name for your song.
+****
+
+Here is an example of a full song:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+----
+
+In this example, we have used a `for` loop inside a custom function! We have used parameters of the function (`start` and `end`) inside the for loop.
+
+[[chapter7summary]]
+=== Chapter 7 Summary
+
+* *Sections* are related musical units consisting of multiple measures. Each expresses an idea or feeling.
+* *Transitions* are passages of music used to connect consecutive musical sections.
+* The structure and variety found within a song is known as its *form*. A common musical form is A-B-A.
+* *Custom functions* are unique functions written by the programmer to accomplish a specific task. You have to create a custom function to be able to call it. You can create as many parameters as you want.
+* An *abstraction* is the bundling of ideas to form a single, often less complex, concept. Functions are an example of abstraction.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these is NOT an example of a musical section?
+
+[answers]
+* Drums
+* Intro
+* Verse
+* Chorus
+--
+
+[question]
+--
+What is an abstraction?
+
+[answers]
+* A bundling of ideas to form a single concept
+* A variety of sounds throughout sections
+* Parts of a song that are related, but also are distinct from each other
+* A statement that returns a value to the function call
+--
+
+[role="curriculum-python"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
+* `myFunction(2, 5)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
+* `myFunction(2, 5)`
+--
+
+[question]
+--
+Which of these is NOT an example of a transition?
+
+[answers]
+* Melody Consistency
+* Crash Cymbal
+* Riser
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/de/v2/data-structures.adoc b/src/locales/de/v2/data-structures.adoc
new file mode 100644
index 000000000..392a3b3e5
--- /dev/null
+++ b/src/locales/de/v2/data-structures.adoc
@@ -0,0 +1,497 @@
+[[getorganizedwithdatastructures]]
+== Data Structures
+
+:nofooter:
+
+[role="curriculum-python"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called lists, and a new functionality of `makeBeat()`.
+
+[role="curriculum-javascript"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called arrays, and a new functionality of `makeBeat()`.
+
+[[datastructures]]
+=== What is a Data Structure
+
+[role="curriculum-python"]
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-javascript"]
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
+----
+
+[role="curriculum-python"]
+If you have replaced variables with a list, how will you reference the content of the list? We use indices. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+[role="curriculum-javascript"]
+If you have replaced variables with an array, how will you reference the content of the array? We use indices. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+.PRACTICE
+****
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-list.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-arrays.js.txt[]
+----
+
+//.The EarSketch Share window for collaboration (Let Others Edit)
+
+//[caption="Figure 21.4.2: "]
+
+image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
+
+[role="curriculum-python"]
+We've seen that `list[index]` will reference an element of the list. This can also be used to modify an element of the list. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+[role="curriculum-javascript"]
+We've seen that `array[index]` will reference an element of the array. This can also be used to modify an element of the array. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+.PRACTICE
+****
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. You can use the track number as the counter.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
+****
+
+Below is an example. You can have a look in the console to see what is printed when you run the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
+----
+
+[role="curriculum-python"]
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-javascript"]
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-additive-introduction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-additive-introduction.js.txt[]
+----
+
+{nbsp} +
+
+[[usingdatastructureswithmakebeat]]
+=== Use Data Structures with `makeBeat()`
+
+[role="curriculum-python"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
+
+[role="curriculum-javascript"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
+
+[role="curriculum-python"]
+* Like lists, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[role="curriculum-javascript"]
+* Like arrays, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[cols="h,^,^,^,^,^,^,^,^,^"]
+|===
+|Character
+|E
+|a
+|r
+|S
+|k
+|e
+|t
+|c
+|h
+
+|Index
+|0
+|1
+|2
+|3
+|4
+|5
+|6
+|7
+|8
+|===
+
+[role="curriculum-python"]
+* You can concatenate lists together like you do with strings. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
+
+[role="curriculum-javascript"]
+* You can concatenate arrays together like you do with strings. We use the `concat` *method*. A method is similar to a function as it has parentheses which contain parameters. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
+
+[role="curriculum-python"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
+
+[role="curriculum-javascript"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your lists.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your arrays.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+Here is an example of a solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
+----
+
+This is an example of how you can use string operations with `makeBeat()`:
+
+[role="curriculum-python curriculum-mp4"]
+[[video13py]]
+video::./videoMedia/013-03-Substrings-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video13js]]
+video::./videoMedia/013-03-Substrings-JS.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-operations.js.txt[]
+----
+
+[role="curriculum-python"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-javascript"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Copy the code example in chapter 3.4 for beats by genre. Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
+****
+
+Here is the solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-examples-of-beats.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. You can refer to the video in chapter 3.4 for beats by genre. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
+****
+
+{nbsp} +
+
+[[evaluatingcorrectness]]
+=== Evaluate Correctness
+
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Here are some elements that you can check:
+
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Here are some questions that can help you make your code more concise:
+** Did I copy/paste function calls several times in a row? If so, simplify with a loop!
+** Am I reusing any blocks of code? If so, put them in a function!
+** Are there sound constants or mathematical expressions that I use repeatedly throughout my code? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. If your peers are getting lost or confused by your code, it is probably unclear. Here are some questions to help you make your code clear:
+** Are the names of my variables and functions descriptive? If not, rename them.
+** Have I used comments to explain each block of code and any potentially confusing lines of code?
+** Have I used computational structures like custom functions and loops to help organize my code?
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
+
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. When giving feedback:
+
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
+
+Likewise, when receiving feedback:
+
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. This will allow your peers to provide feedback that is most helpful to you.
+* *Listen* - Wait to respond until your peer has finished speaking. Be attentive to the information your peer is conveying. Comment your code based on their feedback. These comments can be useful when revising.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in a list.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in an array.
+****
+
+[[chapter9summary]]
+=== Chapter 9 Summary
+
+[role="curriculum-python"]
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Items stored within a list, or elements, can be any data type.
+* Like strings, list elements get assigned an index. List indices start at 0.
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[role="curriculum-javascript"]
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
+* Like strings, array elements get assigned an index. Array indices start at 0.
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following operations is used to join lists/arrays?
+
+[answers]
+* Concatenation
+* Slicing
+* Combination
+* Addition
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the index number of the first element of a list in Python?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What does `len(myList)` return?
+
+[answers]
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
+[answers]
+* `listA + listB`
+* `listA ++ listB`
+* `listA and listB`
+* `listB + listA`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How can you get a list from oldList without the first and last elements?
+
+[answers]
+* `oldList[1:len(oldList) - 1]`
+* `oldList[1:len(oldList)]`
+* `oldList[0:len(oldList)]`
+* `oldList[2:len(oldList - 1)]`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the index number of the first element of an array in Javascript?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What does `myArray.length` return?
+
+[answers]
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
+[answers]
+* `arrayA.concat(arrayB)`
+* `arrayA.concatenate(arrayB)`
+* `arrayB.concat(arrayA)`
+* `arrayB.concatenate(arrayB)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How can you get an array from `oldArray` without the first and last elements?
+
+[answers]
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
+--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/de/v2/effects-and-envelopes.adoc b/src/locales/de/v2/effects-and-envelopes.adoc
new file mode 100644
index 000000000..92b9ab79b
--- /dev/null
+++ b/src/locales/de/v2/effects-and-envelopes.adoc
@@ -0,0 +1,321 @@
+[[effectsandenvelopes]]
+== Effects and Envelopes
+
+:nofooter:
+
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
+
+[[effectsinearsketch]]
+=== Use Effects in EarSketch
+
+:nofooter:
+
+*Effects* allow us to change qualities of sounds. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
+
+[role="curriculum-python curriculum-mp4"]
+[[video4py]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video4js]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
+
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
+
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+
+.PRACTICE
+****
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
+****
+
+Here is an example below:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
+----
+
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
+
+No effect:
+
+++++
+audioMedia/reference.mp3
+++++
+
+Delay effect:
+
+++++
+audioMedia/delay2.mp3
+++++
+
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
+
+.PRACTICE
+****
+. Read about the delay effect in the list of effects chapter here: <>
+. Then run the code below and listen to the music without effects
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
+----
+
+{nbsp} +
+
+[[functionsandmoreeffects]]
+=== Functions and more effects
+
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Note that the function names always start with a lower-case letter, and are often a verb. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
+
+[role="curriculum-python"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+[role="curriculum-javascript"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
+
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
+
+Now, let's play more with the `setEffect()` function. The following video shows how to use some effects:
+
+////
+VIDEO IS BEEING MADE
+more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+("videos revamping" tab)
+////
+
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
+
+Listen to the clips below to hear the result of adding reverb to a track:
+
+No effect:
+
+++++
+audioMedia/reverbReference.mp3
+++++
+
+Reverb effect:
+
+++++
+audioMedia/reverbEffect.mp3
+++++
+
+{nbsp} +
+
+.PRACTICE
+****
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
+****
+
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
+
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
+
+*Envelopes* allow us to define how an effect changes over time.
+
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
+
+[[envelopepoints]]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
+image::../media/U2/NewEnvelope.png[Alt Text]
+
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
+
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
+
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
+
+Here is an example of fade in:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
+----
+
+Now watch this video for other envelope examples
+
+[role="curriculum-python curriculum-mp4"]
+[[video5b]]
+video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript curriculum-mp4"]
+video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new song. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
+****
+
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+----
+
+And here is an example of fade in and fade out on all the tracks:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter5summary]]
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does an effect allow you to do in EarSketch?
+
+[answers]
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
+--
+
+[question]
+--
+Which of these is NOT a `setEffect()` argument?
+
+[answers]
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
+--
+
+[question]
+--
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
+[answers]
+* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
+* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
+* `fitMedia(DELAY, 3, DELAY_TIME, 50.0)`
+* `setEffect(50, DELAY_FEEDBACK, 1)`
+--
+
+[question]
+--
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
+[answers]
+* Clip Length
+* Start Value
+* Track Number
+* Effect
+--
+
+[question]
+--
+What would the following `setEffect()` function do?
+
+[source,python]
+----
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
+----
+
+[answers]
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/de/v2/get-user-input.adoc b/src/locales/de/v2/get-user-input.adoc
new file mode 100644
index 000000000..27edbca84
--- /dev/null
+++ b/src/locales/de/v2/get-user-input.adoc
@@ -0,0 +1,391 @@
+[[getuserinput]]
+== Get User Input
+
+:nofooter:
+
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. For that, we'll look at return statements and the `readInput()` function.
+
+[[returnstatement]]
+=== Return Statement
+
+Watch this video first:
+
+[role="curriculum-python curriculum-mp4"]
+[[video131py]]
+video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video131js]]
+video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
+
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. B. signals the function to stop. If you have any statements after the `return` keyword, they will be ignored.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
+
+Here is a code example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements.js.txt[]
+----
+
+With the return statement, the complete control flow for a function looks like this:
+
+[[return]]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
+image::../media/U2/Return.png[Alt Text]
+
+.PRACTICE
+****
+Create a function that will implement a musical section with:
+
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
+
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
+
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
+
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
+
+Then call the function at different measures with different variations.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-conditional-statement.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-conditional-statement.js.txt[]
+----
+
+{nbsp} +
+
+[[userinput]]
+=== Get User Input
+
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. The `readInput()` function returns what the user types there.
+
+For example, copy the following code in a new script, and run it:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-untitled1.js.txt[]
+----
+
+We might need to convert the returned user input into a different data type. Here are useful functions:
+
+[role="curriculum-python"]
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
+
+[role="curriculum-javascript"]
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
+
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-1.js.txt[]
+----
+
+Here is another example of what you can do with user input.
+
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ask for a user input to modify something in your song.
+
+Here are ideas of tools you can use:
+
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
+****
+
+{nbsp} +
+
+[[booleanlogic]]
+=== Boolean Logic
+
+We will now combine boolean logic and user input for another example of user interaction.
+
+[role="curriculum-python"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
+
+[role="curriculum-javascript"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
+
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
+
+[role="curriculum-python"]
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
+
+[role="curriculum-javascript"]
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
+
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `True` or `False`?
+
+* `not True`
+* `True and False`
+* `True or False`
+* `True and True`
+* `(True and False) or True`
+* `True and not False`
+* `not (False or False)`
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `true` or `false`?
+
+* `!true`
+* `true && false`
+* `true || false`
+* `true && true`
+* `(true && false) || true`
+* `true && !false`
+* `!(false || false)`
+****
+
+Use the following code to print the answers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
+----
+
+Here is a reminder of boolean creation, and some examples of boolean operations:
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+
+.PRACTICE
+****
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-operations.js.txt[]
+----
+
+{nbsp} +
+
+.CHALLENGE
+****
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
+****
+
+{nbsp} +
+
+[[chapter8summary]]
+=== Chapter 8 Summary
+
+[role="curriculum-python"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[role="curriculum-javascript"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following would be considered an example of data type conversion?
+
+[answers]
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Using `readInput()` to ask a user for a genre.
+* Producing a Boolean through a comparison operator.
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+not (True and (4 > 5))
+----
+
+[answers]
+* `True`
+* `5`
+* `4`
+* `False`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+!(true && (4 > 5));
+----
+
+[answers]
+* `true`
+* `4`
+* `false`
+* `5`
+--
+
+[question]
+--
+Which of the following is an example of concatenation?
+
+[answers]
+* `x = beatstring1 + beatstring2`
+* `x = beatstring1.beatstring2`
+* `x = (beatstring1, beatstring2)`
+* `x = beatstring1[beatstring2]`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How would you obtain the boolean True with the booleans True and False?
+
+[answers]
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How would you obtain the boolean true with the booleans true and false?
+
+[answers]
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/de/v2/getting-started.adoc b/src/locales/de/v2/getting-started.adoc
new file mode 100644
index 000000000..c90f659c1
--- /dev/null
+++ b/src/locales/de/v2/getting-started.adoc
@@ -0,0 +1,386 @@
+[[getstartedwithearsketch]]
+== Getting Started with EarSketch
+
+:nofooter:
+
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
+
+[[discoverearsketch]]
+=== Discover EarSketch
+
+:nofooter:
+
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
+
+////
+TODO: upload video
+////
+
+As you become familiar with EarSketch these are the main panels.
+
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
+
+{nbsp} +
+
+_What is a DAW?_
+
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
+
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
+
+EarSketch is DAW that allows you to create music by writing code.
+
+Here is how to make full use of the DAW:
+
+[role="curriculum-mp4"]
+[[video1b]]
+video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-intro-script.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-intro-script.js.txt[]
+----
+
+{nbsp} +
+
+[[createanewscript]]
+=== Create your first script!
+
+Let's see how to create a script from scratch.
+
+. *Create.* In the editor tabs, click the white "+" icon.
++
+If this is your first script, click the large blue text "Click here to create a new script!"
++
+[[newscriptplus]]
+.Create a new script, open scripts
+[caption="Figure 1.2.1: "]
+image::../media/U1P1/NewScriptPlus.png[Alt Text]
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
++
+[[newscriptpromptpy]]
+.The create a new script dialog box
+[role="curriculum-python"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
+[[newscriptpromptjs]]
+.The create a new script dialog box
+[role="curriculum-javascript"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+
+*_What is a programming language?_*
+
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
+
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
+
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
+
+[[fitmedia]]
+=== The `fitMedia()` function
+
+Now that you have created your first script, let's start working on your music!
+
+Watch this video to see how to add an audio clip to your song:
+
+[role="curriculum-python curriculum-mp4"]
+[[video110py]]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video110js]]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
+
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
+
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
+
+////
+OPTIONAL
+////
+
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
+
+////
+END OF OPTIONAL
+////
+
+////
+OPTIONAL
+////
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia.js.txt[]
+----
+
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using sounds that you like:
+
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
+
+For each exercise, you can have your neighbour listen to your song.
+
+If you have errors when running your code, check out the next chapter about debugging.
+****
+
+[[debugging]]
+=== Debug your code
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. You can use debugging strategies, using the console.
+
+[role="curriculum-python curriculum-mp4"]
+[[video3py]]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video3js]]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+////
+OPTIONAL
+////
+
+What are the different types of errors?
+
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
+
+////
+END OF OPTIONAL
+////
+
+Here are some common errors:
+
+[role="curriculum-python"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
+
+[role="curriculum-javascript"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
+
+Time to practice!
+Find the five errors in the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-finding-errors.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-finding-errors.js.txt[]
+----
+
+////
+OPTIONAL
+////
+
+Here is the answer
+
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
+
+////
+END OF OPTIONAL
+////
+
+Take a look at <> for a description of different error types and what you can do to prevent them.
+
+////
+TODO: when options are ready, modify the link
+////
+
+[[chapter1summary]]
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a panel in the EarSketch workspace?
+
+[answers]
+* The effects browser
+* The code editor
+* The DAW
+* The console
+--
+
+[question]
+--
+How many parameters do you need for your `fitMedia()` function?
+
+[answers]
+* 4
+* 6
+* 2
+* 3
+--
+
+[question]
+--
+One script corresponds to...
+
+[answers]
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
+--
+
+[question]
+--
+What is a measure?
+
+[answers]
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
+--
+
+[question]
+--
+Which of the following is NOT a common type of error found in code?
+
+[answers]
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
+--
+
+[question]
+--
+Where in the EarSketch workspace can you get information about your bugs?
+
+[answers]
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/de/v2/legacy.adoc b/src/locales/de/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/de/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/de/v2/loops-and-layers.adoc b/src/locales/de/v2/loops-and-layers.adoc
new file mode 100644
index 000000000..52974c50d
--- /dev/null
+++ b/src/locales/de/v2/loops-and-layers.adoc
@@ -0,0 +1,414 @@
+[[loopandlayers]]
+== Loops and Layers
+
+:nofooter:
+
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. We will also cover musical layers and textures as well as some debugging tips.
+
+[[forloops]]
+=== `for` loops
+
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
+
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
+
+////
+add new video
+more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=0
+in the "revamping videos" tab (includes link to script)
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
+----
+
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
+
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+
+[[loop-components-PY]]
+.The basic components of a for loop
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.The basic components of a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
+.PRACTICE
+****
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
+[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `print()` call.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-printing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-printing.js.txt[]
+----
+
+Here, you will see in your console the following lines:
+
+----
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
+3
+ok
+4
+ok
+----
+
+and it ends there since measure has to be lower than 5, so 4 is your limit.
+
+[[controlflow]]
+=== Control Flow
+
+Here is another example of how you can use `for` loops:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12bpy]]
+video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12bjs]]
+video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
+
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-no-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-no-loops.js.txt[]
+----
+
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-loops.js.txt[]
+----
+
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
+
+A loop is a *control flow statement*, which changes the order. At the end of a loop body, it jumps back to the top of the loop.
+
+This animation shows how the control flow moves in a `for` loop, and how the value of the loop counter changes on each *iteration*, or repetition of the loop body:
+
+[[loop-py]]
+.Stepping through a for loop
+[role="curriculum-python"]
+[caption="Figure 4.2.1: "]
+image::../media/U1P2/LoopPy_updated.gif[Alt Text]
+
+.Stepping through a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.2.1: "]
+[[loop-js]]
+image::../media/U1P2/LoopJS_updated.gif[Alt Text]
+
+////
+Although it is valid syntax, a `*monospace bold phrase*` causes a build error in AsciidocFX. Might be something to do with DocBook conversion. No bold for now. May see how ES handles it in the future.
+
+BMW
+////
+
+One last interesting thing about `for` loops is incrementation.
+
+[role="curriculum-python"]
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
+
+[role="curriculum-javascript"]
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-incrementing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-incrementing.js.txt[]
+----
+
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. This means measure is now equal to its former value plus one. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
+
+[role="curriculum-python"]
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[role="curriculum-javascript"]
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). The following is a shorthand method for incrementing (or decrementing) a counter:
+
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[[debuggingtips]]
+=== Debugging Tips
+
+Programming is not only writing code. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
+
+[role="curriculum-python"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+[role="curriculum-javascript"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+Below, we walk through an example of printing variables to help debug a script:
+
+[role="curriculum-python curriculum-mp4"]
+[[video15py]]
+video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video15js]]
+video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
+
+You've seen a list of potential errors in Chapter 1. Here are some other errors that you might encounter:
+
+[role="curriculum-python"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+[role="curriculum-javascript"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+Take a look at <> for a full description of different error types and what you can do to prevent them.
+
+[[musicaltips]]
+=== Musical tips
+
+Now that you have many tools to create your music, like `fitMedia()`, `makeBeat()` and `for` loops, we will look at musical ideas.
+
+Let's start with the *key* of your song:
+
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
+
+++++
+audioMedia/MajorMinor.mp3
+++++
+
+Now let's talk about the different types of tracks you can have. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
+
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
+
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
+
+.PRACTICE
+****
+Create a complete song with:
+
+* A theme (please mention your chosen theme in your commented intro in the code)
+* The `fitMedia()` and `makeBeat()` functions
+* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
+* At least four tracks
+* At least sixteen measures
+* At least one uploaded sound
+* Comments and variables to organize your code
+
+Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
+****
+
+{nbsp} +
+
+[[chapter4summary]]
+=== Chapter 4 Summary
+
+[role="curriculum-python"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[role="curriculum-javascript"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a component of a `for` loop?
+
+[answers]
+* Loop interpreter
+* Loop Counter
+* Loop Body
+* Loop Range
+--
+
+[question]
+--
+Which of the following is NOT a good use of loops in a musical composition?
+
+[answers]
+* Creating a beat pattern than never repeats
+* Placing musical clips on every third measure
+* Repeating a beat on several consecutive measures
+* Placing musical clips on odd measures
+--
+
+[question]
+--
+Which of the following is NOT a recommended technique for debugging?
+
+[answers]
+* Copying and pasting code into Google
+* Printing variable values to the console
+* Looking at error lines identified in the console
+* Asking others for help
+--
+
+[question]
+--
+Which of the following is NOT something that can be printed to the console?
+
+[answers]
+* Code Comments
+* Strings
+* Mathematical Expressions
+* Variables
+--
+
+[question]
+--
+____ is a quality of sound that determines how high or low it sounds.
+
+[answers]
+* Pitch
+* Tempo
+* Rhythm
+* Loudness
+--
\ No newline at end of file
diff --git a/src/locales/de/v2/mixing-with-conditionals.adoc b/src/locales/de/v2/mixing-with-conditionals.adoc
new file mode 100644
index 000000000..d41a2af7c
--- /dev/null
+++ b/src/locales/de/v2/mixing-with-conditionals.adoc
@@ -0,0 +1,363 @@
+[[mixingwithconditionnals]]
+== Mix with Conditionals!
+
+:nofooter:
+
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
+
+[[analyzetrack]]
+=== Use `analyzeTrack()`
+
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Import and run the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+----
+
+You can read in your console that the printed loudness is 0.10306035109110138.
+
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
+
+The `analyzeTrack()` function takes 2 arguments:
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
+
+.PRACTICE
+****
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
+. Add a second track and use the `analyzeTrack()` function to print its loudness in the console. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
+****
+
+The parameter for `analyzeTrack()` can either be `RMS_AMPLITUDE`, to evaluate the loudness, or `SPECTRAL_CENTROID` to analyze the brightness of the sound. We'll focus on analyzing loudness in this chapter.
+
+[[booleansandcomparisons]]
+=== Booleans and comparisons
+
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
+
+[role="curriculum-python"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `True` and `False`. `True` and `False` start with a capital letter and do not have quotes.
+
+[role="curriculum-javascript"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `true` and `false`. `true` and `false` start with a lower-case letter and do not have quotes.
+
+[role="curriculum-python"]
+--
+To create a boolean, you can either initialize a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|==
+|is equal to
+
+|!=
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-javascript"]
+--
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|===
+|is equal to
+
+|!==
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
+
+// this video will be cut at 2' to delete the section about boolean operators//
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `true` if the first track is louder than the second track, and `false` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+----
+
+[role="curriculum-python"]
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
+
+[role="curriculum-javascript"]
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
+
+[[conditionalstatements]]
+=== Conditional Statements
+
+What is a conditional statement? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
+
+Below is an example of conditional statement, note the similarity with a for loop:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
+----
+
+.PRACTICE
+****
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+----
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
+----
+
+[[mixingyourtracks]]
+=== Mix your tracks
+
+Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
+****
+
+Let's review some vocabulary:
+
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
+
+Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter6summary]]
+=== Chapter 6 Summary
+
+[role="curriculum-python"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `True` and `False`.
+* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
+
+[role="curriculum-javascript"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `true` and `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `true` or `false`.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following elements is a boolean?
+
+[answers]
+* `5+4 === 5`
+* `measure = 1`
+* `2<3<4`
+* `False()`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[question]
+--
+What is mixing?
+
+[answers]
+* adapting the volume of each track so they sound well balanced
+* adapting the pitch of each track so they sound well balanced
+* adding a fade in
+* adding a fade out
+--
+
+[question]
+--
+How many conditions can you check in a conditional statement?
+
+[answers]
+* any number of conditions
+* 1 condition
+* 2 conditions
+* 3 conditions
+--
\ No newline at end of file
diff --git a/src/locales/de/v2/optional.adoc b/src/locales/de/v2/optional.adoc
new file mode 100644
index 000000000..1d412d2ad
--- /dev/null
+++ b/src/locales/de/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/de/v2/reference.adoc b/src/locales/de/v2/reference.adoc
new file mode 100644
index 000000000..d08f7ea27
--- /dev/null
+++ b/src/locales/de/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effects, Errors, and EarSketch Functions
+
+:nofooter:
+
+In this unit you will find references to all effects, errors and EarSketch API functions.
\ No newline at end of file
diff --git a/src/locales/de/v2/unit-1.adoc b/src/locales/de/v2/unit-1.adoc
new file mode 100644
index 000000000..7f48189fe
--- /dev/null
+++ b/src/locales/de/v2/unit-1.adoc
@@ -0,0 +1,18 @@
+[[unit1]]
+== Unit 1: Compose and Add Beats
+
+:nofooter:
+
+In this unit you will learn how EarSketch works, you will place sounds (clips) into your music, debug your code, customize your song, and add beats based on your musical genre.
+
+Anyone (especially you) can learn to program! Like learning a musical instrument, it takes consistent practice to make progress. Don't get discouraged if you get stuck, this is part of the process. Ask for help in your class or look online if needed.
+
+We wish you the best of luck, and before you start here's an example of what you can do with EarSketch:
+
+[role="curriculum-python curriculum-mp4"]
+[[video1livepy]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video1livejs]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-JS.mp4[]
\ No newline at end of file
diff --git a/src/locales/de/v2/unit-2.adoc b/src/locales/de/v2/unit-2.adoc
new file mode 100644
index 000000000..d4fd5122b
--- /dev/null
+++ b/src/locales/de/v2/unit-2.adoc
@@ -0,0 +1,6 @@
+[[unit2]]
+== Unit 2: Loops, Effects, Mixing
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/de/v2/unit-3.adoc b/src/locales/de/v2/unit-3.adoc
new file mode 100644
index 000000000..9f3f26d37
--- /dev/null
+++ b/src/locales/de/v2/unit-3.adoc
@@ -0,0 +1,8 @@
+[[unit3]]
+== Unit 3: Structure your Songs
+
+:nofooter:
+
+Now that you have many tools to create your song, add effects and mix your tracks, we will be looking at the song's structure. We'll be using custom functions for that: these are functions that you will create yourself!
+
+We will also look at user inputs and how they can be embedded in your code to create personalize songs. Finally, we'll see how you can use data structures to simplify your code.
\ No newline at end of file
diff --git a/src/locales/de/v2/welcome.adoc b/src/locales/de/v2/welcome.adoc
new file mode 100644
index 000000000..f89bcfba2
--- /dev/null
+++ b/src/locales/de/v2/welcome.adoc
@@ -0,0 +1,26 @@
+[[welcome]]
+== Welcome Students and Teachers!
+
+:nofooter:
+
+Welcome to EarSketch!
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
+
+*Students*: Continue below to learn more about EarSketch
+
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
+
+[role="curriculum-mp4"]
+[[video0]]
+video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
+
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+Maybe you'll become a legendary music producer or the industry's most sought-after recording engineer! We wish you good luck on your EarSketch journey.
+
+Click on the right arrow at the top of this text to get started.
+
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/de/v2/your-first-song.adoc b/src/locales/de/v2/your-first-song.adoc
new file mode 100644
index 000000000..4e9f6aa2f
--- /dev/null
+++ b/src/locales/de/v2/your-first-song.adoc
@@ -0,0 +1,290 @@
+[[customizeyourfirstsong]]
+== Customize your first song
+
+:nofooter:
+
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
+
+[[settempo]]
+=== The `setTempo()` function
+
+[role="curriculum-python"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+[role="curriculum-javascript"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. To change the tempo, just change the number between the parentheses of the `setTempo()` function. The higher the tempo, the faster your music. You can select a tempo between _45bpm and 220bpm_.
+
+.PRACTICE
+****
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
+****
+
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
+
+[cols="^3*"]
+|===
+|GENRE |BPM |EXAMPLE
+
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
+|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
+|===
+
+.PRACTICE
+****
+. Select one artist you really like and find out what genre they belong to.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
+****
+
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
+
+[[comments]]
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
+
+[role="curriculum-python"]
+In Python, comments are indicated by a line starting with a pound `#` symbol.
+
+[role="curriculum-javascript"]
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
+
+.PRACTICE
+****
+In your current script, write a comment with a description of your song on the first line.
+****
+
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/your-first-song-comments.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/your-first-song-comments.js.txt[]
+----
+
+{nbsp} +
+
+[[uploadingsounds]]
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
+
+You must be logged in to upload sounds.
+
+Let's explore the first three options.
+
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
+
+[role="curriculum-mp4"]
+[[video101rec]]
+video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
+
+.PRACTICE
+****
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
+****
+
+An active computer program is called a *process*.
+
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
+
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
+
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
+
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
+
+Let's examine recording a sound into EarSketch as an example process. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
+
+Check out the following supplementary video:
+
+[role="curriculum-mp4"]
+[[video11cpu]]
+video::./videoMedia/010-02-ProcessesandMemory-PY-JS.mp4[]
+
+////
+END OF OPTIONAL
+////
+
+[[copyright]]
+=== Use Copyright Wisely
+
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
+
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
+
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
+
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
+
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
+
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
+
+[[chapter2summary]]
+=== Chapter 2 Summary
+
+[role="curriculum-python"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[role="curriculum-javascript"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does `setTempo()` allow you to do in EarSketch?
+
+[answers]
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
+--
+
+[question]
+--
+What is the unit for tempo?
+
+[answers]
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
+--
+
+[question]
+--
+What can you use comments for?
+
+[answers]
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
+--
+
+[question]
+--
+Which of the following statements is true?
+
+[answers]
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
+--
+
+[question]
+--
+How do you get a copyright?
+
+[answers]
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
+--
+
+[question]
+--
+What is a music license?
+
+[answers]
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..8a0692adf
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for compas in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..68087c086
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for compas in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/es/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/es/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/es/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/es/v1/every-effect-explained-in-detail.adoc b/src/locales/es/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..9b471ac98
--- /dev/null
+++ b/src/locales/es/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTRO
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Valor predeterminado |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/es/v1/every-error-explained-in-detail.adoc b/src/locales/es/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..f8d304306
--- /dev/null
+++ b/src/locales/es/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+A veces los programadores crean errores que causan que el código funcione incorrectamente o que no funcione en absoluto. Dentro de la programación, las fallas de código se llaman *errores*, o *_bugs_* (una palabra en inglés que literalmente significa "insectos").
+
+El proceso de encontrar y arreglar los errores se llama la *depuración* (*_debugging_* en inglés).
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/es/v1/the-earSketch-api.adoc b/src/locales/es/v1/the-earSketch-api.adoc
index 0d30cde31..66658d32a 100644
--- a/src/locales/es/v1/the-earSketch-api.adoc
+++ b/src/locales/es/v1/the-earSketch-api.adoc
@@ -1,5 +1,6 @@
[[ch_27]]
== The API de EarSketch
+
:nofooter:
-link:[Haz clic] aquí para abrir el API de EarSketch.
+link:[Haz clic] aquí para abrir el API de EarSketch.
\ No newline at end of file
diff --git a/src/locales/es/v2/add-beats.adoc b/src/locales/es/v2/add-beats.adoc
index b2c3490e7..e91d33ef4 100644
--- a/src/locales/es/v2/add-beats.adoc
+++ b/src/locales/es/v2/add-beats.adoc
@@ -6,7 +6,7 @@
¡En este capítulo aprenderás cómo hacer tus propios ritmos! Aprenderemos sobre variables, una nueva función llamada `makeBeat()`, y diferentes ejemplos de ritmos por género.
[[variables]]
-=== Variables
+=== Las variables
[role="curriculum-python curriculum-mp4"]
[[video2py]]
@@ -16,13 +16,16 @@ video::./videoMedia/002-05-Variables-PY.mp4[]
[[video2js]]
video::./videoMedia/002-05-Variables-JS.mp4[]
-¿Qué es una variable? Es un nombre que ayuda a que la computadora encuentre un dato o datos. Las variables sirven para muchos tipos de datos. Por ejemplo, una variable puede sustituir a:
+¿Qué es una variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
* Un número (como un número de pista musical (track) o un número de compás)
* Un archivo (como un archivo de audio),
-* Una cadena (como el nombre de un clip de sonido o algunas letras). Un *carácter* es un número, letra o símbolo, como `A`, `a`, `2`, o `=`. Una cadena es una serie de caracteres entre comillas, como `"Hola Mundo 123!"`.
+* Una cadena (como el nombre de un clip de sonido o algunas letras).
+* Un *carácter* es un número, letra o símbolo, como `A`, `a`, `2`, o `=`.
-Asignamos un nombre a los datos para que sea más fácil llamarlos y modificarlos.
+Típicamente tiene 16 caracteres, pero su tamaño puede variar. Una cadena es una serie de caracteres entre comillas, como `"Hola Mundo 123!"`.
Para usar una variable,
@@ -54,7 +57,7 @@ include::code-examples/add-beats-instead-of-this.js.txt[]
.PRÁCTICA
****
-En tus previos scripts, usa variables para almacenar tus nombres de clips de sonido. Consulta los ejemplos a continuación si necesitas ayuda. Asegúrate de poner a tus variables nombres cortos y entendibles (como "bajo", "voz_1",...) que describan tu clip de sonido.
+En tus previos scripts, usa variables para almacenar tus nombres de clips de sonido. Consulta los ejemplos a continuación si necesitas ayuda. Asegúrate de poner a tus variables nombres cortos y entendibles (como "bajo", "voz_1",...)
****
{nbsp} +
@@ -73,14 +76,14 @@ include::code-examples/add-beats-variables.js.txt[]
Toma en cuenta que es importante nombrar tus variables de manera entendible y descriptiva. Por ejemplo, usa `synth1` en vez de `musica1` o `prueba`, que no proporcionan ninguna información. De esta manera, cuando tú o alguien más lea tu código, puede entender a qué te estás refiriendo.
-Una *constante* es similar a una variable porque almacena valores. Sin embargo, el valor de una constante nunca cambia. Por ejemplo, en EarSketch, `TECHNO_SYNTHPLUCK_001` es una constante. Se refiere al archivo de audio correspondiente. Convencionalmente, se escriben los nombres de las constantes en mayúscula y se usan barras bajas en vez de espacios.
+Una *constante* es similar a una variable porque almacena valores. Sin embargo, el valor de una constante nunca cambia. Por ejemplo, en EarSketch, `TECHNO_SYNTHPLUCK_001` es una constante. Convencionalmente, se escriben los nombres de las constantes en mayúscula y se usan barras bajas en vez de espacios.
[[drumbeatstrings]]
=== Cadenas (_strings_) de tiempos
Primero vamos a aprender algunos conceptos básicos sobre el ritmo:
-* El *ritmo* es la manera en que se colocan los sonidos a través de la canción.
+* *Rhythm* is a pattern of sound, often repeated.
* El *tempo* es la velocidad de la música en PPM (pulsaciones por minuto).
* El *pulso* de una canción es una sucesión constante de pulsaciones (o latidos). Cuando los miembros de una audiencia dan palmas en un concierto, siguen este pulso.
* Un *compás* es una unidad de medida musical que agrupa una cantidad predeterminada de tiempos. En EarSketch, 1 *compás* dura 4 tiempos. Debido a que hay 4 tiempos en 1 compás, los tiempos también se llaman *negras (1/4s de nota)*.
@@ -95,7 +98,7 @@ Primero vamos a aprender algunos conceptos básicos sobre el ritmo:
image::../media/U1P1/measure.png[A measure]
[[imediabeatpng]]
-.Un tiempo
+.Un semicorcheas
[caption="Figure 3.2.2: "]
image::../media/U1P1/beat.png[A beat]
@@ -109,15 +112,16 @@ image::../media/U1P1/sixteenthnote.png[A sixteenth note]
Escucha tu canción favorita, y trata de seguir el pulso dando palmas. Puedes hacer este ejercicio con tu compañero/a.
****
-Vamos a crear un nuevo tipo de variable: *cadenas de golpes de tambor* para nuestros patrones percusivos.
-Una cadena de golpes de tambor es una cadena que usa los caracteres "0", "+" o "-". Por ejemplo: `"0-00-00-0+++0+0+"`. Típicamente tiene 16 caracteres, pero su tamaño puede variar. Cada carácter corresponde a una semicorchea (1/16 de nota). Entonces cadenas de golpes de tambor con 16 caracteres duran un compás.
+We'll compose each of our rhythms in a *beat* string.
+
+Una cadena de golpes de tambor es una cadena que usa los caracteres "0", "+" o "-". Recuerda que una cadena es un tipo de dato.
+
+Por ejemplo: `"0-00-00-0+++0+0+"`.
* `0` empieza a tocar el clip de sonido percusivo (un golpe de tambor, por ejemplo).
* `+` extiende el clip de audio hasta la siguiente subdivisión. Siempre se coloca después de un `0` o `+`.
* `-` se usa para crear un silencio.
-Recuerda que una cadena es un tipo de dato. Se consiste en una serie de caracteres (como `0` o `+`) dentro de comillas.
-
.PRÁCTICA
****
Para cada una de las siguientes cadenas de golpes de tambor, trata de marcar cada cero con las palmas. Luego escucha el audio correspondiente y verifica si marcaste el ritmo correcto. Este ejercicio te va a ayudar a entender cómo funcionan las cadenas de golpes de tambor.
@@ -180,9 +184,9 @@ video revamping tab
Ahora vamos a ver cómo puedes hacer tu propio ritmo. Aquí usamos el término "ritmo" como abreviación de ritmo de tambor: un patrón rítmico y repetido de sonidos de percusión. Usaremos la función `makeBeat()`, con 4 argumentos:
-. *El nombre del clip*: el clip de sonido que quieres. Puedes usar el filtro de artistas en el Navegador de Sonidos y seleccionar "MAKEBEAT": éstos son clips cortos adecuados para patrones de tiempos (patrones de ritmo).
-. *El número de pista musical* (track number): la pista (track) en donde colocarás tu ritmo.
-. *El número de compás*: el compás donde empezará tu ritmo.
+. *Sound*: A sound constant. Puedes usar el filtro de artistas en el Navegador de Sonidos y seleccionar "MAKEBEAT": éstos son clips cortos adecuados para patrones de tiempos (patrones de ritmo). These are short sounds appropriate for beat patterns.
+. *numeroDePistaMusical (trackNumber):* La pista en la cual se coloca la música.
+. *Start*: The starting measure
. *La cadena de tiempos*: Una cadena de ritmo compuesta de los caracteres `"0"`, `"+"` y `"-"`.
Por ejemplo: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` colocará tu patrón `0--0--000--00-0-` en la pista 1 (track 1), en el compás 1, usando el clip de sonido `DUBSTEP_FILTERCHORD_002`.
@@ -270,10 +274,10 @@ include::code-examples/add-beats-examples-of-beats.js.txt[]
* Se pueden encontrar los clips de sonidos percusivos usando el filtro de ARTISTAS en el Navegador de Sonidos: selecciona el artista MAKEBEAT.
* Se usan cadenas con la función `makeBeat()` para crear patrones rítmicos en EarSketch. `makeBeat()` usa una cadena de tiempos (también conocida como cadena de ritmo) para definir cada decimosexto de nota (semicorchea) de su patrón. Un `0` empieza el clip, un `+` extiende la nota hasta la próxima subdivisión, y un `-` crea un silencio.
* `makeBeat()` consiste en cuatro argumentos:
-** *nombreDelClip:* El clip desde el cual se construye un ritmo.
+** *Sound*: A sound constant
** *numeroDePistaMusical (trackNumber):* La pista en la cual se coloca la música.
-** *numeroDeCompas*: El compás donde empezará tu ritmo. La cadena de tiempos determina la duración total.
-** *cadenaDeTiempos:* Una cadena que determina el ritmo creado.
+** *Start*: The starting measure
+** *La cadena de tiempos*: Una cadena de ritmo compuesta de los caracteres `"0"`, `"+"` y `"-"`.
* Patrones de tiempos diferentes se corresponden a géneros musicales diferentes.
[[chapter-questions]]
diff --git a/src/locales/es/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/es/v2/code-examples/add-beats-multi-beat.py.txt
index 26480a24f..6667d0ff5 100644
--- a/src/locales/es/v2/code-examples/add-beats-multi-beat.py.txt
+++ b/src/locales/es/v2/code-examples/add-beats-multi-beat.py.txt
@@ -5,9 +5,8 @@ from earsketch import *
setTempo(120)
# Música
-
synth = DUBSTEP_FILTERCHORD_002
-platillo = OS_CLOSEDHAT01
+cymbal = OS_CLOSEDHAT01
ritmo1 = "-00-00+++00--0-0"
ritmo2 = "0--0--000--00-0-"
diff --git a/src/locales/es/v2/code-examples/add-beats-variables.js.txt b/src/locales/es/v2/code-examples/add-beats-variables.js.txt
index a5bbfa720..53a7ff381 100644
--- a/src/locales/es/v2/code-examples/add-beats-variables.js.txt
+++ b/src/locales/es/v2/code-examples/add-beats-variables.js.txt
@@ -9,12 +9,10 @@ var synth2 = HIPHOP_SOLOMOOGLEAD_001;
var tambores = HIPHOP_TRAPHOP_BEAT_008;
// fitMedia() añade los clips synth1 and synth2 alternativamente a la pista musical 1 (track 1).
-
fitMedia(synth1, 1, 1, 2);
fitMedia(synth2, 1, 2, 3);
fitMedia(synth1, 1, 3, 4);
fitMedia(synth2, 1, 4, 5);
// fitMedia() añade la batería a la pista musical 2.
-
fitMedia(bateria, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/add-beats-variables.py.txt b/src/locales/es/v2/code-examples/add-beats-variables.py.txt
index 01df2597a..94040e1ce 100644
--- a/src/locales/es/v2/code-examples/add-beats-variables.py.txt
+++ b/src/locales/es/v2/code-examples/add-beats-variables.py.txt
@@ -5,7 +5,6 @@ from earsketch import *
setTempo(100)
# Música
-# Clips de sonido
synth1 = HIPHOP_SYNTHPLUCKLEAD_005
synth2 = HIPHOP_SOLOMOOGLEAD_001
bateria = HIPHOP_TRAPHOP_BEAT_008
diff --git a/src/locales/es/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/es/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
index acc3be1b1..ed95d485b 100644
--- a/src/locales/es/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
+++ b/src/locales/es/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -7,7 +7,7 @@ setTempo(120)
# Música
# Crea una función para la sección A.
-def seccionA(compasDeComienzo, ultimoCompas):
+def sectionA(startMeasure, endMeasure):
fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, compasDeComienzo, ultimoCompas) # Principal
fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, compasDeComienzo, ultimoCompas) # Tambores
fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, compasDeComienzo, ultimoCompas) # Línea de bajo
diff --git a/src/locales/es/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/es/v2/code-examples/custom-functions-a-b-a-form.js.txt
index a74ca9a29..60efe5796 100644
--- a/src/locales/es/v2/code-examples/custom-functions-a-b-a-form.js.txt
+++ b/src/locales/es/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -6,12 +6,14 @@ setTempo(120);
// Música
// Crea una sección A.
+
fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // Principal
fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // Tambores
fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // Línea de bajo
setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // Aumentar el volumen de la línea de bajo
// Crea una sección B con 4 compases entre el compás 5 y el 9.
+
fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // La melodía principal es diferente.
fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // Los tambores son diferentes.
fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // Una línea de bajo que crea contrastes: es más lenta y tiene más volumen.
@@ -19,6 +21,7 @@ setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // Aumentar el volumen de la línea de b
fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // El traqueteo: añadir un nuevo elemento
// Entonces se regresa a la sección A en el compás 9.
+
fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // Principal
fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // Tambores
fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // Línea de bajo
diff --git a/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
index 0d8d1fefa..d2b2a50cd 100644
--- a/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
+++ b/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -63,7 +63,7 @@ function seccionB(comienzo, fin) {
fitMedia(melodia3, 1, comienzo, comienzo + 2);
fitMedia(melodia4, 1, comienzo + 2, fin);
fitMedia(piano, 2, comienzo, fin);
- anadirBateria(comienzo, fin, "ligero");
+ addingDrums(start, end, "light");
}
// LLAMADAS A FUNCIÓN
diff --git a/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
index 1c98454d3..d5535db11 100644
--- a/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
+++ b/src/locales/es/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -20,14 +20,14 @@ hihat = OS_CLOSEDHAT03
# DEFINICIONES DE FUNCIONES
# Añadir batería:
-def anadirBateria(comienzo, fin, patron):
+def addingDrums(start, end, pattern):
# Primero, creamos cadenas de tiempos (_beatstrings_), dependiendo del patrón del parámetro:
if patron == "heavy":
cadenaDeTiemposDeBombo = "0---0---0---00--"
cadenaDeTiemposDeHihat = "-----000----0-00"
elif patron == "ligero":
cadenaDeTiemposDeBombo = "0-------0---0---"
- cadenaDeTiemposDeHihat = "--0----0---0---"
+ beatStringHihat = "--0----0---0---"
# Entonces creamos el ritmo
# de bombo en la pista 3 (track 3) y de hihat en la pista 4 (track 4)
# de los compases comienzo al fin:
@@ -61,7 +61,7 @@ def seccionB(comienzo, fin):
fitMedia(melodia3, 1, comienzo, comienzo + 2)
fitMedia(melodia4, 1, comienzo + 2, fin)
fitMedia(piano, 2, comienzo, fin)
- anadirBateria(comienzo, fin, "ligero")
+ addingDrums(start, end, "light")
# LLAMADAS A FUNCIÓN
intro(1, 5)
diff --git a/src/locales/es/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/es/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
index 4daa64441..ff5389768 100644
--- a/src/locales/es/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
+++ b/src/locales/es/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -11,7 +11,7 @@ solistaPrincipal2 = TECHNO_ACIDBASS_005
bateriaAdicional1 = TECHNO_LOOP_PART_025
bateriaAdicional2 = TECHNO_LOOP_PART_030
bateriaPrincipal = TECHNO_MAINLOOP_019
-lineaDeBajo = TECHNO_SUBBASS_002
+bass = TECHNO_SUBBASS_002
# Sección 1
fitMedia(introSolista, 1, 1, 5)
diff --git a/src/locales/es/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/es/v2/code-examples/data-structures-instead-of-writing-this.py.txt
index 9f151200d..3ff549cee 100644
--- a/src/locales/es/v2/code-examples/data-structures-instead-of-writing-this.py.txt
+++ b/src/locales/es/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -1,7 +1,7 @@
# En vez de escribir esto:
bombo = OS_KICK03
hihat = OS_OPENHAT01
-redoblante = OS_SNARE05
+snare = OS_SNARE05
# Puedes escribir esto:
bateria = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/es/v2/code-examples/data-structures-making-a-drum-set.py.txt
index 75267ef75..1a83b2d5d 100644
--- a/src/locales/es/v2/code-examples/data-structures-making-a-drum-set.py.txt
+++ b/src/locales/es/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -6,7 +6,7 @@ setTempo(100)
# Antes, había una pista por cada sonido (compás 1):
bombo = OS_KICK05
-redoblante = OS_SNARE01
+snare = OS_SNARE01
ritmoDeBombo = "0+++----0+++----"
ritmoDeRedoblante = "----0+++----0+++"
makeBeat(bombo, 1, 1, ritmoDeBombo)
diff --git a/src/locales/es/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/es/v2/code-examples/data-structures-string-and-lists-operations.js.txt
index ce82fe83e..f3537e6ca 100644
--- a/src/locales/es/v2/code-examples/data-structures-string-and-lists-operations.js.txt
+++ b/src/locales/es/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -10,31 +10,25 @@ var sonidosA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD
var sonidosB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
// Imprime el segundo carácter de cada cadena.
-
println(cadenaA[1]);
println(cadenaB[1]);
// Imprime el último elemento de tus arreglos.
-
println(sonidosA[sonidosA.length - 1]);
println(sonidosB[sonidosB.length - 1]);
// Crea e imprime cadenaC, la concatenación de cadenaA y cadenaB.
-
var cadenaC = cadenaA + cadenaB;
println(cadenaC);
// Crea e imprime sonidosC, la concatenación de tus sonidosA, sonidosB y sonidosA otra vez.
-
var sonidosC = (sonidosA.concat(sonidosB)).concat(sonidosA);
println(sonidosC);
// Crea e imprime cadenaD, la porción de cadenaC del segundo al quinto carácter inclusive.
-
var cadenaD = cadenaC.substring(1, 5);
println(cadenaD);
// Crea e imprime sonidosD, la porción de cadenaC del tercer al último elemento inclusive.
-
var sonidosD = sonidosC.slice(2, sonidosC.length);
println(sonidosD);
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/es/v2/code-examples/data-structures-string-operations.js.txt
index dac744506..4ded89f5a 100644
--- a/src/locales/es/v2/code-examples/data-structures-string-operations.js.txt
+++ b/src/locales/es/v2/code-examples/data-structures-string-operations.js.txt
@@ -11,7 +11,7 @@ function expansor(cadenaDeTiempos) {
var nuevoRitmo = "";
for (var i = 0; i < cadenaDeTiempos.length; i = i + 1) {
porcionDelRitmo = cadenaDeTiempos.substring(0, i);
- nuevoRitmo = nuevoRitmo + porcionDelRitmo;
+ newBeat = newBeat + beatSlice;
}
// Devuelve la nueva cadena de tiempos para poder usarla fuera de la función.
return nuevoRitmo;
diff --git a/src/locales/es/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/es/v2/code-examples/data-structures-string-operations.py.txt
index a6413cc24..bc43b248d 100644
--- a/src/locales/es/v2/code-examples/data-structures-string-operations.py.txt
+++ b/src/locales/es/v2/code-examples/data-structures-string-operations.py.txt
@@ -8,11 +8,11 @@ setTempo(120)
ritmoInicial = "0+0+00-00+++-0++"
instrBateria = RD_UK_HOUSE_MAINBEAT_10
-def expansor(cadenaDeTiempos):
+def expander(beatString):
nuevoRitmo = ""
for i in range(0, len(cadenaDeTiempos)):
- porcionDelRitmo = cadenaDeTiempos[0:i]
- nuevoRitmo = nuevoRitmo + porcionDelRitmo
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
# Devuelve la nueva cadena de tiempos para poder usarla fuera de la función.
return nuevoRitmo
diff --git a/src/locales/es/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/es/v2/code-examples/effects-and-envelopes-envelopes.js.txt
index 0449e047f..cf03f4a00 100644
--- a/src/locales/es/v2/code-examples/effects-and-envelopes-envelopes.js.txt
+++ b/src/locales/es/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -7,6 +7,5 @@ setTempo(120);
fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
// Hace un _effect ramp_ (rampa del efecto) entre los compases 1 y 3, yendo desde -60dB hasta 0dB.
-
// Esto es un _fade in_.
setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
index e0fac3fcb..ff436928b 100644
--- a/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
+++ b/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -3,7 +3,7 @@
// Configuración
setTempo(100);
-// Variables
+// Variables:
var melodia1 = MILKNSIZZ_ADIOS_BRASS;
var melodia2 = MILKNSIZZ_ADIOS_STRINGS;
var bombo = OS_KICK04;
diff --git a/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
index 6f4191826..5240273e0 100644
--- a/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
+++ b/src/locales/es/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -9,8 +9,8 @@ melodia1 = MILKNSIZZ_ADIOS_BRASS
melodia2 = MILKNSIZZ_ADIOS_STRINGS
bombo = OS_KICK04
hihat = OS_OPENHAT03
-ritmoDeBombo = "0-------0-0-0---"
-ritmoDeHihat = "---0---0--00----"
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
# Colocar melodías a la pista 1
fitMedia(melodia1, 1, 1, 5)
diff --git a/src/locales/es/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/es/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
index 497f82de6..4096e4f1d 100644
--- a/src/locales/es/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
+++ b/src/locales/es/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -3,7 +3,7 @@
// Configuración
setTempo(120);
-// Variables
+// Variables:
var piano1 = COMMON_LOVE_THEME_PIANO_2;
var percusiones1 = HOUSE_BREAK_FILL_002;
diff --git a/src/locales/es/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/es/v2/code-examples/get-user-input-boolean-operations.js.txt
index 1dbe99922..422dfc0d4 100644
--- a/src/locales/es/v2/code-examples/get-user-input-boolean-operations.js.txt
+++ b/src/locales/es/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -25,7 +25,7 @@ if ((genero === "Hip Hop") || (genero === "hip hop") || (genero === "HIP HOP"))
makeBeat(bombo, 1, 1, ritmoDeBomboDeEdm);
makeBeat(palmada, 2, 1, ritmoDePalmadasEdm);
} else {
- println("Lo siento. No se pudo leer el genero que seleccionaste. Por favor, ejecuta el codigo otra vez.");
+ No se pudo leer el genero que seleccionaste. Por favor, ejecuta el codigo otra vez.");
}
// Añadir alguna reverberación en la pista 2 (track 2)
diff --git a/src/locales/es/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/es/v2/code-examples/get-user-input-boolean-operations.py.txt
index b9f583312..ba5e52a6e 100644
--- a/src/locales/es/v2/code-examples/get-user-input-boolean-operations.py.txt
+++ b/src/locales/es/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -25,7 +25,7 @@ elif (genero == "edm") or (genero == "Edm") or (genero == "EDM"):
makeBeat(bombo, 1, 1, ritmoDeBomboDeEdm)
makeBeat(palmada, 2, 1, ritmoDePalmadasEdm)
else:
- print("Lo siento. No se pudo leer el genero que seleccionaste. Por favor, ejecuta el código otra vez.")
+ No se pudo leer el genero que seleccionaste. Por favor, ejecuta el código otra vez.")
# Añadir alguna reverberación en la pista 2 (track 2)
setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/es/v2/code-examples/get-user-input-return-statements-2.js.txt
index 02c34e263..80962ec3c 100644
--- a/src/locales/es/v2/code-examples/get-user-input-return-statements-2.js.txt
+++ b/src/locales/es/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -14,5 +14,5 @@ function verso(comienzo) {
return fin;
}
// Llamadas a función
-var ultimoCompas = verso(1); // Llamar a la función verso, donde comienzo es el compás 1
+var endMeasure = verse(1); // calling verse function and start is measure 1
println(ultimoCompas);
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/es/v2/code-examples/get-user-input-return-statements.js.txt
index 84f49dca8..f6171d410 100644
--- a/src/locales/es/v2/code-examples/get-user-input-return-statements.js.txt
+++ b/src/locales/es/v2/code-examples/get-user-input-return-statements.js.txt
@@ -7,10 +7,9 @@ var ritmo1 = "0+++0+0+0+--0+00";
var ritmo2 = "0+0-00++0-000+++";
// Música
-
-function crearRitmo(compasDeComienzo, clipDeSonido, cadenaDeTiempos) {
- var ultimoCompas = compasDeComienzo + 3;
- for (var compas = compasDeComienzo; compas < ultimoCompas; compas++) {
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
makeBeat(clipDeSonido, 1, compas, cadenaDeTiempos);
}
@@ -19,8 +18,8 @@ function crearRitmo(compasDeComienzo, clipDeSonido, cadenaDeTiempos) {
}
// Llamadas a función
-
// Asignar el valor que devolvemos a una variable
var nuevoComienzo = crearRitmo(1, HIPHOP_DUSTYGROOVE_007, ritmo1);
+
// Pasar el valor devuelto a otra función
crearRitmo(nuevoComienzo, HIPHOP_DUSTYGROOVE_010, ritmo2);
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/es/v2/code-examples/get-user-input-return-statements.py.txt
index 88009a98c..c368e59e8 100644
--- a/src/locales/es/v2/code-examples/get-user-input-return-statements.py.txt
+++ b/src/locales/es/v2/code-examples/get-user-input-return-statements.py.txt
@@ -8,18 +8,17 @@ ritmo1 = "0+++0+0+0+--0+00"
ritmo2 = "0+0-00++0-000+++"
# Música
-
-def crearRitmo(compasDeComienzo, clipDeSonido, CadenaDeTiempos):
- ultimoCompas = compasDeComienzo + 3
- for compas in range(compasDeComienzo, ultimoCompas):
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
makeBeat(clipDeSonido, 1, compas, cadenaDeTiempos)
# Devolver el último compás para poder usarlo fuera de la función
return ultimoCompas
# Llamadas a función
-
# Asignar el valor que devolvemos a una variable
nuevoComienzo = crearRitmo(1, HIPHOP_DUSTYGROOVE_007, ritmo1)
+
# Pasar el valor devuelto a otra función
crearRitmo(nuevoComienzo, HIPHOP_DUSTYGROOVE_010, ritmo2)
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.js.txt
index 04b644ddc..1ecdcf962 100644
--- a/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.js.txt
+++ b/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -1,11 +1,9 @@
// Cómo usar fitMedia() 2: Múltiples llamadas a fitMedia() en pistas musicales diferentes
// Sección de configuración
-
setTempo(100);
// Sección de música
-
fitMedia(Y01_DRUMS_1, 1, 1, 9);
fitMedia(Y11_BASS_1, 2, 1, 9);
fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.py.txt
index b309d4283..958711195 100644
--- a/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.py.txt
+++ b/src/locales/es/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -5,7 +5,6 @@ from earsketch import *
setTempo(100)
# Sección de música
-
fitMedia(Y01_DRUMS_1, 1, 1, 9)
fitMedia(Y11_BASS_1, 2, 1, 9)
fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/es/v2/code-examples/loops-and-layers-loops.js.txt
index 4d913b601..a06b2c398 100644
--- a/src/locales/es/v2/code-examples/loops-and-layers-loops.js.txt
+++ b/src/locales/es/v2/code-examples/loops-and-layers-loops.js.txt
@@ -8,7 +8,6 @@ var bateria1 = ELECTRO_DRUM_MAIN_BEAT_008;
var bateria2 = ELECTRO_DRUM_MAIN_BEAT_007;
// Cómo usar un ciclo en vez de escribir repetidamente líneas de código parecidas
-
for (var compas = 1; compas < 9; compas = compas + 1) {
fitMedia(bateria1, 1, compas, compas + 0.5);
fitMedia(bateria2, 1, compas + 0.5, compas + 1);
diff --git a/src/locales/es/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/es/v2/code-examples/loops-and-layers-loops.py.txt
index 3e9c83ca0..9ffd8759d 100644
--- a/src/locales/es/v2/code-examples/loops-and-layers-loops.py.txt
+++ b/src/locales/es/v2/code-examples/loops-and-layers-loops.py.txt
@@ -9,7 +9,6 @@ bateria1 = ELECTRO_DRUM_MAIN_BEAT_008
bateria2 = ELECTRO_DRUM_MAIN_BEAT_007
# Cómo usar un ciclo en vez de escribir repetidamente líneas de código parecidas
-
for compas in range(1, 9):
fitMedia(bateria1, 1, compas, compas + 0.5)
fitMedia(bateria2, 1, compas + 0.5, compas + 1)
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/es/v2/code-examples/loops-and-layers-no-loops.py.txt
index bdb1b9d78..0b2129fe3 100644
--- a/src/locales/es/v2/code-examples/loops-and-layers-no-loops.py.txt
+++ b/src/locales/es/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -9,7 +9,6 @@ bateria1 = ELECTRO_DRUM_MAIN_BEAT_008
bateria2 = ELECTRO_DRUM_MAIN_BEAT_007
# Se podrían reemplazar todas estas llamadas a fitMedia() con dos llamadas en ciclos.
-
fitMedia(bateria1, 1, 1, 1.5)
fitMedia(bateria2, 1, 1.5, 2)
fitMedia(bateria1, 1, 2, 2.5)
diff --git a/src/locales/es/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/es/v2/code-examples/loops-and-layers-printing.js.txt
index 309e1f658..cb9540d12 100644
--- a/src/locales/es/v2/code-examples/loops-and-layers-printing.js.txt
+++ b/src/locales/es/v2/code-examples/loops-and-layers-printing.js.txt
@@ -3,7 +3,7 @@
// Configuración
setTempo(120);
-// Variables
+// Variables:
var tambor1 = OS_SNARE03;
var cadena_de_tiempos = "0---0---0-0-0---";
@@ -12,7 +12,6 @@ println(1 + 3);
// Poner nuestro ritmo en un ciclo
// Toma en cuenta que la declaración de impresión está dentro del ciclo for para ejecutarla en cada iteración del ciclo.
-
for (var compas = 1; compas < 5; compas++) {
makeBeat(drum1, 1, compas, beat_string);
println(compas);
diff --git a/src/locales/es/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/es/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
index f0491185c..6f923d9a6 100644
--- a/src/locales/es/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
+++ b/src/locales/es/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -1,4 +1,5 @@
# Mezcla Automática 1: Si la pista 1 tiene más volumen que la pista 2, reduciremos su volumen.
+
# Configuración
from earsketch import *
setTempo(120)
diff --git a/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
index 505645473..4de179e62 100644
--- a/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
+++ b/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -1,2 +1,4 @@
if (condicion){
- // Escribe aquí las instrucciones que la computadora tiene que ejecutar si se calcula que la condición es true.
\ No newline at end of file
+ // Escribe aquí las instrucciones que la computadora tiene que ejecutar si se calcula que la condición es true.
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
index 43653795d..31d2e1b13 100644
--- a/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
+++ b/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -1,2 +1,3 @@
if condicion:
- # Escribe aquí las instrucciones que la computadora tiene que ejecutar si se calcula que la condición es True.
\ No newline at end of file
+ # Escribe aquí las instrucciones que la computadora tiene que ejecutar si se calcula que la condición es True.
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
index b9da7389c..fe74f0ac3 100644
--- a/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
+++ b/src/locales/es/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -1,7 +1,10 @@
if (condicion1) {
- // Escribe aquí las instrucciones que la computadora tiene que ejecutar si se calcula que la condicion1 es true. } else if (condicion2) {
- // # Escribe aquí las instrucciones si la condicion2 es true. Si la condicion2 es false, prosigue a la siguiente línea. // elif es una abreviatura de "else if" ("de lo contrario, si" en español)
+ // Escribe aquí las instrucciones que la computadora tiene que ejecutar si se calcula que la condicion1 es true.
+} else if (condicion2) {
+ // # Escribe aquí las instrucciones si la condicion2 es true. Si la condicion2 es false, prosigue a la siguiente línea.
+ // elif es una abreviatura de "else if" ("de lo contrario, si" en español)
} else if (condicion3) {
- // Escribe aquí las instrucciones si la condicion3 es true. Si la condicion3 es false, prosigue a la siguiente línea. } else {
+ // Escribe aquí las instrucciones si la condicion3 es true. Si la condicion3 es false, prosigue a la siguiente línea.
+} else {
// Escribe aquí las instrucciones si todas las 3 condiciones son false.
}
\ No newline at end of file
diff --git a/src/locales/es/v2/custom-functions.adoc b/src/locales/es/v2/custom-functions.adoc
index 7d6e3640d..fd99c8058 100644
--- a/src/locales/es/v2/custom-functions.adoc
+++ b/src/locales/es/v2/custom-functions.adoc
@@ -10,7 +10,7 @@ La estructura de la canción es la organización de la propia canción a lo larg
:nofooter:
-Se puede dividir una canción en *secciones*. Una sección se compone de varios compases (unidades musicales de tiempo), y expresa una idea o sentimiento. Usualmente, los músicos tratan de crear contrastes entre secciones diferentes. _Intros, Versos, Coros_ y _Outros_ son ejemplos de secciones.
+Se puede dividir una canción en *secciones*. Una sección se compone de varios compases (unidades musicales de tiempo), y expresa una idea o sentimiento. Usualmente, los músicos tratan de crear contrastes entre secciones diferentes. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
Una *forma*, o estructura de canción, común y sencilla es ABA. A y B son dos secciones diferentes, el coro y el verso, por ejemplo. La sección B añade variedad, mientras un regreso a la sección A crea familiaridad. El código a continuación crea una forma ABA. La sección B contiene sonidos que contrastan con la sección A - una línea de bajo más lenta y más fuerte y un traqueteo adicional:
@@ -35,17 +35,17 @@ include::code-examples/custom-functions-a-b-a-form.js.txt[]
.PRÁCTICA
****
-Selecciona una canción que te guste. Escúchala y trata de determinar cuáles son las diferentes secciones. ¿Te das cuenta cuando los músicos cambian de sección? ¿Cuántos coros o versos puedes escuchar? ¿Qué tipos de contrastes puedes observar? Comparte tu ejemplo con tu compañero/a.
+Selecciona una canción que te guste. Escúchala y trata de determinar cuáles son las diferentes secciones. ¿Te das cuenta cuando los músicos cambian de sección? How many times do you hear the chorus and verse? ¿Qué tipos de contrastes puedes observar? Comparte tu ejemplo con tu compañero/a.
****
-Ten en cuenta que una frase musical suena más natural cuando se arreglan los clips en grupos de 2, 4, 8, 16, etc. Por lo tanto, tus secciones preferiblemente deben durar 2, 4, 8, o 16 compases.
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
[[creatingyourcustomfunctions]]
=== Crea tus funciones personalizadas
-En el ejemplo previo de la canción ABA, el código es largo y se repite en la segunda sección A. ¡Hay una manera más eficiente de hacerlo usando *funciones personalizadas*! Vamos a definir una función que representará la sección A, y luego la llamaremos dos veces.
+En el ejemplo previo de la canción ABA, el código es largo y se repite en la segunda sección A. There is a way to be more concise, thanks to *custom functions*! Vamos a definir una función que representará la sección A, y luego la llamaremos dos veces.
-La diferencia con las funciones que has utilizado como `fitMedia()`, es que `fitMedia()` ya está predefinida por nuestro equipo para reproducir una canción. En una función personalizada, tú defines exactamente lo que hará. Aquí se explica cómo definir la sección A:
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. En una función personalizada, tú defines exactamente lo que hará. Aquí se explica cómo definir la sección A:
[role="curriculum-python"]
[source,python]
@@ -59,7 +59,7 @@ include::code-examples/custom-functions-untitled1.py.txt[]
include::code-examples/custom-functions-untitled1.js.txt[]
----
-. Aquí se optó por llamar a la función seccionA(). Puedes elegir el nombre que quieras. Trata de nombrar tu función de manera descriptiva para que tu código sea más fácil de leer.
+. `sectionA()` is the name we chose for our function. Puedes elegir el nombre que quieras. Trata de nombrar tu función de manera descriptiva para que tu código sea más fácil de leer.
. Las instrucciones son el *cuerpo* de la función. Tienen sangría.
.PRÁCTICA
@@ -69,17 +69,17 @@ Es porque tienes que *llamar* a una función para usarla.
Para llamar a la función, añade la línea `seccionA()`, sin sangría, después de la definición de la función. Cuando ejecutes el código, debes ver la sección A en tu EAD.
****
-Ahora queremos añadir la sección A de los compases 9 al 13. Sin embargo, cuando llamemos a la seccionA(), los sonidos se colocan desde los compases 1 al 5. Para remediar este problema, crearemos *parámetros* para nuestra función.
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. Para remediar este problema, crearemos *parámetros* para nuestra función.
.PRÁCTICA
****
-En tu script actual que creaste para el problema previo de práctica:
+In your current script you created for the previous practice problem:
-1. Añade los parámetros `compasDeComienzo` y `ultimoCompas` separados por una coma entre los paréntesis de la función seccionA en su definición así: `seccionA(compasDeComienzo, ultimoCompas)`.
-1. En el cuerpo de la función, reemplaza el compás de comienzo (1) y el último compás (5) con `compasDeComienzo` y `ultimoCompas` respectivamente.
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
1. Cuando llames a tu función, añade los parámetros `1` y `5` entre paréntesis. Ejecuta el código para asegurarte de que no haya ningún error.
1. Añade una segunda llamada a función, esta vez con los parámetros `9` y `13`. Ejecuta el código para asegurarte de que no haya ningún error.
-1. Define una función para la sección B, usando el mismo proceso, y llama a la sección B desde los compases 5 al 9 y del 13 al 17.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
****
Aquí está un ejemplo del código que podrías escribir:
@@ -113,21 +113,21 @@ Ahora que sabes cómo crear funciones personalizadas para estructurar tu canció
A continuación, hay unas estrategias populares para crear transiciones musicales:
-. *Platillo Crash*: Colocar un platillo crash en el primer tiempo de una nueva sección. Ve a este https://www.youtube.com/watch?v=RssWT0Wem2w&t=0m55s[ejemplo^].
-. *Drum Fill*: Una variación rítmica que llena el espacio antes de la nueva sección. Ve a estos https://www.youtube.com/watch?v=YMskGG39Y0Y[ejemplos^] de drum fills.
-. *Silencios de Pista* (*_Track Dropouts_*): No tocar ciertas pistas temporalmente para crear pausas. Escucha a https://youtu.be/cQbAm4dIDKA?t=82[Imagine Dragon's Love^].
+. *Platillo Crash*: Colocar un platillo crash en el primer tiempo de una nueva sección.
+. *Drum Fill*: Una variación rítmica que llena el espacio antes de la nueva sección.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
. *Variación de la Melodía*: Introducir una variación de acordes, la línea de bajo o la melodía antes de la nueva sección. Muchas veces, habrá una carpeta en la biblioteca de sonidos de EarSketch con variaciones de una frase repetitiva (_riff_ en inglés).
-. *_Riser_*: Una nota o ruido cuyo registro se aumenta. Es muy común en EDM (Música Electrónica Dance) y crea la expectativa de un _drop_. Se puede colocar el término de búsqueda "riser" en el Navegador de Sonidos. Se puede usar un platillo crash tocado en reversa como un _riser_, tal como YG_EDM_REVERSE_CRASH_1. Aquí está un ejemplo de un _riser_ en la https://www.youtube.com/watch?v=1KGsAozrCnA&t=31m30s[música tecno de Carl Cox^].
-. *Redoble* (*Snare Roll* en inglés): Una secuencia de golpes repetidos de redoblante, con una densidad, registro o amplitud creciente. Puedes usar un clip como RD_FUTURE_DUBSTEP_FILL_1 o HOUSE_BREAK_FILL_003 o usar `makeBeat().` Aquí está un https://www.youtube.com/watch?v=c3HLuTAsbFE[ejemplo^].
-. *Looping* (*Ciclos* en español): Repetir un corto segmento de una melodía antes de una nueva sección. Aquí está un https://www.youtube.com/watch?v=AQg4wnbBjiQ[ejemplo^] de looping en DJ'ing.
+. *_Riser_*: Una nota o ruido cuyo registro se aumenta. Es muy común en EDM (Música Electrónica Dance) y crea la expectativa de un _drop_. Se puede colocar el término de búsqueda "riser" en el Navegador de Sonidos. Se puede usar un platillo crash tocado en reversa como un _riser_, tal como YG_EDM_REVERSE_CRASH_1.
+. *Redoble* (*Snare Roll* en inglés): Una secuencia de golpes repetidos de redoblante, con una densidad, registro o amplitud creciente. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping* (*Ciclos* en español): Repetir un corto segmento de una melodía antes de una nueva sección.
. *Crossfading*: Reducir el volumen de una sección mientras aumentas el volumen de una nueva sección.
. *Anacrusa* (*_Anacrusis_* en inglés): Cuando la melodía de una nueva sección empieza unos tiempos antes del comienzo de la sección.
.PRÁCTICA
****
-Mira esta lista de posibles transiciones, selecciona 2 y trata de averiguar cómo implementarlas usando código. Pueden trabajar en parejas. Después de pensarlo, puedes ver los siguientes ejemplos.
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. Pueden trabajar en parejas. Después de pensarlo, puedes ver los siguientes ejemplos.
-Se debe colocar la transición 1 o 2 compases antes de la nueva sección. Puedes usar varias técnicas de transición a la vez.
+The transition should be placed one or two measures before the new section. Puedes usar varias técnicas de transición a la vez.
****
Drum fills:
@@ -144,7 +144,7 @@ include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
----
-La técnica de silencio de pista (_track dropout_) sólo requiere la modificación de unas llamadas a `fitMedia()`. Aquí hay un ejemplo.
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. Aquí hay un ejemplo.
[role="curriculum-python"]
[source,python]
@@ -177,7 +177,7 @@ include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
[[yourfullsong]]
=== Tu canción completa
-En la programación, se puede crear *abstracciones*: la agrupación de ideas con el fin de formar un solo concepto. En la música, agrupamos las ideas musicales en secciones. Las funciones son un tipo de abstracción que se usa en la informática. Colocan múltiples declaraciones en una herramienta para fácilmente referirse a ellas. Las abstracciones hacen que la estructura del programa sea más clara.
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. En la música, agrupamos las ideas musicales en secciones. Las funciones son un tipo de abstracción que se usa en la informática. Colocan múltiples declaraciones en una herramienta para fácilmente referirse a ellas. Las abstracciones hacen que la estructura del programa sea más clara.
.PRÁCTICA
****
@@ -191,9 +191,9 @@ En la programación, se puede crear *abstracciones*: la agrupación de ideas con
. Usa ciclos `for` para reducir la repetición en tu código.
. Usa funciones personalizadas para definir tus secciones y crear la estructura de tu canción.
. Añade una o dos transiciones significativas.
-. Añade efectos usando setEffect().
+. Add effects with `setEffect()`.
. Añade una o varias declaraciones condicionales.
-. Asegúrate de usar variables para almacenar alguna información como los nombres de los clips de sonido.
+. Make sure you use variables to store some information such as sound constants.
. Asegúrate de usar comentarios para explicar lo que estás haciendo.
. No te olvides de ejecutar tu código y escuchar tu canción con regularidad. Te ayudará a modificarla hasta que te guste como suena.
. Elige un nombre para tu canción.
@@ -213,7 +213,7 @@ include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
----
-En ese ejemplo, ¡hemos usado un ciclo for dentro de una función personalizada! Hemos usado parámetros de la función (`comienzo` y `fin`) dentro del ciclo for.
+In this example, we have used a `for` loop inside a custom function! Hemos usado parámetros de la función (`comienzo` y `fin`) dentro del ciclo for.
[[chapter7summary]]
=== Resumen del capítulo 7
@@ -281,5 +281,5 @@ En ese ejemplo, ¡hemos usado un ciclo for dentro de una función personalizada!
* Consistencia Melódica
* Platillo Crash
* _Riser_
-* Silencios de Pista
+* Track Silencing
--
\ No newline at end of file
diff --git a/src/locales/es/v2/data-structures.adoc b/src/locales/es/v2/data-structures.adoc
index a80a92bbc..fbbd9a2a4 100644
--- a/src/locales/es/v2/data-structures.adoc
+++ b/src/locales/es/v2/data-structures.adoc
@@ -97,7 +97,7 @@ Un consejo útil: la propiedad `length` (`arreglo.length`) devuelve el número d
[role="curriculum-python"]
.PRÁCTICA
****
-Crearemos una introducción aditiva en EarSketch en la cual los instrumentos (pistas) serán añadidos a la música uno por uno a lo largo del tiempo. Por ejemplo, la primera pista empieza en el compás 1; luego la segunda pista empieza en el compás 2, y así sucesivamente. Comúnmente se usa esta técnica en las introducciones de canciones. Escucha https://www.youtube.com/watch?v=L53gjP-TtGEKanye["Power" de Kanye West^].
+Crearemos una introducción aditiva en EarSketch en la cual los instrumentos (pistas) serán añadidos a la música uno por uno a lo largo del tiempo. Por ejemplo, la primera pista empieza en el compás 1; luego la segunda pista empieza en el compás 2, y así sucesivamente. Comúnmente se usa esta técnica en las introducciones de canciones.
Usando una lista y un ciclo for, crea este tipo de introducción de los compases 1 a 5. Como en el ejemplo previo, puedes usar `pista` como contador, y tendrás que crear una variable de `indice`. Además, puedes crear una variable de `compas`, usando la función `len()`.
****
@@ -105,7 +105,7 @@ Usando una lista y un ciclo for, crea este tipo de introducción de los compases
[role="curriculum-javascript"]
.PRÁCTICA
****
-Crearemos una introducción aditiva en EarSketch en la cual los instrumentos (pistas) serán añadidos a la música uno por uno a lo largo del tiempo. Por ejemplo, la primera pista empieza en el compás 1; luego la segunda pista empieza en el compás 2, y así sucesivamente. Comúnmente se usa esta técnica en las introducciones de canciones. Escucha https://www.youtube.com/watch?v=L53gjP-TtGEKanye["Power" de Kanye West^].
+Crearemos una introducción aditiva en EarSketch en la cual los instrumentos (pistas) serán añadidos a la música uno por uno a lo largo del tiempo. Por ejemplo, la primera pista empieza en el compás 1; luego la segunda pista empieza en el compás 2, y así sucesivamente. Comúnmente se usa esta técnica en las introducciones de canciones.
Usando un arreglo y un ciclo for, crea este tipo de introducción de los compases 1 a 5. Como en el ejemplo previo, puedes usar `pista` como contador, y tendrás que crear una variable de `indice`. Además, puedes crear una variable de `compas`, usando la propiedad `length`.
****
@@ -180,7 +180,7 @@ Se ven los índices de la cadena `"EarSketch"` en la siguiente tabla.
* Puedes tener una *subcadena*, también conocida como una porción (_slice_ en inglés) de una cadena más larga. Permite que se divida un ritmo en partes, una técnica popular en la música electrónica y la remezcla. Su sintaxis es `nuevaCadena = viejaCadena[indiceDeComienzo: ultimoIndice]`. La subcadena incluye el carácter `indiceDeComienzo` pero no el carácter `ultimoIndice`. Por ejemplo, `"Sarah[1:4]"` devolverá `"ara"`. Puedes hacer lo mismo con listas: `listaNueva = viejaLista[indiceDeComienzo: ultimoIndice]`.
[role="curriculum-javascript"]
-* Puedes tener una *subcadena*, también conocida como una porción (_slice_ en inglés) de una cadena más larga. Permite que se divida un ritmo en partes, una técnica popular en la música electrónica y la remezcla. Su sintaxis es `nuevaCadena = viejaCadena.substring(indiceDeComienzo, ultimoIndice)`. La subcadena incluye el carácter `indiceDeComienzo` pero no el carácter `ultimoIndice`. Por ejemplo, `"Sarah.substring(1, 4)"` devolverá `"ara"`. Puedes hacer lo mismo con arreglos, usando el método `slice()`: `listaNueva = viejaLista.slice(indiceDeComienzo, ultimoIndice)`. `concat()`, `substring()` y `slice()` son métodos y todos usan la notación de puntos.
+* Puedes tener una *subcadena*, también conocida como una porción (_slice_ en inglés) de una cadena más larga. Permite que se divida un ritmo en partes, una técnica popular en la música electrónica y la remezcla. Su sintaxis es `nuevaCadena = viejaCadena.substring(indiceDeComienzo, ultimoIndice)`. Por ejemplo, `"Sarah.substring(1, 4)"` devolverá `"ara"`. Puedes hacer lo mismo con arreglos, usando el método `slice()`: `listaNueva = viejaLista.slice(indiceDeComienzo, ultimoIndice)`. `concat()`, `substring()` y `slice()` son métodos y todos usan la notación de puntos.
[role="curriculum-python"]
.PRÁCTICA
@@ -247,10 +247,10 @@ include::code-examples/data-structures-string-operations.js.txt[]
----
[role="curriculum-python"]
-Por último, `makeBeat()` puede tener múltiples clips de sonido a la vez. Esto permite que se coloquen todos los sonidos percusivos en una pista usando sólo una línea de `makeBeat()`. En vez de colocar tu archivo de sonido como primer argumento, vas a crear una lista de archivos de sonido. En tu cadena de tiempos, en vez de sólo usar `0` para indicar que se toque un sonido, puedes usar los números de `0` a `9`. Estos números se refieren a un índice en tu lista de sonidos. Mira el siguiente ejemplo de sintaxis de un programa antes y después de combinar sus argumentos en una sola pista, usando un ritmo típico de beatbox que alterna entre dos sonidos.
+Por último, `makeBeat()` puede tener múltiples clips de sonido a la vez. Esto permite que se coloquen todos los sonidos percusivos en una pista usando sólo una línea de `makeBeat()`. En vez de colocar tu archivo de sonido como primer argumento, vas a crear una lista de archivos de sonido. En tu cadena de tiempos, en vez de sólo usar `0` para indicar que se toque un sonido, puedes usar los números de `0` a `9`. Estos números se refieren a un índice en tu lista de sonidos. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
[role="curriculum-javascript"]
-Por último, `makeBeat()` puede tener múltiples clips de sonido a la vez. Esto permite que se coloquen todos los sonidos percusivos en 1 pista usando sólo una línea de `makeBeat()`. En vez de colocar tu archivo de sonido como primer argumento, vas a crear un arreglo de archivos de sonido. En tu cadena de tiempos, en vez de sólo usar `0` para indicar que se toque un sonido, puedes usar los números de `0` a `9`. Estos números se refieren a un índice en tu arreglo de sonidos. Mira el siguiente ejemplo de sintaxis de un programa antes y después de combinar sus argumentos en una sola pista, usando un ritmo típico de beatbox que alterna entre dos sonidos.
+Por último, `makeBeat()` puede tener múltiples clips de sonido a la vez. Esto permite que se coloquen todos los sonidos percusivos en una pista usando sólo una línea de `makeBeat()`. En vez de colocar tu archivo de sonido como primer argumento, vas a crear un arreglo de archivos de sonido. En tu cadena de tiempos, en vez de sólo usar `0` para indicar que se toque un sonido, puedes usar los números de `0` a `9`. Estos números se refieren a un índice en tu arreglo de sonidos. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
[role="curriculum-python"]
[source,python]
@@ -299,43 +299,29 @@ Usando lo que has aprendido en este capítulo, crea ritmos que te gusten con `ma
¡Felicitaciones, ahora has adquirido habilidades musicales y para programar que permiten que seas creativo con EarSketch! Por último, queremos asegurarnos que tu código esté lo más limpio posible. Estos son algunos elementos que puedes revisar:
-[role="curriculum-python"]
* *Concisión* significa que el código es breve y cumple su objetivo eficazmente. Aquí están algunas preguntas que pueden ayudarte a escribir código más conciso:
** ¿Copié y pegué llamadas a función múltiples veces seguidas? Si la respuesta es sí, ¡simplifícalas con un ciclo!
** ¿Estoy volviendo a usar algunos bloques de código? Si la respuesta es sí, ¡ponlos en una función!
** ¿Hay constantes de sonido o expresiones matemáticas que uso repetidamente en mi código? Si la respuesta es sí, ¡asigna variables a las constantes o expresiones! Una lista también podría ser útil.
* La *claridad* tiene que ver con cuán bien el código comunica su función y la intención del programador. Si tus compañeros se pierden en o se confunden con tu código, probablemente no es claro. Éstas son algunas preguntas para ayudarte a clarificar tu código:
-** ¿Completé los comentarios introductorios con mi título de script, autor y descripción?
-** ¿Son descriptivos los nombres de mis variables y funciones? Si no son, cámbialos.
-** ¿He usado comentarios para explicar cada bloque de código y cualquier línea de código que sea potencialmente confusa?
-** ¿He usado estructuras computacionales como funciones personalizadas y ciclos para ayudar a organizar mi código?
-** ¿La estructura de mi script refleja la estructura de mi canción? Esto ayuda a que la lectura fluya bien.
-
-[role="curriculum-javascript"]
-* *Concisión* significa que el código es breve y cumple su objetivo eficazmente. Aquí están algunas preguntas que pueden ayudarte a escribir código más conciso:
-** ¿Copié y pegué llamadas a función múltiples veces seguidas? Si la respuesta es sí, ¡simplifícalas con un ciclo!
-** ¿Estoy volviendo a usar algunos bloques de código? Si la respuesta es sí, ¡ponlos en una función!
-** ¿Hay constantes de sonido o expresiones matemáticas que uso repetidamente en mi código? Si la respuesta es sí, ¡asigna variables a las constantes o expresiones! Un arreglo también podría ser útil.
-* La *claridad* tiene que ver con cuán bien el código comunica su función y la intención del programador. Si tus compañeros se pierden en o se confunden con tu código, probablemente no es claro. Éstas son algunas preguntas para ayudarte a clarificar tu código:
-** ¿Completé los comentarios introductorios con mi título de script, autor y descripción?
** ¿Son descriptivos los nombres de mis variables y funciones? Si no son, cámbialos.
** ¿He usado comentarios para explicar cada bloque de código y cualquier línea de código que sea potencialmente confusa?
** ¿He usado estructuras computacionales como funciones personalizadas y ciclos para ayudar a organizar mi código?
** ¿La estructura de mi script refleja la estructura de mi canción? Esto ayuda a que la lectura fluya bien.
-En la programación, es común escuchar las *opiniones de tus compañeros*. Te ayudan a mejorar tu programa y música. Las opiniones tienen que ser *constructivas*, lo cual quiere decir que ayudan al compañero con su desempeño en vez de desanimarlo. Cuando des tus opiniones:
+En la programación, es común escuchar las *opiniones de tus compañeros*. Te ayudan a mejorar tu programa y música. No se trata de una competencia entre tu código y el código de otros compañeros. Las opiniones tienen que ser *constructivas*, lo cual quiere decir que ayudan al compañero con su desempeño en vez de desanimarlo. Cuando des tus opiniones:
* *Sé específico* - Menciona bloques y líneas específicos del código y compases y pistas específicos de la música.
* *Sé descriptivo* - Explica tu razonamiento y el proceso que usarías para mejorar un script.
* *Ten en cuenta la visión y las metas musicales de tu compañero* - Tus propios gustos musicales no deberían ser un factor cuando evalúes la música de tu compañero.
* *Sé positivo* - Además de comentar sobre lo que se debe mejorar, destaca los mejores bloques de código y pasajes musicales.
-* *No hagas comparaciones* - Reconoce que el código de tu compañero es propio de él o ella. No se trata de una competencia entre tu código y el código de otros compañeros.
+* *No hagas comparaciones* - Reconoce que el código de tu compañero es propio de él o ella.
Asimismo, cuando recibas las opiniones de otros:
* *Sé específico* - Indica cuál de los bloques o líneas de código y cuál de las pistas o compases de música te están causando problemas. Esto permitirá que tus compañeros te proporcionen comentarios más útiles.
* *Escucha* - Espera hasta que tu compañero haya terminado de hablar antes de responder. Presta mucha atención a la información que tu compañero está impartiendo. Escribe comentarios de código basándose en sus opiniones. Estos comentarios pueden ser útiles mientras haces tus revisiones.
-* *Haz preguntas* - Pregunta sobre la lógica de lo que te haga dudar. Pregunta de problemas, errores, coherencia musical o cualquier elemento de la corrección.
+* Pregunta de problemas, errores, coherencia musical o cualquier elemento de la corrección.
[role="curriculum-python"]
.PRÁCTICA
diff --git a/src/locales/es/v2/effects-and-envelopes.adoc b/src/locales/es/v2/effects-and-envelopes.adoc
index 1f1b1551c..252d3aa36 100644
--- a/src/locales/es/v2/effects-and-envelopes.adoc
+++ b/src/locales/es/v2/effects-and-envelopes.adoc
@@ -20,12 +20,12 @@ video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
[[video4js]]
video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
-Se usa la función `setEffect()`, que requiere 4 argumentos. En este aspecto se parece a `fitMedia()`:
+Se usa la función `setEffect()`, que requiere 4 argumentos.
-. *numeroDePistaMusical* (_trackNumber_): La pista musical a la cual se añade el efecto.
-. *nombreDelEfecto*: El efecto específico que se usa.
-. *parametroParaElEfecto*: El parámetro, o configuración, para el efecto.
-. *valorDelEfecto*: El valor del parámetro expresado como un número en un rango específico. El rango depende del parámetro del efecto.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
.PRÁCTICA
****
@@ -70,7 +70,7 @@ Por ejemplo, 'setEffect(1, DELAY, DELAY_TIME, 500)' pone un efecto de retardo en
. Lee sobre el efecto de retardo (_delay_) en el capítulo que trata sobre la lista de efectos aquí: <>
. Luego ejecuta el código a continuación y escucha la música sin efectos
. Descomenta la primera línea `setEffect()` y escucha la diferencia
-. Luego descomenta la segunda línea `setEffect()` y escucha la diferencia ("descomentar" significa borrar la sintaxis que se usa para los comentarios, `#` o `//`, del bloque de código). Toma en cuenta que la duración del efecto de retardo (_delay_), 500ms, es la misma duración que una pulsación. Ya que el tempo es 120 pulsaciones por minuto, hay una pulsación cada 60/120 = 1/2 de segundo. 1 segundo son 1000ms, entonces una 1/2 de segundo son 1000/2 = 500ms.
+. Luego descomenta la segunda línea `setEffect()` y escucha la diferencia ("descomentar" significa borrar la sintaxis que se usa para los comentarios, `#` o `//`, del bloque de código). Ya que el tempo es 120 pulsaciones por minuto, hay una pulsación cada 60/120 = 1/2 de segundo. 1 segundo son 1000ms, entonces una 1/2 de segundo son 1000/2 = 500ms.
Puedes tratar de modificar la duración del efecto de retardo y observar si tu música suena mejor o no.
****
@@ -106,9 +106,9 @@ Hasta ahora, has estado usando varias funciones en EarSketch como `fitMedia()` o
Cada argumento de la función puede requerir un tipo específico de dato. El orden de los argumentos es importante. Aquí hay algunos ejemplos de tipos de datos:
* *Números*
-** *Enteros* (o "int") son números enteros, como 0, 5, o -26.
-** Los números de *coma flotante* (_floating point_ en inglés) son números racionales como 0.125 o -21.0. Por ejemplo, los argumentos de número de pista, compás inicial y compás final de la función `fitMedia()` son todos números.
-* *Las cadenas*. Son también conocidas como cadenas de caracteres en español o _strings_ en inglés. Una cadena de tiempos, como `"0000---0000---"`, se usa como argumento en la función `makeBeat()`.
+** *Enteros* (o "int") son números enteros, como 0, 5, o -26. Example: track numbers
+** Los números de *coma flotante* (_floating point_ en inglés) son números racionales como 0.125 o -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
Ahora, vamos a jugar más con la función `setEffect()`. El siguiente video muestra cómo usar algunos efectos:
@@ -118,8 +118,6 @@ more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNP
("videos revamping" tab)
////
-_UN VIDEO SOBRE CÓMO HACER EFECTOS VIENE PRONTO_
-
*Reverb* (una abreviación en inglés que significa reverberación) es cuando el sonido rebota de las paredes y regresa a tus oídos. Da la sensación de espacio a tu sonido. Piensa en la diferencia entre hablar en una pequeña recámara y hablar en una iglesia grande. En cuanto más grande y "plano" el cuarto, más tiempo tarda para que la onda regrese a tus oídos, lo cual produce ese sonido de "cuarto grande con eco". El efecto `REVERB` tiene parámetros para controlar el tiempo que el sonido toma para desaparecer (`REVERB_DECAY`) y la intensidad del efecto (`MIX`).
Escucha los clips a continuación para oír el resultado de añadir reverberación a la pista:
@@ -158,15 +156,15 @@ Vamos a usar 2 parejas valor-tiempo. Cada pareja contiene un valor de efecto y u
[caption="Figure 5.3.1: "]
image::../media/U2/NewEnvelope.png[Alt Text]
-Para cambiar un envelope, sólo se necesita la función `setEffect()` con 7 argumentos. Los últimos 4 argumentos son las 2 parejas valor-tiempo:
+Para cambiar un envelope, sólo se necesita la función `setEffect()` con 7 argumentos.
-. trackNumber (numeroDePista)
-. effectName (nombreDelEfecto)
-. effectParameter (parametroDelEfecto)
+. track
+. type
+. parameter
. effectStartValue (valorInicialDelEfecto)
-. effectStartMeasure (compasInicialDelEfecto)
+. start
. effectEndValue (valorFinalDelEfecto)
-. effectEndMeasure (compasFinalDelEfecto)
+. end
Los últimos 3 de los 7 parámetros son *parámetros opcionales*. Si no se especifican, como fue el caso cuando sólo asignamos 4 parámetros a `setEffect()`, el efecto se aplicará a la pista entera.
@@ -213,7 +211,7 @@ Crea una nueva canción. Usa un ciclo `for` para añadir un envelope a todas las
Pide que tu compañero/a escuche tu canción, con o sin el efecto (para escuchar tu canción sin el efecto, comenta las líneas que crean el efecto). Tu compañero/a debe adivinar cuál es el efecto que añadiste.
****
-A continuación, hay un ejemplo de la práctica anterior. Cada iteración del ciclo añade un segmento del envelope que dura un compás. Automatizar el parámetro GAIN crea aumentos/desvanecimientos rítmicos de volumen, un efecto popular en EDM (música electrónica dance). Ve a la canción https://www.youtube.com/watch?v=Us_U-d2YN5Y[Rhythm] de Lvly para un buen ejemplo. Trata de prender y apagar el bypass del efecto en la EAD para escuchar la diferencia que el efecto hace (el botón de "bypass" a la izquierda de la pista del efecto en tu EAD).
+A continuación, hay un ejemplo de la práctica anterior. Cada iteración del ciclo añade un segmento del envelope que dura un compás. Automatizar el parámetro GAIN crea aumentos/desvanecimientos rítmicos de volumen, un efecto popular en EDM (música electrónica dance). Trata de prender y apagar el bypass del efecto en la EAD para escuchar la diferencia que el efecto hace (el botón de "bypass" a la izquierda de la pista del efecto en tu EAD).
[role="curriculum-python"]
[source,python]
@@ -249,10 +247,10 @@ include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
* *Los efectos* cambian las características de un sonido para hacerlas más únicas.
* *El volumen* tiene que ver con la intensidad sonora. *El efecto de retardo (_delay_)* crea un eco. *La reverberación (_reverb_)* da la sensación de tocar el sonido en un cuarto grande. *Panning* (movimiento panorámico del sonido) inclina (o "panea") tu música hacia la izquierda o derecha.
* Los efectos de EarSketch se implementan usando la función `setEffect()`. Su sintaxis es `setEffect(numeroDePista, nombreDelEfecto, parametroDelEfecto, valorDelEfecto)`.
-** *numeroDePistaMusical (_trackNumber_):* La pista musical a la cual se añade el efecto.
-** *nombreDelEfecto:* El efecto específico que se usa.
-** *parametroParaElEfecto:* La configuración que se usa para el efecto.
-** *valorDelEfecto:* El valor del parámetro (un número en un rango específico).
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
* *Las funciones* contienen instrucciones que la computadora ejecuta. Se envían datos a las funciones a través de *argumentos*, que afectan cómo se ejecuta la función. La sintaxis de una *llamada* a función con dos argumentos es `miFuncion(argumento1, argumento2)`. Un ejemplo de la sintaxis de una *llamada* a función con 4 argumentos es `makeBeat(bombo, 2, compas, ritmoDeBombo)`.
* Se puede encontrar una lista completa de los efectos de EarSketch y sus parámetros en <>, junto con descripciones de cada uno.
* *Los envelopes* (una palabra que significa "envolventes" en español) definen cómo se cambia un parámetro de un efecto con el tiempo. Usan parejas valor-tiempo, como _(valor, tiempo, valor, tiempo)_.
@@ -280,7 +278,7 @@ include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
* Nombre del clip
* Nombre del efecto
* Valor del efecto
-* Número de pista musical
+* trackNumber (numeroDePista)
--
[question]
@@ -301,7 +299,7 @@ include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
[answers]
* Duración del clip
* Valor de comienzo
-* Número de pista musical
+* trackNumber (numeroDePista)
* Efecto
--
diff --git a/src/locales/es/v2/get-user-input.adoc b/src/locales/es/v2/get-user-input.adoc
index b84a58b86..236327a63 100644
--- a/src/locales/es/v2/get-user-input.adoc
+++ b/src/locales/es/v2/get-user-input.adoc
@@ -19,8 +19,8 @@ video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
* Además de requerir ciertos argumentos (parámetros), las funciones pueden generar un valor. En programación, le llamamos a ésto devolver un valor.
-* La *declaración de retorno* es una declaración dentro del cuerpo de la función que: 1. pide que la función devuelva un valor cuando se llama. 2. señala que la función se detenga. Si hay algunas declaraciones después de la palabra clave `return`, se ignorarán.
-* Para usar el valor que la función devuelve, crea una variable y asígnala a la llamada a función. Recuerda que las variables no llevan acento.
+* La *declaración de retorno* es una declaración dentro del cuerpo de la función que: 1. 2. señala que la función se detenga. Si hay algunas declaraciones después de la palabra clave `return`, se ignorarán.
+* Para usar el valor que la función devuelve, crea una variable y asígnala a la llamada a función.
* No es obligatorio tener una declaración de retorno. Sin una declaración de retorno una función no genera ningún valor. `fitMedia()` y `setEffect()` son ejemplos de funciones que no devuelven nada.
Aquí hay un ejemplo usando código:
@@ -83,7 +83,7 @@ En el cuerpo de la función, debes tener una declaración condicional que evalua
Entonces llama a la función en compases diferentes escogiendo variaciones diferentes.
****
-Aquí hay un ejemplo usando código:
+Aquí hay un ejemplo:
[role="curriculum-python"]
[source,python]
@@ -188,8 +188,8 @@ Primero vamos a considerar la lógica booleana. Sabes que los *operadores de com
Ahora vamos a considerar los *operadores booleanos*: ayudan a combinar varios booleanos. Hay 3 operadores booleanos:
[role="curriculum-python"]
-* `and` ("y" en español): requiere 2 valores booleanas y devuelve `True` sólo cuando los dos valores son `True` (ciertos). De lo contrario devuelve `False`.
-* `or` ("o" en español): requiere 2 valores booleanos y devuelve `True` cuando por lo menos 1 valor es `True`. De lo contrario devuelve `False`.
+* `and` ("y" en español): requiere 2 valores booleanas y devuelve `True` sólo cuando los dos valores son `True` (ciertos).
+* `or` ("o" en español): requiere 2 valores booleanos y devuelve `True` cuando por lo menos 1 valor es `True`.
* `not` ("no" en español): requiere 1 valor booleano y devuelve el booleano opuesto.
[role="curriculum-javascript"]
@@ -221,7 +221,7 @@ Según tus cálculos, ¿a qué equivalen las siguientes expresiones? ¿`true` o
* `!true`
* `true && false`
* `true || false`
-* `true || false`
+* De lo contrario devuelve `False`.
* `(true && false) || true`
* `true && !false`
* `!(false || false)`
@@ -291,8 +291,8 @@ Este es el desafío del _Jukebox_: escribe un script que pedirá que el usuario
`int()` convierte una cadena con dígitos en un número entero. `float()` convierte una cadena con dígitos y un punto decimal en un float, o número decimal.
* Se puede *concatenar* (unir) cadenas: "Hola"+"Mundo" se combinarán para formar "HolaMundo".
* La *lógica booleana* incluye operaciones booleanas. Aquí están los operadores booleanos:
-** `and` ("y" en español): requiere 2 valores booleanas y devuelve `True` sólo cuando los dos valores son `True` (ciertos). De lo contrario devuelve `False`.
-** `or` ("o" en español): requiere 2 valores booleanos y devuelve `True` cuando por lo menos 1 valor es `True`. De lo contrario devuelve `False`.
+** `and` ("y" en español): requiere 2 valores booleanas y devuelve `True` sólo cuando los dos valores son `True` (ciertos).
+** `or` ("o" en español): requiere 2 valores booleanos y devuelve `True` cuando por lo menos 1 valor es `True`.
** `not` ("no" en español): requiere 1 valor booleano y devuelve el booleano opuesto.
* Ahora tienes varias herramientas para introducir variaciones en tu música: las respuestas del usuario pueden determinar los elementos. Puedes añadir un parámetro a tu función personalizada para seleccionar una variación cuando llames a tu función.
@@ -302,8 +302,8 @@ Este es el desafío del _Jukebox_: escribe un script que pedirá que el usuario
* Algunas funciones permiten que conviertas los datos de un tipo a otro. Por ejemplo, str() convierte los datos en una cadena. `String()` - convierte a cualquier valor en una cadena. Toma en cuenta que esta vez el nombre de la función empieza con una letra en mayúscula. `Number()` convierte una cadena en un número.
* Se puede *concatenar* (unir) cadenas: "Hola"+"Mundo" se combinarán para formar "HolaMundo".
* La *lógica booleana* incluye operaciones booleanas. Aquí están los operadores booleanos:
-** `&&`: se llama "and" ("y" en español); requiere 2 valores booleanos y devuelve `true` sólo cuando los dos valores son `true` (ciertos). De lo contrario devuelve `false`.
-** `||`: se llama "or" ("o" en español); requiere 2 valores booleanos y devuelve `true` cuando por lo menos 1 valor es `true`. De lo contrario devuelve `false`.
+** `&&`: se llama "and" ("y" en español); requiere 2 valores booleanos y devuelve `true` sólo cuando los dos valores son `true` (ciertos).
+** `||`: se llama "or" ("o" en español); requiere 2 valores booleanos y devuelve `true` cuando por lo menos 1 valor es `true`.
** `!`: se llama "not" ("no" en español); requiere 1 valor booleano y devuelve el booleano opuesto.
* Ahora tienes varias herramientas para introducir variaciones en tu música: las respuestas del usuario pueden determinar los elementos. Puedes añadir un parámetro a tu función personalizada para seleccionar una variación cuando llames a tu función.
diff --git a/src/locales/es/v2/getting-started.adoc b/src/locales/es/v2/getting-started.adoc
index e2192402c..224a9f048 100644
--- a/src/locales/es/v2/getting-started.adoc
+++ b/src/locales/es/v2/getting-started.adoc
@@ -1,16 +1,16 @@
[[getstartedwithearsketch]]
-== Empezamos con EarSketch
+== Getting Started with EarSketch
:nofooter:
-En este capítulo vas a aprender cómo funciona EarSketch, cómo colocar sonidos (clips) en tu música, y cómo depurar tu código.
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
[[discoverearsketch]]
=== Descubre EarSketch
:nofooter:
-En EarSketch, darás instrucciones a la computadora escribiendo código. Una línea del código corresponde a una instrucción. Todas las instrucciones juntas forman el programa (estas instrucciones también se pueden llamar un algoritmo). De la misma manera que se usan las recetas de un libro de cocina para preparar una comida, se ejecuta un programa de EarSketch para crear una canción. ¿Dónde se coloca el código dentro de un programa? ¡Averígualo mirando este video!
+En EarSketch, darás instrucciones a la computadora escribiendo código. Una línea del código corresponde a una instrucción. Todas las instrucciones juntas forman el programa (estas instrucciones también se pueden llamar un algoritmo). De la misma manera que se usan las recetas de un libro de cocina para preparar una comida, se ejecuta un programa de EarSketch para crear una canción. How does it work? Find out in the video below!
[role="curriculum-mp4"]
[[video1a]]
@@ -20,24 +20,22 @@ video::./videoMedia/1_1_Discover_EarSketch.mp4[]
TODO: upload video
////
-Para usar EarSketch
+As you become familiar with EarSketch these are the main panels.
-. Puedes navegar y seleccionar sonidos en el *navegador de sonidos*.
-. Escribirás código en el *editor de código*.
-. Cuando hagas clic en el botón de *ejecutar*, verás tu música en la *Estación de Audio Digital* (o *EAD*).
-. Puedes entonces hacer clic en el botón de *play* para escuchar tu música.
-. ¡Puedes seguir cambiando tu programa (tu código) hasta que estés satisfecho con lo que escuchas!
-. Puedes abrir y cerrar este cuadro de currículo usando el icono más bajo de la barra izquierda
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
-_¿Qué es una EAD?_
+{nbsp} +
-Una *Estación de Audio Digital*, o *EAD*, es un software que produce o edita clips de audio o sonido en una computadora, sea en un estudio profesional o en tu computadora personal.
+_¿Qué es una EAD?_
-Algunas EADs populares incluyen https://www.ableton.com/[Ableton^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^] y http://www.reaper.fm/[Reaper^].
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
-Con una EAD, puedes grabar, editar, visualizar y poner archivos de audio. Estos archivos de audio se llaman *clips*.
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
-EarSketch es igual que una EAD, con la diferencia de que puedes programar directamente los elementos musicales usando código.
+EarSketch is DAW that allows you to create music by writing code.
Este video explica cómo se hace pleno uso de la EAD:
@@ -49,7 +47,7 @@ video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
////
-¡Vamos a tratar de ejecutar un programa en EarSketch! En la casilla de abajo, haz clic en el icono azul del portapapeles que se encuentra en la esquina derecha superior. Así se pegará el código de ejemplo en el *editor de código*. No hace falta entender el código todavía. Solamente haz clic en el botón de _ejecutar_ y tu música aparecerá en la EAD. Puedes tocar _play_ para escucharla.
+¡Vamos a tratar de ejecutar un programa en EarSketch! On the box below, press the blue clipboard icon in the top right corner. Así se pegará el código de ejemplo en el *editor de código*. No hace falta entender el código todavía. Solamente haz clic en el botón de _ejecutar_ y tu música aparecerá en la EAD. Puedes tocar _play_ para escucharla.
[role="curriculum-python"]
[source,python]
@@ -68,18 +66,17 @@ include::code-examples/getting-started-intro-script.js.txt[]
[[createanewscript]]
=== ¡Crea tu primer script!
-En EarSketch, cada script que escribas corresponderá a una canción. Vamos a ver cómo crear un script:
+Let's see how to create a script from scratch.
-. *Iniciar una sesión (_sign in_) o crear una nueva cuenta* en la esquina derecha superior de tu pantalla. Si haces clic en el botón blanco que dice "Crear / Reiniciar la cuenta", puedes recuperar una contraseña perdida o crear una nueva cuenta ("Registrar una Nueva Cuenta"). _Advertencia:_ en general en el Internet, no uses la misma contraseña para todas tus cuentas y nunca compartas tus contraseñas.
-. *Haz clic para crear.* Si no tienes abierto ningún script, haz clic en el enlace grande azul en el editor de código que dice "¡Haz clic aquí para crear un nuevo script!".
+. *Create.* In the editor tabs, click the white "+" icon.
+
-Si ya tienes un script o más abiertos, entonces haz clic en el icono "+" azul a lado de las pestañas.
+If this is your first script, click the large blue text "Click here to create a new script!"
+
[[newscriptplus]]
.Crea nuevos scripts, abre scripts
[caption="Figure 1.2.1: "]
image::../media/U1P1/NewScriptPlus.png[Alt Text]
-. *Elige un nombre e idioma:* El cuadro de diálogo que dice "Crear un nuevo script" se abre. Ponle nombre a tu nuevo script: es el nombre de tu canción. Entonces selecciona el lenguaje de programación (Python o Javascript). Por fin, haz clic en el botón de "Crear".
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
+
[[newscriptpromptpy]]
.El cuadro de diálogo para crear un nuevo script
@@ -92,20 +89,17 @@ image::../media/U1P1/newScriptPromptPY.png[Alt Text]
[role="curriculum-javascript"]
[caption="Figure 1.2.2: "]
image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
*_¿Qué es un lenguaje de programación?_*
-El código está escrito en un *lenguaje de programación*, el cual incluye su propio vocabulario y sintaxis, igual que cualquier lenguaje regular. Tienes que saber cuáles son las reglas gramaticales de tu lenguaje de programación, o la computadora no podrá ejecutar tus instrucciones.
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
-En EarSketch, puedes programar en Python o JavaScript.
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
-[role="curriculum-python"]
-_Estás en modo Python. Compañías como Google, Yahoo, NASA y Disney usan Python para programar juegos como Civilization 4, Battlefield 2 y Crystal Space._
-
-[role="curriculum-javascript"]
-_Estás en modo JavaScript. JavaScript es uno de los diez lenguajes de programación más populares del mundo. Casi todas las páginas web usan JavaScript._
-
-En su nivel más profundo, las computadoras operan en combinaciones de 1s y 0s: números binarios. Eso se debe a que los componentes electrónicos pueden reaccionar de modo diferente si hay una corriente eléctrica (1) o si no hay corriente eléctrica (0). Cuando se toca el botón de *ejecutar*, la computadora traduce las instrucciones de Python o JavaScript a código binario. Luego el código es *ejecutado* por la computadora, y verás tu música aparecer en la EAD.
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
[[fitmedia]]
=== La función `fitMedia()`
@@ -122,25 +116,51 @@ video::./videoMedia/1_3_fitmedia_py.mp4[]
[[video110js]]
video::./videoMedia/1_3_fitmedia_js.mp4[]
-Para agregar un clip de sonido a la EAD, empezamos escribiendo `fitMedia()`. Entre los paréntesis, tendremos 4 parámetros, separados por comas:
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
-. *Un nombre de clip*: coloca tu cursor entre los paréntesis, ve al navegador de sonidos, selecciona un clip y pégalo usando el icono azul de pegar.
-. *El número de pista musical*: las pistas musicales (tracks) son las filas que atraviesan la EAD; te ayudan a organizar tus sonidos por tipo de instrumento (voz, guitarra solista, guitarra rítmica, bajo, baterías, etc.). Para tu primer sonido, puedes empezar en la pista musical uno.
-. *El compás de comienzo*: el compás cuando tu sonido empezará a sonar. Los compases son unidades de tiempo musical. Un compás contiene 4 tiempos. Puedes empezar tu primer sonido en compás número uno.
-. *El último compás*: el compás cuando tu sonido deja de sonar.
+_Example:_
-_Por ejemplo:_ `fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)` colocará el sonido `Y18_DRUM_SAMPLES_2` en la pista musical 1 (track 1) del compás 1 al compás 5.
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
-Entonces, haz clic en _ejecutar_: debes poder visualizar tu sonido en la EAD. Cuando oprimas _play_ puedes escucharlo.
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. Una *declaración* le indica a la computadora que ejecute una acción.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
[role="curriculum-javascript"]
-Una *declaración* le indica a la computadora que ejecute una acción. Por ejemplo, `fitMedia(Y18_DRUM_SAMPLES_1, 1, 1, 5);` es una declaración. Cada declaración en JavaScript *_debe terminar con punto y coma_*.
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
////
OPTIONAL
////
-El *Navegador de Sonidos*: Navega o busca entre los 4,000 clips de audio para usarlos en tu música, hechos por los músicos/productores https://en.wikipedia.org/wiki/Young_Guru[Young Guru^], https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^], https://en.wikipedia.org/wiki/Ciara[Ciara^], https://en.wikipedia.org/wiki/Common_(rapper)[Common^], https://en.wikipedia.org/wiki/Pharrell_Williams[Pharrell Williams^], Irizarry y Caraballo y https://www.sndbrd.com/[Milknsizz^].
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
////
END OF OPTIONAL
@@ -150,7 +170,7 @@ END OF OPTIONAL
OPTIONAL
////
-Mira algunos ejemplos de código usando `fitMedia()` (Recuerda que puedes hacer clic en ícono azul de portapapeles en la esquina superior derecha de la casilla para pegar el código en un nuevo archivo):
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
[role="curriculum-python"]
[source,python]
@@ -184,9 +204,9 @@ include::code-examples/getting-started-using-fitmedia-2.js.txt[]
****
Cómo usar sonidos que te gusten:
-. Coloca sonidos en 2 pistas musicales diferentes
-. Coloca sonidos de compás 2 a 12
-. Crea una corta canción con 3 pistas musicales que duren 8 compases o más
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
Para cada ejercicio, pide que tu compañero/a escuche tu canción.
@@ -216,7 +236,7 @@ OPTIONAL
¿Cuáles son los diferentes tipos de errores?
-. *Los errores de sintaxis*: Tu programa no se ejecuta porque tu código rompe las reglas de *sintaxis* del lenguaje (por ejemplo, te olvidaste cerrar un paréntesis o escribiste fitMedia incorrectamente).
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
. *Los errores en tiempo de ejecución*: Tu programa se empieza a ejecutar, pero se detiene por un error.
. *Los errores de lógica*: Tu programa se ejecuta, pero no hace lo que se espera. Puedes arreglar estos errores mirando la EAD para revisar si los clips que quiso agregar fueron en realidad agregados en el lugar correcto.
@@ -228,19 +248,19 @@ Algunos errores comunes son:
[role="curriculum-python"]
. *Los errores ortográficos:* Revisa la ortografía cuando uses una función como `fitMedia()` o constantes sonoras.
-. *Mayúscula o minúscula:* Para la mayoría de las palabras usadas en la programación, hay que fijarse si cada letra debe ser en mayúscula o minúscula (la computadora reconoce la diferencia entre ambas). Presta atención a las minúsculas y mayúsculas. Por ejemplo, escribe `fitMedia()` y no `FitMedia()` o `fitmedia()`. La mayoría de los caracteres en un script siguen una regla llamada *_camel-caps_*: se escribe la primera palabra en minúscula, y se escribe la primera letra de las siguientes palabras en mayúscula, igual que en el ejemplo `ejemploNombreDeLaFuncion()`.
+. *Mayúscula o minúscula:* Para la mayoría de las palabras usadas en la programación, hay que fijarse si cada letra debe ser en mayúscula o minúscula (la computadora reconoce la diferencia entre ambas). Presta atención a las minúsculas y mayúsculas. Por ejemplo, escribe `fitMedia()` y no `FitMedia()` o `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
. *Paréntesis:* Si se te olvida poner un paréntesis inicial o un segundo paréntesis donde es necesario causará un <>.
-. *La configuración del script:* EarSketch agrega código de configuración a un nuevo script automáticamente, pero tal vez borraste sin querer `from earsketch import *`.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
. *Puntuación:* La falta de comas u otros errores de puntuación
[role="curriculum-javascript"]
. *Los errores ortográficos:* Revisa la ortografía cuando uses una función como `fitMedia()` o constantes sonoras.
-. *Mayúscula o minúscula:* Para la mayoría de las palabras usadas en la programación, hay que fijarse si cada letra debe ser en mayúscula o minúscula (la computadora reconoce la diferencia entre ambas). Presta atención a las minúsculas y mayúsculas. Por ejemplo, escribe `fitMedia()` y no `FitMedia()` o `fitmedia()`. La mayoría de los caracteres en un script siguen una regla llamada *_camel-caps_*: se escribe la primera palabra en minúscula, y se escribe la primera letra de las siguientes palabras en mayúscula, igual que en el ejemplo `ejemploNombreDeLaFuncion()`.
+. *Mayúscula o minúscula:* Para la mayoría de las palabras usadas en la programación, hay que fijarse si cada letra debe ser en mayúscula o minúscula (la computadora reconoce la diferencia entre ambas). Presta atención a las minúsculas y mayúsculas. Por ejemplo, escribe `fitMedia()` y no `FitMedia()` o `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
. *Paréntesis:* Si se te olvida poner un paréntesis inicial o un segundo paréntesis donde es necesario causará un <>.
. *Puntuación:* La falta de comas u otros errores de puntuación
¡Es hora de practicar!
-Encuentra los 5 errores en el siguiente código:
+Find the five errors in the following code:
[role="curriculum-python"]
[source,python]
@@ -260,10 +280,10 @@ OPTIONAL
Aquí está la respuesta
-. La función `setTempo()` falta un paréntesis
-. Al primer `fitMedia()` le falta una 'e'
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
. Al primer `fitMedia()` le falta una coma entre el tercer y cuarto parámetro
-. Al segundo `fitMedia()` le falta una 'M' en mayúscula
+. The second `fitMedia()` is missing an uppercase `M`
. En el segundo `fitMedia()`, el orden de los parámetros no es correcto: el nombre del clip de sonido debe ir antes del número de pista musical
////
@@ -279,43 +299,22 @@ TODO: when options are ready, modify the link
[[chapter1summary]]
=== Resumen del capítulo 1
-[role="curriculum-python"]
-* Una línea de código es una instrucción que la computadora ejecute. Todas las instrucciones juntas forman el programa.
-* *EADs* son software de computadora especializado para grabar, editar y poner archivos de audio digital, o *clips*. EarSketch es una EAD que permite que se coloquen clips de audio en una secuencia de tiempo usando código.
-* Para hacer música en EarSketch, primero se escribe código en el cuadro del editor de código. Después de hacer clic en ejecutar, se toca la música en el cuadro de la EAD.
-* Puedes encontrar los clips de sonido en el Navegador de Sonidos. Para usarlos, hay que escribir o pegar sus nombres todo en mayúsculas en el código.
-* Un *programa* de computadora es una secuencia de instrucciones que la computadora ejecuta para realizar una tarea específica.
-* *Lenguajes de programación* son colecciones de palabras y símbolos que la computadora entiende. Un lenguaje de programación sigue una sintaxis a fin de organizar el código.
-* Un script de EarSketch consiste de una sección de comentarios, configuración, y música.
-* Para crear un nuevo script haz clic en el enlace azul grande o el icono "+" si otro script ya está abierto.
-* `fitMedia()` es la manera principal de agregar sonido a la EAD. Tiene cuatro argumentos, la información que necesita para hacer música:
-** *nombreDelArchivo:* El clip de sonido que se mete en la EAD.
-** *numeroDePistaMusical (trackNumber):* La pista en la cual se coloca la música.
-** *momentoDeComienzo:* El compás en el cual el clip de sonido empezará.
-** *momentoCuandoTermina:* El compás en el cual el clip de sonido terminará.
-* *Depuración* es el proceso de encontrar y arreglar *_bugs_*, errores hechos por el/la programador/a.
-* Las reglas de *sintaxis* determinan cómo se escribe el código en el lenguaje de programación en cuestión.
-* La *consola* muestra información sobre el estado de un programa. Es útil para depurar errores de sintaxis.
-* Errores comunes de principiantes incluyen las erratas, el uso incorrecto de mayúsculas o minúsculas, la falta de paréntesis, la configuración incorrecta del script...
-
-[role="curriculum-javascript"]
-* Una línea de código es una instrucción que la computadora ejecute. Todas las instrucciones juntas forman el programa.
-* *EADs* son software de computadora especializado para grabar, editar y poner archivos de audio digital, o *clips*. EarSketch es una EAD que permite que se coloquen clips de audio en una secuencia de tiempo usando código.
-* Para hacer música en EarSketch, primero se escribe código en el cuadro del editor de código. Después de hacer clic en ejecutar, se toca la música en el cuadro de la EAD.
-* Puedes encontrar los clips de sonido en el Navegador de Sonidos. Para usarlos, hay que escribir o pegar sus nombres todo en mayúsculas en el código.
-* Un *programa* de computadora es una secuencia de instrucciones que la computadora ejecuta para realizar una tarea específica.
-* *Lenguajes de programación* son colecciones de palabras y símbolos que la computadora entiende. Un lenguaje de programación sigue una sintaxis a fin de organizar el código.
-* Un script de EarSketch consiste de una sección de comentarios, configuración, y música.
-* Para crear un nuevo script haz clic en el enlace azul grande o el icono "+" si otro script ya está abierto.
-* `fitMedia()` es la manera principal de agregar sonido a la EAD. Tiene cuatro argumentos, la información que necesita para hacer música:
-** *nombreDelArchivo:* El clip de sonido que se mete en la EAD.
-** *numeroDePistaMusical (trackNumber):* La pista en la cual se coloca la música.
-** *momentoDeComienzo:* El compás en el cual el clip de sonido empezará.
-** *momentoCuandoTermina:* El compás en el cual el clip de sonido terminará.
-* *Depuración* es el proceso de encontrar y arreglar *_bugs_*, errores hechos por el/la programador/a.
-* Las reglas de *sintaxis* determinan cómo se escribe el código en el lenguaje de programación en cuestión.
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
* La *consola* muestra información sobre el estado de un programa. Es útil para depurar errores de sintaxis.
-* Errores comunes de principiantes incluyen las erratas, el uso incorrecto de mayúsculas o minúsculas, la falta de paréntesis, la configuración incorrecta del script...
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
[[chapter-questions]]
=== Preguntas
diff --git a/src/locales/es/v2/loops-and-layers.adoc b/src/locales/es/v2/loops-and-layers.adoc
index 72cb83a72..2a02b5ffd 100644
--- a/src/locales/es/v2/loops-and-layers.adoc
+++ b/src/locales/es/v2/loops-and-layers.adoc
@@ -10,7 +10,7 @@ En este capítulo aprenderás sobre ciclos `for` y cómo puedes crear repetició
Igual que los músicos pueden tocar un patrón una y otra vez en un *ciclo* (_loop_ en inglés), los programadores pueden pedir que la computadora complete una tarea una y otra vez... ¡en un *ciclo*! Es más eficiente así: en vez de escribir una instrucción muchas veces, se escribe un ciclo con las instrucciones y la computadora sabe que tiene que repetirlas.
-Por ejemplo, si quieres repetir un `makeBeat()` que has creado, en vez de escribir varias líneas de funciones `makeBeat()`, puedes crear un ciclo `for `. así:
+Por ejemplo, si quieres repetir un `makeBeat()` que has creado, en vez de escribir varias líneas de funciones `makeBeat()`, puedes crear un ciclo `for `.
////
add new video
@@ -18,8 +18,6 @@ more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPu
in the "revamping videos" tab (includes link to script)
////
-_UN VIDEO SOBRE LOS CICLOS VIENE PRONTO_
-
[role="curriculum-python"]
[source,python]
----
@@ -57,8 +55,8 @@ image::../media/U1P2/Loop_Components_JS.png[Alt Text]
[role="curriculum-javascript"]
* *La inicialización*: Crea una variable que se usa como *contador del ciclo* antes de que se ejecute el primer ciclo.
-* *La condición del ciclo*: Revisa si se debe ejecutar el ciclo otra vez. Si el contador llega a un número demasiado alto, la declaración será falsa y se sale del ciclo. Entonces la computadora sigue ejecutando el código que viene después del ciclo.
-* *La declaración de iteración*: Una declaración que actualiza el contador del ciclo. El conteo sube con cada iteración.
+* *La condición del ciclo*: Revisa si se debe ejecutar el ciclo otra vez. Hemos visto 2 parámetros de rango: `numeroInicial` y `numeroFinal` (que es exclusivo, lo cual quiere decir que el ciclo termina cuando el contador llegue al numeroFinal). Si el contador llega a un número demasiado alto, la declaración será falsa y se sale del ciclo. Entonces la computadora sigue ejecutando el código que viene después del ciclo.
+* *La declaración de iteración*: Una declaración que actualiza el contador del ciclo. It counts up each time the loop repeats.
* *El cuerpo del ciclo*: El cuerpo del ciclo contiene declaraciones que se ejecutarán repetidamente. Está rodeado por llaves `{ }` y tiene *sangría* (usando la tecla _tab_). Puedes tener más de una línea de instrucciones dentro del ciclo `for`.
.PRÁCTICA
@@ -78,11 +76,13 @@ image::../media/U1P2/Loop_Components_JS.png[Alt Text]
Para entender mejor el flujo de tu código, puedes usar una declaración `print` (declaración de impresión en español). Permite visualizar información en la consola cuando ejecutas el código.
[role="curriculum-python"]
-`print` *evalúa* una expresión: la simplifica a su forma básica, sea cual sea el tipo de dato, y luego muestra su resultado en la consola. Observa que, en Python, `print` es diferente de otras funciones porque no siempre tenemos que usar paréntesis.
+`print` *evalúa* una expresión: la simplifica a su forma básica, sea cual sea el tipo de dato, y luego muestra su resultado en la consola.
[role="curriculum-javascript"]
La función `println()` *evalúa* una expresión: la simplifica a su forma básica, sea cual sea el tipo de dato, y luego muestra su resultado en la consola.
+Then the data is converted into text and shown in the console.
+
[role="curriculum-python"]
.PRÁCTICA
****
@@ -112,11 +112,11 @@ include::code-examples/loops-and-layers-printing.js.txt[]
Aquí, verás las siguientes líneas en tu consola:
----
-4 (éste es 1+3, simplificado)
-1 (inicialmente tu contador compas es igual a 1)
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
ok
-2 (ahora tu contador compas es igual a 2)
-ok (cada vez que se ejecuta un ciclo, se imprime "ok", por eso se repite)
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
3
ok
4
@@ -152,7 +152,7 @@ include::code-examples/loops-and-layers-no-loops.py.txt[]
include::code-examples/loops-and-layers-no-loops.js.txt[]
----
-Podemos usar un ciclo `for` para crear exactamente la misma música de manera más eficiente. Nuestro contador aquí es "compas". Toma en cuenta que el cuerpo del ciclo contiene 2 líneas de código. Las dos usan "compas" como contador.
+Podemos usar un ciclo `for` para crear exactamente la misma música de manera más eficiente. Nuestro contador aquí es "compas". Toma en cuenta que el cuerpo del ciclo contiene 2 líneas de código.
[role="curriculum-python"]
[source,python]
@@ -193,7 +193,7 @@ BMW
Una última cosa interesante de ciclos `for` es la incrementación.
[role="curriculum-python"]
-La incrementación es el aumento del valor del contador. En los ciclos `for`, se usó la función `range()` para incrementar el contador. Hemos visto 2 parámetros de rango: `numeroInicial` y `numeroFinal` (que es exclusivo, lo cual quiere decir que el ciclo termina cuando el contador llegue al numeroFinal). Hay un tercer parámetro opcional: `increment`. El valor predeterminado de `increment` es 1, pero se puede usar para incrementar por más de uno.
+La incrementación es el aumento del valor del contador. En los ciclos `for`, se usó la función `range()` para incrementar el contador. We've seen two parameters for range: `startingNumber` and `endingNumber`. Hay un tercer parámetro opcional: `increment`. El valor predeterminado de `increment` es 1, pero se puede usar para incrementar por más de uno. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
[role="curriculum-javascript"]
La incrementación es el aumento del valor del contador. En los ciclos _for_ se usaron los términos `compas = compas + 1`. Esto incrementa el contador `compas` por 1 por cada ciclo. Se puede incrementarlo por más de uno, tal como `compas = compas + 4`.
@@ -220,12 +220,17 @@ include::code-examples/loops-and-layers-incrementing.js.txt[]
[role="curriculum-python"]
Aquí se usó la función `range()`, pero también se puede incrementar (aumentar) o decrementar (reducir) una variable usando este tipo de expresión: `compas = compas + 1`. Esto quiere decir que compas ahora es igual a su valor anterior más uno. Se puede usar la abreviatura `+=` para incrementar o `-=` para decrementar. Así se hace: `compas += 1` es equivalente a `compas = compas + 1`. Y `compas -=1` es equivalente a `compas = compas - 1`.
+[role="curriculum-python"]
+* El conteo sube con cada iteración. Observa que, en Python, `print` es diferente de otras funciones porque no siempre tenemos que usar paréntesis.
+* La *melodía* es la idea principal. Las dos usan "compas" como contador.
+
[role="curriculum-javascript"]
Aquí se escribió `compas = compas + 4`, lo cual significa que compas ahora es igual a su valor anterior más cuatro. Puedes usar algunas abreviaturas:
`+=` (o `-=` para decrementar). A continuación, hay un método para incrementar (o decrementar) un contador usando abreviaturas:
-* `compas++`, o `compas += 1` incrementa compas por 1. Si quieres incrementarlo por más de uno, usa `compas += 2`.
-* `compas--`, o `compas -= 1` decrementa compas por 1. Si quieres decrementarlo por más de uno, usa `compas -= 2`.
+[role="curriculum-javascript"]
+* `compas++`, o `compas += 1` incrementa compas por 1. Observa que, en Python, `print` es diferente de otras funciones porque no siempre tenemos que usar paréntesis.
+* `compas--`, o `compas -= 1` decrementa compas por 1. Las dos usan "compas" como contador.
[[debuggingtips]]
=== Consejos para depurar
@@ -235,6 +240,7 @@ Programar no sólo es el acto de escribir código. También hay que depurarlo y
[role="curriculum-python"]
. *Lee la consola para encontrar pistas*.
. *Encuentra el error en tu código:* Tienes 3 opciones aquí.
+[role="curriculum-python"]
.. Si la consola proveyó un número de línea, revisa esa línea y la línea anterior de tu código.
.. Usa el método "_comment out_" (comentar). Puedes encontrar un error al insertar la sintaxis que se usa para los comentarios en un bloque de código, o *_commenting it out_*, y ejecutar el código. Si no hay ningún error, el error se encuentra en alguna parte del bloque de código que tenga esa sintaxis de comentario.
.. También se puede usar *_Print debugging_* (depuración de impresión) para encontrar un error. Lee la sección problemática de tu código y trata de seguir la lógica. Inserta declaraciones `print` donde no estés seguro/a de la lógica; consigue los valores de las variables y revisa el estado del programa. Esto te ayuda a comparar tu entendimiento del programa con lo que pasa en realidad en ese programa.
@@ -244,6 +250,7 @@ Programar no sólo es el acto de escribir código. También hay que depurarlo y
[role="curriculum-javascript"]
. *Lee la consola para encontrar pistas*.
. *Encuentra el error en tu código:* Tienes 3 opciones aquí.
+[role="curriculum-javascript"]
.. Si la consola proveyó un número de línea, revisa esa línea y la línea anterior de tu código.
.. Usa el método "_comment out_" (comentar). Puedes encontrar un error al insertar la sintaxis que se usa para los comentarios en un bloque de código, o *_commenting it out_*, y ejecutar el código. Si no hay ningún error, el error se encuentra en alguna parte del bloque de código que tenga esa sintaxis de comentario.
.. También se puede usar *_Print debugging_* (depuración de impresión) para encontrar un error. Lee la sección problemática de tu código y trata de seguir la lógica. Inserta declaraciones `println` donde no estés seguro/a de la lógica; consigue los valores de las variables y revisa el estado del programa. Esto te ayuda a comparar tu entendimiento del programa con lo que pasa en realidad en ese programa.
@@ -270,9 +277,9 @@ Has visto una lista de posibles errores en el capítulo 1. Aquí hay algunos otr
. *Argumentos:* Fallas de argumentos de función pueden causar todo tipo de errores. Tienes que proporcionar el número y tipo correcto de argumentos a una llamada a función.
[role="curriculum-javascript"]
-. *Inicializar las variables*: Hay que inicializar una variable antes de que se pueda usar en un script. Esto quiere decir que debes asignar valores a tus variables al comienzo de tu script. ¡No te olvides de inicializar las variables con `var`!
+. *Inicializar las variables*: Hay que inicializar una variable antes de que se pueda usar en un script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
. *Comentarios:* Comentar impropiamente causará un <>. Los comentarios en JavaScript tienen que empezar con `//`.
-. *Puntos y comas:* Es altamente recomendado incluir puntos y comas después de cada declaración en JavaScript.
. *Comillas:* Si se te olvida poner una comilla inicial o una segunda comilla también podría causar un <>.
. *Argumentos:* Fallas de argumentos de función pueden causar todo tipo de errores. Tienes que proporcionar el número y tipo correcto de argumentos a una llamada a función.
@@ -297,16 +304,16 @@ Escucha el clip de audio de abajo para escuchar la diferencia entre las teclas p
Ahora vamos a hablar de los diferentes tipos de pistas musicales (tracks) que puedes tener. Tal vez recuerdes que puedes usar una pista de tu EAD para cada tipo de instrumento. En una canción pop, puedes encontrar las siguientes pistas básicas:
-* La *melodía* es la idea principal. Muchas veces tiene un registro más agudo, o "lo que canta el cantante principal". Puede ser una voz, las notas agudas de un teclado, una guitarra, etc.
+* Muchas veces tiene un registro más agudo, o "lo que canta el cantante principal". Puede ser una voz, las notas agudas de un teclado, una guitarra, etc.
* La *armonía* son las notas más prolongadas que "apoyan la melodía", como los acordes de piano, el rasgueo de la guitarra, o cuando se tocan numerosos instrumentos de cuerdas.
* También está la *línea de bajo*. Estos son los registros más bajos. Puede ser un bajo, un violonchelo, las notas bajas de un teclado, etc.
* Entonces está la *percusión*. Si estás usando `makeBeat()`, puede ocupar varias pistas musicales. Por ejemplo, puedes tener una pista para el bombo, una para el redoblante y una para el hihat.
-Éstas son las ideas básicas que crean la estructura de la textura de tu canción. Sin embargo, está bien si partes de tu canción sólo contienen 1 o 2 de los 4. También puedes añadir muchas pistas más: puedes crear una segunda melodía, añadir pedales (notas muy largas en el fondo), sonidos grabados, ráfagas de viento, etc. ¡Las posibilidades son infinitas! ¡Explora ideas y quédate con las que más te gusten!
+Éstas son las ideas básicas que crean la estructura de la textura de tu canción. Sin embargo, está bien si partes de tu canción sólo contienen 1 o 2 de los 4. También puedes añadir muchas pistas más: puedes crear una segunda melodía, añadir pedales (notas muy largas en el fondo), sonidos grabados, ráfagas de viento, etc. ¡Las posibilidades son infinitas! ¡Las posibilidades son infinitas! ¡Explora ideas y quédate con las que más te gusten!
Finalmente, vamos a hablar de la *repetición* y el *contraste*. A los humanos les gusta la repetición por lo que los psicólogos llaman _el efecto de mera exposición_. Al escuchar una sección de música repetida, el cerebro tratará de imaginar la próxima nota antes de que se toque, lo cual nos hace sentir como si estuviéramos participando. Asimismo, cada vez que se repite una sección de música, el oyente puede notar detalles diferentes de la pieza porque el cerebro ya no tiene que enfocarse en procesar el contenido melódico básico.
-El contraste se refiere a las diferencias de las secciones de música posteriores, proporcionando un importante contrapeso con la repetición. Se usa el contraste para hacer que el oyente se fije en nuevos elementos. Los músicos proveen contrastes a través de: cambios rítmicos, nuevas líneas melódicas, armonías distintas, o variaciones en los instrumentos o sonidos usados. Hay un buen ejemplo del contraste alrededor del 0:21 (segundo 21) y 1:01 (minuto 1, segundo 1) de la canción https://www.youtube.com/watch?v=AjjlABP5t1Q[Dream State] by Son Lux.
+El contraste se refiere a las diferencias de las secciones de música posteriores, proporcionando un importante contrapeso con la repetición. Se usa el contraste para hacer que el oyente se fije en nuevos elementos. Los músicos proveen contrastes a través de: cambios rítmicos, nuevas líneas melódicas, armonías distintas, o variaciones en los instrumentos o sonidos usados.
.PRÁCTICA
****
@@ -329,9 +336,9 @@ Recuerda que puedes probar cosas y quedarte sólo con los sonidos/ideas que más
=== Resumen del capítulo 4
[role="curriculum-python"]
-* Un *ciclo `for`* ordena que la computadora ejecute una sección de código repetidamente, lo cual crea código más eficiente. Los ciclos `for` consisten de un cuerpo del ciclo, un contador del ciclo, y un rango. Hay que escribir el código del cuerpo del ciclo con sangría.
+* Un *ciclo `for`* ordena que la computadora ejecute una sección de código repetidamente, lo cual crea código más eficiente. Los ciclos `for` consisten de un cuerpo del ciclo, un contador del ciclo, y un rango. El código del cuerpo del ciclo tiene que tener sangría.
* El *flujo de control* representa el orden en el cual la computadora ejecuta sus declaraciones.
-* La declaración `print` evalúa su expresión acompañante y muestra el resultado en la consola. Es una herramienta útil para depurar porque permite que el programador aprenda cuál es el estado del programa.
+* `print()` displays the data in the console. Es una herramienta útil para depurar porque permite que el programador aprenda cuál es el estado del programa.
* Para depurar el código, se puede imprimir (_print_), insertar la sintaxis que se usa para los comentarios en un bloque de código (comentar líneas de código, o _comment out code_ en inglés) y usar la consola. Además, pedirle ayuda a alguien puede acelerar significativamente el proceso de depuración.
* Repasa otra vez la lista expandida de errores comunes de programación: <>.
* El *registro* de un sonido determina cuán agudo o grave suena en una escala relativa.
@@ -339,7 +346,7 @@ Recuerda que puedes probar cosas y quedarte sólo con los sonidos/ideas que más
* Puedes usar 3 pistas básicas como base de tus canciones: una melodía de registro más agudo, una línea de bajo con registro más grave y percusión.
[role="curriculum-javascript"]
-* Un *ciclo `for`* ordena que la computadora ejecute una sección de código repetidamente, lo cual crea código más eficiente. Los ciclos `for` consisten de un cuerpo del ciclo, una inicialización, una declaración de iteración, y una condición de ciclo. El código del cuerpo del ciclo tiene que tener sangría.
+* Un *ciclo `for`* ordena que la computadora ejecute una sección de código repetidamente, lo cual crea código más eficiente. Los ciclos `for` consisten de un cuerpo del ciclo, una inicialización, una declaración de iteración, y una condición de ciclo. Hay que escribir el código del cuerpo del ciclo con sangría.
* El *flujo de control* representa el orden en el cual la computadora ejecuta sus declaraciones.
* La función `println()` evalúa su argumento y muestra el resultado en la consola. Es una herramienta útil para depurar porque permite que el programador aprenda cuál es el estado del programa.
* Para depurar el código, se puede imprimir (_print_), insertar la sintaxis que se usa para los comentarios en un bloque de código (comentar líneas de código, o _comment out code_ en inglés) y usar la consola. Además, pedirle ayuda a alguien puede acelerar significativamente el proceso de depuración.
diff --git a/src/locales/es/v2/mixing-with-conditionals.adoc b/src/locales/es/v2/mixing-with-conditionals.adoc
index 025772103..ea55d1174 100644
--- a/src/locales/es/v2/mixing-with-conditionals.adoc
+++ b/src/locales/es/v2/mixing-with-conditionals.adoc
@@ -3,12 +3,12 @@
:nofooter:
-En la programación, se pueden automatizar las cosas. Un ejemplo de automatización es si estás programando un robot para que se detenga cuando se detecta un obstáculo. Así el robot no necesita que un ser humano le diga que se detenga manualmente. En cambio, el robot usará un sensor para detectar los obstáculos, y si hay uno, se detendrá. Podemos crear automatizaciones musicales en EarSketch, usando condicionales (declaraciones "if", una palabra en inglés que significa "si"). Vamos a ver cómo automatizar la mezcla de las pistas musicales (tracks). Mezclar consiste en reducir el volumen cuando es demasiado alto y aumentar el volumen cuando es demasiado bajo.
+En la programación, se pueden automatizar las cosas. Un ejemplo de automatización es si estás programando un robot para que se detenga cuando se detecta un obstáculo. Así el robot no necesita que un ser humano le diga que se detenga manualmente. En cambio, el robot usará un sensor para detectar los obstáculos, y si hay uno, se detendrá. We can do musical automations in EarSketch using conditionals (`if` statements). Vamos a ver cómo automatizar la mezcla de las pistas musicales (tracks). Mezclar consiste en reducir el volumen cuando es demasiado alto y aumentar el volumen cuando es demasiado bajo.
[[analyzetrack]]
=== Usa `analyzeTrack()`
-Vamos a ver cómo detectar la intensidad sonora, o volumen, de la pista. Asegúrate de entender la diferencia entre el registro (agudo o grave) y el volumen (alto o bajo) de un sonido. Usaremos una función de EarSketch llamada `analyzeTrack()`. Copia y ejecuta el siguiente código:
+Vamos a ver cómo detectar la intensidad sonora, o volumen, de la pista. Asegúrate de entender la diferencia entre el registro (agudo o grave) y el volumen (alto o bajo) de un sonido. Usaremos una función de EarSketch llamada `analyzeTrack()`. Import and run the following code:
[role="curriculum-python"]
[source,python]
@@ -30,12 +30,12 @@ Puedes leer en tu consola que el volumen impreso es de 0.10306035109110138.
La función `analyzeTrack()` requiere 2 argumentos:
-. el número de pista
-. el parámetro que se quiere analizar. Para volumen es: `RMS_AMPLITUDE`.
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
.PRÁCTICA
****
-. Trata de usar el código del ejemplo anterior con diferentes sonidos (cambia la variable "sonido") y verás los resultados.
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
. Añade una segunda pista y usa la función `analyzeTrack()` para imprimir su volumen en la consola. Cuando ejecutes el código, antes de mirar tu consola, escucha tu música y trata de adivinar cuál de las pistas tiene el volumen más alto.
****
@@ -44,7 +44,7 @@ El parámetro para `analyzeTrack()` puede ser `RMS_AMPLITUDE`, para evaluar cuá
[[booleansandcomparisons]]
=== Los booleanos y las comparaciones
-Ahora vamos a ver cómo funciona la *lógica Booleana*. Nos ayudará a automatizar ciertas tareas.
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
[role="curriculum-python"]
Los *Booleanos* son un tipo de dato. El tipo de dato booleano sólo tiene 2 posibles valores, `True` y `False` (Cierto y Falso). `True` y `False` empiezan con una letra en mayúscula y no llevan comillas.
@@ -59,10 +59,10 @@ Para crear un booleano, puedes inicializar una variable (`variable1 = True`) o p
[cols="^h,1"]
|===
|==
-|es idéntico a
+|is equal to
|!=
-|no es idéntico a
+|is not equal to
|>
|es mayor que
@@ -80,7 +80,7 @@ Para crear un booleano, puedes inicializar una variable (`variable1 = True`) o p
Observa la diferencia entre:
1. Comparar dos valores para ver si son idénticos: `==`
-2. Asignar un valor a una variable: `=`
+1. Asignar un valor a una variable: `=`
--
[role="curriculum-javascript"]
@@ -89,11 +89,11 @@ Para crear un booleano, puedes inicializar una variable (`var variable1 = true;`
[cols="^h,1"]
|===
-| ===
-|es idéntico a
+|===
+|is equal to
|!==
-|no es idéntico a
+|is not equal to
|>
|es mayor que
@@ -110,8 +110,8 @@ Para crear un booleano, puedes inicializar una variable (`var variable1 = true;`
Observa la diferencia entre:
-1. Comparar dos valores para ver si son idénticos: `===`
-2. Asignar un valor a una variable: `=`
+1. Comparing two values to see if they are equal: `===`
+1. Asignar un valor a una variable: `=`
--
[role="curriculum-python curriculum-mp4"]
@@ -127,16 +127,16 @@ video::./videoMedia/6_2_1_boolean_js.mp4[]
[role="curriculum-python"]
.PRÁCTICA
****
-* Crea un nuevo script y agrega sonidos a 2 pistas.
+* Create a new script, and add sounds on two tracks.
* Imprime `True` si la primera pista tiene más volumen que la segunda pista, y `False` en caso contrario.
* Usa un ciclo for con el contador `pista` para revisar cada pista y determinar si el volumen es estrictamente mayor que 0.01. Si es, imprime `True`. Si no, imprime `False`.
-* Puedes usar declaraciones adicionales de impresión antes de imprimir `True` o `False` para que, cuando leas la consola, sepas lo que es `True` o `False`. Por ejemplo, puedes imprimir el número de pista primero y luego 'True' o 'False'.
+* Puedes usar declaraciones adicionales de impresión antes de imprimir `True` o `False` para que, cuando leas la consola, sepas lo que es `True` o `False`. For example, you can first print the track number and then 'True' or 'False'.
****
[role="curriculum-javascript"]
.PRÁCTICA
****
-* Crea un nuevo script y agrega sonidos a 2 pistas.
+* Create a new script, and add sounds on two tracks.
* Imprime `true` si la primera pista tiene más volumen que la segunda pista y `false` en caso contrario.
* Usa un ciclo for con el contador `pista` para revisar cada pista y determinar si el volumen es estrictamente mayor que 0.01. Si es, imprime `true`. Si no, imprime `false`.
* Puedes usar declaraciones adicionales de impresión antes de imprimir `true` o `false` para que, cuando leas la consola, sepas lo que es `true` o `false`. Por ejemplo, puedes imprimir el número de pista primero y luego 'true' o 'false'.
@@ -157,10 +157,10 @@ include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
----
[role="curriculum-python"]
-Nota: en este ejemplo, usamos algunas declaraciones de impresión con cadenas de caracteres (o strings en inglés) para ayudarnos a leer el contenido de la consola. Usamos el operador `+` para *concatenar*, o añadir cadenas, y la función str() para convertir los números en cadenas.
+In this example, we used `print()` with strings to help read the content of the console. Usamos el operador `+` para *concatenar*, o añadir cadenas, y la función str() para convertir los números en cadenas.
[role="curriculum-javascript"]
-Nota: en este ejemplo, usamos algunas declaraciones de impresión con cadenas de caracteres (o strings en inglés) para ayudarnos a leer el contenido de la consola. Utilizamos el operador `+` para *concatenar*, o agregar cadenas.
+In this example, we used `println()` with strings to help read the content of the console. Utilizamos el operador `+` para *concatenar*, o agregar cadenas.
[[conditionalstatements]]
=== Declaraciones condicionales
@@ -183,9 +183,9 @@ include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
.PRÁCTICA
****
-* Crea un nuevo script con 2 pistas musicales (tracks).
-* Si la primera pista tiene más volumen que la segunda, entonces reduce su volumen. Necesitarás las funciones `analyzeTrack()` y `setEffect()`, además de una declaración if.
-* Tiene que haber una reducción en el valor GAIN (entre -1 y -60dB) para reducir el volumen.
+* Create a new script with two tracks.
+* Si la primera pista tiene más volumen que la segunda, entonces reduce su volumen. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
****
Aquí hay un ejemplo:
@@ -202,7 +202,7 @@ include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
----
-Tal vez nos gustaría revisar varias condiciones y ejecutar otra serie de declaraciones dependiendo de cada condición. Puedes agregar todas las condiciones que quieras. Usamos la siguiente sintaxis:
+Tal vez nos gustaría revisar varias condiciones y ejecutar otra serie de declaraciones dependiendo de cada condición. You can chain multiple conditions together. Usamos la siguiente sintaxis:
[role="curriculum-python"]
[source,python]
@@ -225,28 +225,28 @@ Vamos a usar todas estas herramientas para mezclar tu canción. Mezclar es el ac
.PRÁCTICA
****
* Crea un nuevo script.
-* Añade sonidos a por lo menos 3 pistas durante por lo menos 16 compases.
-* Puedes usar la función `makeBeat()` y un ciclo for para añadir tus sonidos percusivos.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
* Elije tu pista "principal". Puede ser tu melodía, o una pista que quieras destacar.
-* Si tu pista principal no tiene más volumen que las otras pistas, asegúrate de aumentar su volumen usando la función `setEffect()`. No tomes en cuenta la pista percusiva, debido a que `analyzeTrack()` no se aplica a las percusiones. `analyzeTrack()` genera una media aritmética mientras que las percusiones son golpes de sonido. Por lo tanto, una media aritmética no puede en realidad evaluar el volumen.
-* Usa declaraciones de impresión para mostrar tu proceso en la consola. Aquí está un ejemplo de una declaración de impresión: `print('Es el numero de pista' + str(pista) + 'mayor que 0.01?')`. Si el contador `pista` es igual a `1`, se imprimirá 'Es el numero de pista 1 mayor que 0.01?'. La función `str()` convierte un número (ej: 1) en una cadena (ej: '1').
+* Si tu pista principal no tiene más volumen que las otras pistas, asegúrate de aumentar su volumen usando la función `setEffect()`. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
****
[role="curriculum-javascript"]
.PRÁCTICA
****
* Crea un nuevo script.
-* Añade sonidos a por lo menos 3 pistas durante por lo menos 16 compases.
-* Puedes usar la función `makeBeat()` y un ciclo for para añadir tus sonidos percusivos.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
* Elije tu pista "principal". Puede ser tu melodía, o una pista que quieras destacar.
-* Si tu pista principal no tiene más volumen que las otras pistas, asegúrate de aumentar su volumen usando la función `setEffect()`. No tomes en cuenta la pista percusiva, debido a que `analyzeTrack()` no se aplica a las percusiones. `analyzeTrack()` genera una media aritmética mientras que las percusiones son golpes de sonido. Por lo tanto, una media aritmética no puede en realidad evaluar el volumen.
-* Usa declaraciones de impresión para mostrar tu proceso en la consola. Aquí está un ejemplo de una declaración de impresión: `println('Es el numero de pista' + pista + 'mayor que 0.01?')`. Si el contador `pista` es igual a `1`, se imprimirá 'Es el numero de pista 1 mayor que 0.01?'.
+* Si tu pista principal no tiene más volumen que las otras pistas, asegúrate de aumentar su volumen usando la función `setEffect()`. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
****
Vamos a repasar algún vocabulario:
-1. *Operador*: un carácter que representa una acción. Hemos visto operadores aritméticos (`\+`, `-`, `\*`, `=`) y operadores de comparación (`>`, `>=`, `<`, `\<=`, `==`, `!=`).
-1. Expresión: una combinación de valores, constantes, variables, operadores y funciones. La computadora evalúa las expresiones para producir un resultado, usualmente un solo valor numérico o booleano. Por ejemplo, `1+2` (sumado a 3) o `1<2` (calculado como True) o `analyzeTrack(1, RMS_AMPLITUDE)` (una evaluación del volumen de la pista 1, un número de coma flotante entre 0 y 1).
+1. *Operador*: un carácter que representa una acción. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. Expresión: una combinación de valores, constantes, variables, operadores y funciones. La computadora evalúa las expresiones para producir un resultado, usualmente un solo valor numérico o booleano. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
1. *Declaraciones*: instrucciones que la computadora ejecuta.
A continuación, hay un ejemplo de una mezcla automatizada. Podemos decir que está automatizada porque, si cambias un sonido o más, no tienes que revisar y modificar manualmente su volumen cada vez que lo hagas porque el proceso ya está incluido en el código.
@@ -269,7 +269,7 @@ include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
=== Resumen del capítulo 6
[role="curriculum-python"]
-* La función `analyzeTrack()` requiere dos argumentos: el número de pista y un parámetro. Cuando el parámetro es `RMS_AMPLITUDE`, la función calculará el volumen de la pista (un número entre 0 y 1). Cuando el parámetro es `SPECTRAL_CENTROID`, la función calculará el brillo de la pista.
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
* El tipo de dato *booleano* sólo tiene dos posibles valores, `True` y `False` (Cierto y Falso).
* Los valores booleanos son generados por operadores de comparación: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
* `==` calcula si 2 valores son iguales, mientras que `=` asigna un valor a una variable.
@@ -277,20 +277,20 @@ include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
* La computadora evalúa las *expresiones* para producir un valor.
* Una *declaración* es una instrucción para la computadora.
* Una *condición* es una expresión que calcula si es `True` o `False`.
-* La declaración _if_ (una palabra en inglés que significa "si") sólo ejecuta su bloque de código cuando su condición es `True`.
-* En el evento de que la condición de una declaración _if_ sea `False`, una declaración opcional _else_ permitirá que se ejecute un bloque alternativo de código.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
[role="curriculum-javascript"]
-* La función `analyzeTrack()` requiere dos argumentos: el número de pista y un parámetro. Cuando el parámetro es `RMS_AMPLITUDE`, la función calculará el volumen de la pista (un número entre 0 y 1). Cuando el parámetro es `SPECTRAL_CENTROID`, la función calculará el brillo de la pista.
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
* El tipo de dato *booleano* sólo tiene dos posibles valores, `true` y `false` (cierto y falso).
-* Los valores booleanos son generados por operadores de comparación: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
-* `==` calcula si 2 valores son iguales, mientras que `=` asigna un valor a una variable.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
* Un *operador* es un carácter que representa una acción.
* La computadora evalúa las *expresiones* para producir un valor.
* Una *declaración* es una instrucción para la computadora.
* Una *condición* es una expresión que calcula si es `true` o `false`.
-* La declaración _if_ (una palabra en inglés que significa "si") sólo ejecuta su bloque de código cuando su condición es `true`.
-* En el evento de que la condición de una declaración _if_ sea `false`, una declaración opcional _else_ permitirá que se ejecute un bloque alternativo de código.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
[[chapter-questions]]
=== Preguntas
@@ -300,12 +300,13 @@ include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
¿Cuál de los siguientes elementos es un booleano?
[answers]
-* `5+4 == 5`
+* `5+4 === 5`
* `compas = 1`
* `2<3<4`
* `False()`
--
+[role="curriculum-python"]
[question]
--
¿Cuál sería el resultado de este bloque de código (qué se imprimiría en la consola)?
@@ -322,6 +323,7 @@ include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
* False
--
+[role="curriculum-javascript"]
[question]
--
¿Cuál sería el resultado de este bloque de código (qué se imprimiría en la consola)?
diff --git a/src/locales/es/v2/unit-1.adoc b/src/locales/es/v2/unit-1.adoc
index 7217b4a73..6f1585346 100644
--- a/src/locales/es/v2/unit-1.adoc
+++ b/src/locales/es/v2/unit-1.adoc
@@ -3,11 +3,11 @@
:nofooter:
-En esta unidad vas a aprender cómo funciona EarSketch. Vas a colocar sonidos (clips) en tu música, depurar tu código, personalizar tu canción, y añadir ritmos según tu género musical.
+Vas a colocar sonidos (clips) en tu música, depurar tu código, personalizar tu canción, y añadir ritmos según tu género musical.
¡Cualquier persona (incluso tú) puede aprender a programar! De la misma manera que se aprende a tocar un instrumento musical, hay que practicar consistentemente para progresar. No te desanimes si te trancas. Es parte del proceso. Pide ayuda en tu clase o busca en línea si es necesario.
-¡Te deseamos mucha suerte! Antes de comenzar, mira este ejemplo de lo que puedes hacer con EarSketch:
+Antes de comenzar, mira este ejemplo de lo que puedes hacer con EarSketch:
[role="curriculum-python curriculum-mp4"]
[[video1livepy]]
diff --git a/src/locales/es/v2/your-first-song.adoc b/src/locales/es/v2/your-first-song.adoc
index 715fef9c9..87dc731c9 100644
--- a/src/locales/es/v2/your-first-song.adoc
+++ b/src/locales/es/v2/your-first-song.adoc
@@ -41,33 +41,35 @@ Un género es una categoría de composición artística (por ejemplo, la música
|===
|GÉNERO |PPM |EJEMPLO
-|Hip hop
-|85-95
-|Coolio - Gangsta's Paradise (feat. L.V.)
-
|Pop
|110-130
-|Lizzo - Juice
+|"Thriller" - Michael Jackson
-|Techno
-|120-125
-|Boris Brejcha - Schleierwolken
+"I Wanna Dance With Somebody" - Whitney Houston
-|Electro
+|Hip hop
|100-130
-|Apashe - Behind My Eyes (feat. LIA)
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
-|House
+|Country
|115-130
-|DJ Breezy - Kimpinstik (feat. Dahlin Gage & Medikal)
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
|Dubstep y trap
|140-150
-|Jessica Audiffred & Walshy Fire - Stupid Love (feat. Nia V)
+|"Scary Monsters and Nice Sprites" - Skrillex
-|Batería y línea de bajo
-|160-180
-|Mollie Collins - Lost & Found
+"Turn Down for What" - Lil Jon
|===
.PRÁCTICA
@@ -78,26 +80,26 @@ Un género es una categoría de composición artística (por ejemplo, la música
. También puedes investigar el género en Wikipedia para conseguir más información sobre él.
****
-Toma en cuenta que a veces un clip de sonido sonará muy diferente cuando lo estás escuchando preliminarmente y cuando se escucha en tu canción. Puede ser porque el tempo del clip de sonido es diferente del tempo de tu canción. Para averiguar el tempo exacto del fragmento, pon el cursor sobre el nombre del clip en el Navegador de Sonidos. Entonces puedes modificar el tempo de tu canción para que corresponda con el fragmento o elegir un clip de sonido que vaya mejor con el tempo de tu canción.
+Sounds are automatically stretched to fit your song's tempo. Toma en cuenta que a veces un clip de sonido sonará muy diferente cuando lo estás escuchando preliminarmente y cuando se escucha en tu canción. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
[[comments]]
=== Añade comentarios a tu código
+Los *comentarios* son líneas de código que la computadora no ejecuta. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. Esto facilita que los programadores entiendan de qué se trata tu código.
+
[role="curriculum-python"]
-Los *comentarios* son líneas de código que la computadora no ejecuta. Sólo los humanos los usan para hacer más entendible el código y ayudar a organizarlo o dejar notas para el futuro. En Python, una línea que comienza con el signo de número `#` indica que hay comentarios.
+En Python, una línea que comienza con el signo de número `#` indica que hay comentarios.
[role="curriculum-javascript"]
-Los *comentarios* son líneas de código que la computadora no ejecuta. Sólo los humanos los usan para hacer más entendible el código y ayudar a organizarlo o dejar notas para el futuro. En JavaScript, una línea que comienza con dos barras inclinadas hacia delante, `//`, indica que hay comentarios.
-
-Toma en cuenta que las primeras líneas de cada script son comentarios que describen tu script. Para cada script nuevo, tendrás que proporcionar esta información. Esto facilita que los programadores entiendan de qué se trata tu código.
+En JavaScript, una línea que comienza con dos barras inclinadas hacia delante, `//`, indica que hay comentarios.
.PRÁCTICA
****
-En tu script actual, proporciona la siguiente información en los comentarios al comienzo de tu código:
-
-. nombre del script: el nombre de tu canción,
-. autor: tu nombre,
-. descripción: escribe aquí una breve descripción de tu proyecto
+Toma en cuenta que las primeras líneas de cada script son comentarios que describen tu script.
****
También puedes usar los comentarios para describir lo que hacen las diferentes secciones de tu código. Mira el ejemplo a continuación. Puedes pegar y ejecutar el código. Observa cómo los comentarios describen las diferentes secciones:
@@ -119,13 +121,15 @@ include::code-examples/your-first-song-comments.js.txt[]
[[uploadingsounds]]
=== Cargar tus propios sonidos
-Puedes cargar tu propio archivo de audio a través del Navegador de Sonidos. Abre tu _Administrador de Contenido_ en la parte izquierda de tu pantalla. En la pestaña "Sonidos", haz clic en el botón de "añadir sonido" debajo de los filtros para abrir la ventana en que se añade un sonido (si no ves el botón, asegúrate de iniciar la sesión). Vamos a explorar las primeras 3 opciones:
+Puedes cargar tu propio archivo de audio a través del Navegador de Sonidos. En la pestaña "Sonidos", haz clic en el botón de "añadir sonido" debajo de los filtros para abrir la ventana en que se añade un sonido (si no ves el botón, asegúrate de iniciar la sesión).
+
+You must be logged in to upload sounds.
-. *Cargar sonido* permite que elijas archivos de audio (.mp3, .aiff, etcétera) que ya están en tu computadora. Modifica el nombre del archivo si es necesario ("(se requiere) un valor constante"), y haz clic en "CARGAR".
-. *Grabación Rápida* permite que se grabe un clip corto directamente a la biblioteca EarSketch. Mira el video a continuación para más información.
-. *Freesound* permite que se importen sonidos directamente de Freesound.org, una base de datos de código abierto. En la barra de búsqueda, puedes buscar ciertos tipos de sonidos (por ejemplo, los cantos de pájaro, la lluvia, una calle ocupada...). Bajo "Results", una lista de sonidos aparecerá. Si haces clic en el botón de _play_, puedes escuchar los sonidos preliminarmente, y, si te gusta uno, selecciona el botón de "toggle" en frente del nombre del archivo y luego haz clic en "UPLOAD" al final de la pantalla.
+Vamos a explorar las primeras 3 opciones:
-Para encontrar el sonido que acabas de cargar o grabar, escribe su nombre en la barra de búsqueda en la pestaña de Sonidos del Administrador de Contenido.
+. *Cargar sonido* permite que elijas archivos de audio (.mp3, .aiff, etcétera) que ya están en tu computadora.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* permite que se importen sonidos directamente de Freesound.org, una base de datos de código abierto. En la barra de búsqueda, puedes buscar ciertos tipos de sonidos (por ejemplo, los cantos de pájaro, la lluvia, una calle ocupada...). Then select the toggle button in front of the file name to select.
[role="curriculum-mp4"]
[[video101rec]]
@@ -145,9 +149,11 @@ La música, y el arte en general, muchas veces sirve para comunicar un mensaje.
. Pueden conversar sobre tus canciones y las cosas que tratabas de expresar
****
-*Procesos*, o tareas, son programas que se ejecutan en tu computadora. El CPU, o *Unidad Central de Procesamiento*, de la computadora los ejecuta.
+*Procesos*, o tareas, son programas que se ejecutan en tu computadora.
-La *memoria* de una computadora mantiene los datos y las instrucciones de procesamiento para que el CPU los use. La memoria, también llamada almacenamiento primario o RAM (memoria de acceso aleatorio, o _Random Access Memory_ en inglés), almacena sus datos temporalmente. Sólo se almacena en el RAM la información para los procesos que se están ejecutando activamente. Esto permite que el CPU tenga acceso rápido a instrucciones y datos.
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. La *memoria* de una computadora mantiene los datos y las instrucciones de procesamiento para que el CPU los use. The CPU is often considered the "brain" of the computer.
+
+La memoria, también llamada almacenamiento primario o RAM (memoria de acceso aleatorio, o _Random Access Memory_ en inglés), almacena sus datos temporalmente. It is designed to be fast and temporary, for active processes only.
Hay una diferencia entre la memoria (o almacenamiento a corto plazo) y el almacenamiento a largo plazo. El almacenamiento a largo plazo, como un disco duro o una nube (cloud), se conoce como almacenamiento secundario. El *almacenamiento secundario* contiene grandes volúmenes de datos por largos periodos de tiempo, incluso cuando la computadora está apagada. El CPU no interactúa directamente con el almacenamiento secundario. Cuando el CPU ejecuta un proceso, los datos del almacenamiento secundario se tienen que transferir primero a la memoria para que el CPU pueda accederlos rápidamente.
@@ -170,24 +176,19 @@ END OF OPTIONAL
Los *derechos de autor* son la parte de la ley que cubre la *propiedad intelectual*, o la posesión del trabajo creativo, como la música. Cuando usas _samples_ (breves fragmentos de música) o remezclas música que ya existe, tienes que dar crédito a los autores, y puedes hacerlo en los comentarios de tu código. Antes de usar sonidos de otros músicos y compartir tu propia música, ¡aprende más sobre los derechos de autor!
-Los *derechos de autor* son la parte de la ley que cubre la *propiedad intelectual*, o la posesión del trabajo creativo, como la música.
-
¡Cuando se crea algo suficientemente original y sustancial, se recibe automáticamente los derechos de autor! En los Estados Unidos esto quiere decir que uno puede: hacer copias, hacer modificaciones y compartir lo que se crea.
Hay dos tipos de derechos de autor relacionados con una canción: los derechos a la canción (que tiene el escritor o compositor) y los derechos a la grabación de audio (que muchas veces tiene la compañía discográfica). La regalía de los espectáculos públicos va al compositor y la mayoría de la regalía de ventas de discos va a la compañía discográfica.
*_Copyright infringement_* es la infracción de los derechos de autor, tal como la descarga ilegal de música. En los Estados Unidos, el concepto de *uso leal* (o _fair use_ en inglés) permite que se use el contenido protegido por los derechos de autor bajo ciertas circunstancias, por ejemplo, para propósitos educativos o críticos, sólo si se usan breves fragmentos del trabajo. La decisión de qué constituye uso leal depende de cada caso y es determinado por un juez.
-Aparte del uso leal, hay una manera de usar y compartir la música abiertamente. Los derechos de autor deben ayudarnos a hacer y compartir más arte, no menos. EarSketch funciona porque los artistas han compartido su trabajo contigo a través de *fragmentos* (una breve porción de la grabación de audio) en la Biblioteca de Sonidos. Estos artistas han compartido sus fragmentos bajo una licencia *Creative Commons*, la cual da permiso para que otros usen su trabajo. En EarSketch, por lo tanto, tienes libre acceso a estos fragmentos, y se puede compartir toda la música que hagas en EarSketch, aunque no puedes venderla. Compartir tu música o permitir que otros estudiantes remezclen tu código es una manera de devolver el favor y ayudar a aportar nuevo arte al mundo.
+Aparte del uso leal, hay una manera de usar y compartir la música abiertamente. EarSketch funciona porque los artistas han compartido su trabajo contigo a través de *fragmentos* (una breve porción de la grabación de audio) en la Biblioteca de Sonidos.
-Las licencias *Creative Commons* (o CC) permiten que los creadores especifiquen cuáles son los derechos que mantienen y cuáles son los derechos que renuncian. Aquí hay las posibles partes de una licencia CC: "Puedes usar este trabajo como quieras, CON EXCEPCIÓN DE QUE...
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Los derechos de autor deben ayudarnos a hacer y compartir más arte, no menos. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch permite que se añadan licencias Creative Commons a tu música a través de la ventana de Compartir. Compartir tu música o permitir que otros estudiantes remezclen tu código es una manera de devolver el favor y ayudar a aportar nuevo arte al mundo.
-* "... tienes que poner mi nombre en tu obra." Reconocimiento (siglas _BY_ en inglés)
-* "...no puedes modificarlo en absoluto." – Sin Derivados (siglas _ND_ en inglés)
-* "...no puedes usarlo para ganar dinero." – No Comercial (siglas _NC_ en inglés)
-* "...tienes que compartir cualquier nueva creación tuya bajo la misma licencia." - CompartirIgual (siglas _SA_ en inglés)
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
-Para especificar cuál licencia de Creative Commons vas a emplear, lo único que tienes que hacer es elegir un tipo y ponerlo en tu trabajo. En EarSketch, cuando compartas un script, se te va a pedir que especifiques cuál tipo de licencia quieres para tu canción.
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
[[chapter2summary]]
=== El resumen del capítulo 2
@@ -196,7 +197,7 @@ Para especificar cuál licencia de Creative Commons vas a emplear, lo único que
* El *tempo* es la velocidad en que se pone una pieza de música, expresada en pulsaciones por minuto (ppm). El tempo está vinculado al género.
* Los clips en la Biblioteca de Sonidos de EarSketch se organizan en archivos por sonidos parecidos. Para ver cuál es el tempo exacto de un clip, mantén el cursor sobre su nombre en el Navegador de Sonidos.
* Los comentarios son líneas de código que la computadora no ejecuta. Sin embargo, son útiles cuando se quiere escribir notas dentro de un script.
-* `from earsketch import *` añade el EarSketch API, una interfaz de programación de aplicaciones, a tu proyecto. Hay que incluirla en la parte superior de cada script.
+* `from earsketch import *` añade el EarSketch API, una interfaz de programación de aplicaciones, a tu proyecto.
* `setTempo()` permite que se especifique el tempo de tu canción. Se tiene que incluir en cada script de EarSketch.
* Puedes cargar tus propios sonidos a EarSketch a través del Navegador de Sonidos. Sólo haz clic en "Añadir sonido".
* Un *proceso* es una tarea que se ejecuta en una computadora. El *CPU*, la parte responsable de ejecutar las instrucciones del programa, ejecuta el procesamiento.
@@ -204,7 +205,7 @@ Para especificar cuál licencia de Creative Commons vas a emplear, lo único que
* El *almacenamiento secundario* se refiere al almacenamiento de datos a largo plazo, muchas veces cuando hay una alta cantidad. Los datos del almacenamiento secundario tienen que transferirse a la memoria antes de que el CPU pueda accederlos.
* Los *derechos de autor* son una porción de la ley que cubre la posesión del trabajo creativo, como la música. Es importante para los músicos porque define cómo se puede usar y compartir el trabajo de otra persona.
* Si creas una pieza de música que es tangible y nueva, automáticamente recibes los derechos de autor. En otras palabras, tú tienes los derechos de la pieza que has creado.
-* *Licenciar* una pieza de música les da a otros permiso para usarla. A veces, ciertos derechos a una pieza se basan en licencias *Creative Commons*. EarSketch permite que se añadan licencias Creative Commons a tu música a través de la ventana de Compartir.
+* *Licenciar* una pieza de música les da a otros permiso para usarla.
[role="curriculum-javascript"]
* El *tempo* es la velocidad en que se pone una pieza de música, expresada en pulsaciones por minuto (ppm). El tempo está vinculado al género.
@@ -217,7 +218,7 @@ Para especificar cuál licencia de Creative Commons vas a emplear, lo único que
* El *almacenamiento secundario* se refiere al almacenamiento de datos a largo plazo, muchas veces cuando hay una alta cantidad. Los datos del almacenamiento secundario tienen que transferirse a la memoria antes de que el CPU pueda accederlos.
* Los *derechos de autor* son una porción de la ley que cubre la posesión del trabajo creativo, como la música. Es importante para los músicos porque define cómo se puede usar y compartir el trabajo de otra persona.
* Si creas una pieza de música que es tangible y nueva, automáticamente recibes los derechos de autor. En otras palabras, tú tienes los derechos de la pieza que has creado.
-* *Licenciar* una pieza de música les da a otros permiso para usarla. A veces, ciertos derechos a una pieza se basan en licencias *Creative Commons*. EarSketch permite que se añadan licencias Creative Commons a tu música a través de la ventana de Compartir.
+* *Licenciar* una pieza de música les da a otros permiso para usarla.
[[chapter-questions]]
=== Preguntas
@@ -279,11 +280,11 @@ En EarSketch, ¿qué es lo que te permite hacer `setTempo()`?
[question]
--
-¿Qué es el Creative Commons?
+¿Qué es el Creative Commons? Una licencia para compartir tu obra abiertamente con ciertas restricciones El derecho de demandar a cualquier persona que use tu música Una licencia que permite que cobres una regalía
[answers]
-* Una licencia para compartir tu obra abiertamente con ciertas restricciones
+* Estos artistas han compartido sus fragmentos bajo una licencia *Creative Commons*, la cual da permiso para que otros usen su trabajo.
* Un proceso de composición
-* El derecho de demandar a cualquier persona que use tu música
-* Una licencia que permite que cobres una regalía
+* A musical genre
+* A description of your song
--
\ No newline at end of file
diff --git a/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
index 95aa2bf32..a9654cbe5 100644
--- a/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
+++ b/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -6,9 +6,9 @@ var clap = RD_TRAP_ARCADEFIRESFX_1;
var beatString = "00+-0-00+0+-0+++";
for (var measure = 1; measure < 32; measure++){
- if (measure % 4 = 0)
- //Utilisation de la fonction API de EarSketch pour mélanger une chaîne de caractères de beat
- beatString = shuffleString(beatString);
- }
- makeBeat(clap, 1, measure, beatString);
+ if (measure % 4 = 0)
+ //Utilisation de la fonction API de EarSketch pour mélanger une chaîne de caractères de beat
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
}
\ No newline at end of file
diff --git a/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
index 48833a19f..821800755 100644
--- a/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
+++ b/src/locales/fr/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -8,6 +8,6 @@ beatString = "00+-0-00+0+-0+++"
for measure in range(1, 32):
if measure % 4 = 0
- # Utilisation de la fonction API de EarSketch pour mélanger la chaîne de caractères de beat
- beatString = shuffleString(beatString)
+ # Utilisation de la fonction API de EarSketch pour mélanger la chaîne de caractères de beat
+ beatString = shuffleString(beatString)
makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/fr/v1/every-effect-explained-in-detail.adoc b/src/locales/fr/v1/every-effect-explained-in-detail.adoc
index 80d7ec551..63b15c7cf 100644
--- a/src/locales/fr/v1/every-effect-explained-in-detail.adoc
+++ b/src/locales/fr/v1/every-effect-explained-in-detail.adoc
@@ -1,5 +1,6 @@
[[ch_28]]
== Tous les effets expliqués en détail
+
:nofooter:
[[bandpass]]
@@ -14,16 +15,38 @@
++++
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` est un filtre qui ne fait passer qu'une bande de fréquences de taille réglable. Toutes les autres fréquences sont supprimées. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. En utilisant une gamme de fréquences plus large (donc en réglant BANDPASS_WIDTH sur une valeur plus élevée), les sons qui semblent « trop gros » pour un mixage peuvent être atténués afin de mieux s'intégrer aux autres sons du mixage.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|BANDPASS_FREQ |La fréquence centrale (en Hz) de la fenêtre des fréquences à passer. |800.0 |20.0 |20000.0
+
+|BANDPASS_WIDTH |Le degré d'amplification d'une bande étroite de fréquences autour du niveau actuel de `FILTER_FREQ`. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
-`BANDPASS` est un filtre qui ne fait passer qu'une bande de fréquences de taille réglable. Toutes les autres fréquences sont supprimées. En limitant considérablement la gamme de fréquences du son original (lorsque BANDPASS_WIDTH est défini à une valeur relativement faible), le filtre peut produire des sons à effet spécial, comme le son de « mégaphone » qui est populaire dans certaines musiques rock modernes, ou le son du téléphone ou d'un petit haut-parleur. En utilisant une gamme de fréquences plus large (donc en réglant BANDPASS_WIDTH sur une valeur plus élevée), les sons qui semblent « trop gros » pour un mixage peuvent être atténués afin de mieux s'intégrer aux autres sons du mixage.
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |0.1 |0.0 |1.0
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| BANDPASS_FREQ | La fréquence centrale (en Hz) de la fenêtre des fréquences à passer. | 800.0 | 20.0 | 20000.0
-| BANDPASS_WIDTH | La largeur (en Hz) de la fenêtre des fréquences à passer. | 0.5 | 0.0 | 1.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 0.1 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[chorus]]
=== CHORUS
@@ -37,17 +60,44 @@
++++
-`CHORUS` crée diverses copies du son original qui sont légèrement modifiées sur le plan de la hauteur et du temps et mixées à nouveau dans le son, créant ainsi un effet d'ensemble de plusieurs voix jouant ensemble. À des valeurs extrêmes de réglage des paramètres, on peut entendre des sons artificiels ressemblant à ceux d'un robot.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` crée diverses copies du son original qui sont légèrement modifiées sur le plan de la hauteur et du temps et mixées à nouveau dans le son, créant ainsi un effet d'ensemble de plusieurs voix jouant ensemble.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|CHORUS_LENGTH |La durée (en ms) du son original pendant laquelle l'effet Chorus est activé. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |Le nombre de copies du son original utilisé. Des valeurs plus élevées créent un effet d'ensemble plus important. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |La fréquence (en Hz) à laquelle la hauteur du son se déplace ou « oscille ». Les valeurs faibles créent des sons réguliers, tandis que les valeurs élevées créent des effets plus ondulatoires. |0.5 |0.1 |16.0
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| CHORUS_LENGTH | La durée (en ms) du son original pendant laquelle l'effet Chorus est activé. | 15.0 | 1.0 | 250.0
-| CHORUS_NUMVOICES | Le nombre de copies du son original utilisé. Des valeurs plus élevées créent un effet d'ensemble plus important. | 1.0 | 1.0 | 8.0
-| CHORUS_RATE | La fréquence (en Hz) à laquelle la hauteur du son se déplace ou « oscille ». Les valeurs faibles créent des sons réguliers, tandis que les valeurs élevées créent des effets plus ondulatoires. | 0.5 | 0.1 | 16.0
-| CHORUS_MOD | La profondeur de l'oscillation de la hauteur (c'est-à-dire la quantité de cycles de hauteur utilisés). Les réglages bas créent un son plus naturel, tandis que les paramètres plus élevés créent un son plus artificiel. | 0.7 | 0.0 | 1.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|CHORUS_MOD |La profondeur de l'oscillation de la hauteur (c'est-à-dire la quantité de cycles de hauteur utilisés). Les réglages bas créent un son plus naturel, tandis que les paramètres plus élevés créent un son plus artificiel. |0.7 |0.0 |1.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[compressor]]
=== COMPRESSOR
@@ -61,14 +111,34 @@
++++
-`COMPRESSOR` est un compresseur de deux paramètres de base, qui réduit le volume des sons les plus forts de la piste avec effet, tout en amplifiant le volume de ses sons les plus faibles. Cela crée une plage dynamique plus étroite à partir du son d'origine et est souvent utilisé pour maximiser la force du son original, tout en réduisant le bruit à ajouter plus tard.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |Le niveau d'amplitude (volume) (en dB) au-dessus duquel le compresseur commence à réduire le volume. |-18.0 |-30.0 |0.0
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| COMPRESSOR_THRESHOLD | Le niveau d'amplitude (volume) (en dB) au-dessus duquel le compresseur commence à réduire le volume. | -18.0 | -30.0 | 0.0
-| COMPRESSOR_RATIO | Le taux de réduction de gain spécifié. Un ratio de 3:1 signifie que si le son d'origine est de 3 dB au-dessus du seuil, alors le son avec effet sera de 1 dB au-dessus du seuil. | 10.0 | 1.0 | 100.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|COMPRESSOR_RATIO |Le taux de réduction de gain spécifié. Un ratio de 3:1 signifie que si le son d'origine est de 3 dB au-dessus du seuil, alors le son avec effet sera de 1 dB au-dessus du seuil. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[delay]]
=== DELAY
@@ -82,15 +152,38 @@
++++
-`DELAY` crée un délai ressemblant à un écho répété du son d'origine. Un effet de délai permet de lire l'audio d'origine ainsi qu'une version avec délai plus silencieuse de l'original qui sonne comme un écho. Après le premier écho, il joue un écho de l'écho (encore plus silencieux), puis un écho de l'écho de l'écho (encore plus silencieux) et ainsi de suite jusqu'à ce que l'écho disparaisse. Avec l'effet de délai, nous pouvons contrôler combien de temps passe entre chaque écho (délai). Si nous réglons le délai de manière à ce qu'il corresponde à la durée d'un beat, nous pouvons créer des effets rythmiques avec délai.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` crée un délai ressemblant à un écho répété du son d'origine. Un effet de délai permet de lire l'audio d'origine ainsi qu'une version avec délai plus silencieuse de l'original qui sonne comme un écho. Après le premier écho, il joue un écho de l'écho (encore plus silencieux), puis un écho de l'écho de l'écho (encore plus silencieux) et ainsi de suite jusqu'à ce que l'écho disparaisse. Si nous réglons le délai de manière à ce qu'il corresponde à la durée d'un beat, nous pouvons créer des effets rythmiques avec délai.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|DELAY_TIME |La durée en millisecondes (en ms) pendant laquelle la piste d'origine subit l'effet de délai et le temps entre les répétitions successives du délai. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |La quantité relative de répétitions que le délai génère. Des valeurs plus élevées créent plus d'« échos ». Cependant, faites attention à appliquer trop de « feedback » ! |-3.0 |-120.0 |-1.0
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| DELAY_TIME | La durée en millisecondes (en ms) pendant laquelle la piste d'origine subit l'effet de délai et le temps entre les répétitions successives du délai. | 300.0 | 0.0 | 4000.0
-| DELAY_FEEDBACK | La quantité relative de répétitions que le délai génère. Des valeurs plus élevées créent plus d'« échos ». Cependant, faites attention à appliquer trop de « feedback » ! | -3.0 | -120.0 | -1.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 0.5 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[distortion]]
=== DISTORTION
@@ -104,14 +197,34 @@
++++
-`DISTORTION` crée un son « sale » ou « saturé » en surchargeant le son original. Cela comprime ou écrête l'onde sonore, ajoutant des harmoniques (des fréquences plus élevées liées au son d'origine). Il est courant de déformer le son d'une guitare électrique en « surchargeant » l'amplificateur de la guitare. La musique moderne utilise parfois la distorsion pour ajouter un effet ou une sensation grunge ou granuleuse à la composition.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+Cela comprime ou écrête l'onde sonore, ajoutant des harmoniques (des fréquences plus élevées liées au son d'origine). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|DISTO_GAIN |Le taux de surcharge du son original. |20.0 |0.0 |50.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| DISTO_GAIN | Le taux de surcharge du son original. | 20.0 | 0.0 | 50.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[eq3band]]
=== EQ3BAND
@@ -125,19 +238,50 @@
++++
-`EQ3BAND` est un égaliseur à trois bandes utilisé pour des tâches d'égalisation simples. Un égaliseur est utilisé pour régler le volume des gammes de fréquences séparées dans une piste audio. Cet effet particulier peut être utilisé pour régler le volume de trois gammes (« bandes ») de fréquence, à savoir les graves, les médiums et les aigus (bas, moyen, haut), où la limite supérieure (`EQ3BAND_LOWFREQ`) de la gamme des graves et la fréquence centrale de la gamme des médiums (`EQ3BAND_MIDFREQ`) peuvent être réglées par l'utilisateur.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` est un égaliseur à trois bandes utilisé pour des tâches d'égalisation simples. EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |Le gain (en dB) de la gamme de basses fréquences de l'EQ. Les valeurs négatives réduisent le volume des basses fréquences, tandis que les valeurs positives les augmentent. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Indique la fréquence la plus élevée (en Hz) de la gamme de basses fréquences. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |Le gain (en dB) de la gamme de moyennes fréquences de l'EQ. Les valeurs négatives réduisent le volume des moyennes fréquences, tandis que les valeurs positives les augmentent. |0.0 |-24.0 |18.0
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| EQ3BAND_LOWGAIN | Le gain (en dB) de la gamme de basses fréquences de l'EQ. Les valeurs négatives réduisent le volume des basses fréquences, tandis que les valeurs positives les augmentent. | 0.0 | -24.0 | 18.0
-| EQ3BAND_LOWFREQ | Indique la fréquence la plus élevée (en Hz) de la gamme de basses fréquences. | 200.0 | 20.0 | 20000.0
-| EQ3BAND_MIDGAIN | Le gain (en dB) de la gamme de moyennes fréquences de l'EQ. Les valeurs négatives réduisent le volume des moyennes fréquences, tandis que les valeurs positives les augmentent. | 0.0 | -24.0 | 18.0
-| EQ3BAND_MIDFREQ | Indique la fréquence centrale (en Hz) de la gamme de moyennes fréquences. | 2000.0 | 20.0 | 20000.0
-| EQ3BAND_HIGHGAIN | Le gain (en dB) de la gamme de hautes fréquences de l'EQ. Les valeurs négatives réduisent le volume des hautes fréquences, tandis que les valeurs positives les augmentent. | 0.0 | -24.0 | 18.0
-| EQ3BAND_HIGHFREQ | Indique la fréquence de coupure (en Hz) de la gamme de hautes fréquences. | 2000.0 | 20.0 | 20000.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|EQ3BAND_MIDFREQ |Indique la fréquence centrale (en Hz) de la gamme de moyennes fréquences. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |Le gain (en dB) de la gamme de hautes fréquences de l'EQ. Les valeurs négatives réduisent le volume des hautes fréquences, tandis que les valeurs positives les augmentent. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Indique la fréquence de coupure (en Hz) de la gamme de hautes fréquences. |2000.0 |20.0 |20000.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[filter]]
=== FILTER
@@ -151,15 +295,38 @@
++++
-`FILTER` est un filtre passe-bas type avec résonance. Un effet filtre passe-bas permet à l'audio de basse fréquence de passer inchangé, tout en abaissant le volume des fréquences supérieures à une fréquence de coupure (le paramètre `FILTER_FREQ`). Cela donne à l'audio un son plus « sombre ».
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. Un effet filtre passe-bas permet à l'audio de basse fréquence de passer inchangé, tout en abaissant le volume des fréquences supérieures à une fréquence de coupure (le paramètre `FILTER_FREQ`).
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| FILTER_FREQ | La fréquence de coupure (Hz), ce qui signifie que toutes les fréquences supérieures à cette valeur sont atténuées (leur volume devient de plus en plus faible à mesure qu'elles sont plus élevées que cette valeur). | 1000.0 | 20.0 | 20000.0
-| FILTER_RESONANCE | Le degré d'amplification d'une bande étroite de fréquences autour du niveau actuel de `FILTER_FREQ`. Cela permet aux fréquences situées autour du niveau actuel de `FILTER_FREQ` de résonner davantage, d'être plus « résonantes ». Cela crée également un son plus vibrant et sonnant autour de la fréquence de coupure (`FILTER_FREQ`) de manière efficace. Lorsque les valeurs de résonance sont élevées, le filtre devient plus « accentué » autour de la fréquence `FILTER_FREQ`, ce qui accentue les fréquences les plus proches de la fréquence de coupure. Il s'agit d'un paramètre subtil qui aide à affiner le son du filtre. | 0.8 | 0.0 | 1.0 | `FILTER_RESONANCE`
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|FILTER_FREQ |La fréquence de coupure (Hz), ce qui signifie que toutes les fréquences supérieures à cette valeur sont atténuées (leur volume devient de plus en plus faible à mesure qu'elles sont plus élevées que cette valeur). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |Cela permet aux fréquences situées autour du niveau actuel de `FILTER_FREQ` de résonner davantage, d'être plus « résonantes ». Lorsque les valeurs de résonance sont élevées, le filtre devient plus « accentué » autour de la fréquence `FILTER_FREQ`, ce qui accentue les fréquences les plus proches de la fréquence de coupure. |0.8 |0.0 |1.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[flanger]]
=== FLANGER
@@ -173,16 +340,42 @@
++++
-`FLANGER` est similaire à un effet Chorus, qui consiste à créer plusieurs copies du son original, à les faire varier légèrement en hauteur et en temps, puis à les remixer dans le son. Par contre, un effet « Flanger » utilise une plage de valeurs de temps beaucoup plus réduite, ce qui crée un son évolutif de type « whoosh ». À des valeurs extrêmes de réglage des paramètres, on peut entendre des sons plus artificiels ressemblant à ceux d'un robot.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| FLANGER_LENGTH | La durée du délai (en ms) par rapport au son original pendant laquelle l'effet Flanger est activé. | 6.0 | 0.0 | 200.0
-| FLANGER_FEEDBACK | La quantité (en dB) du son produit qui est « réinjecté » dans l'effet. Des valeurs plus élevées créent plus de sons artificiels. | -50.0 | -80.0 | -1.0
-| FLANGER_RATE | La fréquence (en Hz) à laquelle la hauteur du son se déplace ou produit un « whoosh ». Les valeurs faibles créent des sons plus réguliers, tandis que les valeurs élevées créent des effets plus sonores et des artefacts sonores. | 0.6 | 0.001 | 100.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+`FLANGER` est similaire à un effet Chorus, qui consiste à créer plusieurs copies du son original, à les faire varier légèrement en hauteur et en temps, puis à les remixer dans le son. À des valeurs extrêmes de réglage des paramètres, on peut entendre des sons plus artificiels ressemblant à ceux d'un robot.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|FLANGER_LENGTH |La durée du délai (en ms) par rapport au son original pendant laquelle l'effet Flanger est activé. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |La quantité (en dB) du son produit qui est « réinjecté » dans l'effet. Des valeurs plus élevées créent plus de sons artificiels. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Les valeurs faibles créent des sons plus réguliers, tandis que les valeurs élevées créent des effets plus sonores et des artefacts sonores. |0.6 |0.001 |100.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[pan]]
=== PAN
@@ -196,13 +389,30 @@
++++
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
`PAN` affecte le mixage audio entre les canaux gauche et droit. Par exemple, si vous portez des écouteurs, le fait de modifier le panoramique déterminera si vous entendez quelque chose dans l'oreille gauche ou dans l'oreille droite.
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| LEFT_RIGHT | Précise l'emplacement gauche ou droit du son original dans le champ stéréo (0.0 correspond au centre, -100.0 correspond à une position entièrement gauche, 100.0 correspond à une position entièrement droite). | 0.0 | -100.0 | 100.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|LEFT_RIGHT |Précise l'emplacement gauche ou droit du son original dans le champ stéréo (0.0 correspond au centre, -100.0 correspond à une position entièrement gauche, 100.0 correspond à une position entièrement droite). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[phaser]]
=== PHASER
@@ -216,17 +426,46 @@
++++
-`PHASER` est un effet de balayage qui crée une copie du son original sur une gamme de fréquences spécifiée. Cette copie produite subit ensuite un très léger délai et est jouée contre le son original tout en modifiant légèrement son temps de délai dans un sens ou dans l'autre. Ainsi, certaines des fréquences copiées s'annulent temporairement en étant « en phase et hors phase » les unes avec les autres, créant ainsi un effet de balayage.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` est un effet de balayage qui crée une copie du son original sur une gamme de fréquences spécifiée. Ainsi, certaines des fréquences copiées s'annulent temporairement en étant « en phase et hors phase » les unes avec les autres, créant ainsi un effet de balayage.
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| PHASER_RATE | La fréquence (en Hz) à laquelle le léger délai varie dans les deux sens. Les valeurs faibles créent des sons plus réguliers, tandis que les valeurs élevées créent des effets plus robotiques et des artefacts sonores. | 0.5 | 0.0 | 10.0
-| PHASER_RANGEMIN | La faible valeur (en Hz) de la gamme de fréquences affectée. | 440.0 | 40.0 | 20000.0
-| PHASER_RANGEMAX | La valeur élevée (en Hz) de la gamme de fréquences affectée. | 1600.0 | 40.0 | 20000.0
-| PHASER_FEEDBACK | La quantité du son produit qui est « réinjecté » dans l'effet. Des valeurs plus élevées créent plus de sons artificiels. | -3.0 | -120.0 | -1.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|PHASER_RATE |La fréquence (en Hz) à laquelle le léger délai varie dans les deux sens. Les valeurs faibles créent des sons plus réguliers, tandis que les valeurs élevées créent des effets plus robotiques et des artefacts sonores. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |La faible valeur (en Hz) de la gamme de fréquences affectée. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |La valeur élevée (en Hz) de la gamme de fréquences affectée. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |La quantité du son produit qui est « réinjecté » dans l'effet. Des valeurs plus élevées créent plus de sons artificiels. |-3.0 |-120.0 |-1.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[pitchshift]]
=== PITCHSHIFT
@@ -240,13 +479,30 @@
++++
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
`PITCHSHIFT` permet simplement de diminuer ou d'augmenter le son d'un intervalle de hauteur spécifique (`PITCHSHIFT_SHIFT`). Cela peut être utile pour que plusieurs fichiers sonores sonnent mieux ensemble ou, au contraire, pour ajouter un peu de dissonance, si vous le souhaitez.
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| PITCHSHIFT_SHIFT | Indique le niveau d'ajustement de la hauteur du son d'origine en demi-tons (et fractions de demi-ton, exprimées par des valeurs après la virgule). 12 demi-tons correspondent à une octave. | 0.0 | -12.0 | 12.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Indique le niveau d'ajustement de la hauteur du son d'origine en demi-tons (et fractions de demi-ton, exprimées par des valeurs après la virgule). 12 demi-tons correspondent à une octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[reverb]]
=== REVERB
@@ -260,15 +516,38 @@
++++
-`REVERB` ajoute une ambiance à décroissance lente au signal source, similaire à l'effet `DELAY` mais souvent beaucoup plus dense et riche. Il est largement utilisé pour le mixage audio et la spatialisation.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| REVERB_TIME | Le temps de décroissance de l'ambiance en millisecondes (ms). Lors de la modulation de REVERB_TIME au fil du temps à l'aide de la courbe d'automation, en raison de la nature de la réverbération à convolution, la valeur n'est mise à jour que toutes les noires (time=0.25) à la manière d'un escalier à partir du point de départ de l'automation (cependant, ceci est à peine remarquable). | 1500.0 | 100.0 | 4000.0
-| REVERB_DAMPFREQ | La fréquence de coupure (en Hz) du filtre passe-bas appliqué à l'ambiance. Plus la valeur est basse, plus la réverbération donnera un effet sombre. | 10000.0 | 200.0 | 18000.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 0.3 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|REVERB_TIME |Le temps de décroissance de l'ambiance en millisecondes (ms). Lors de la modulation de REVERB_TIME au fil du temps à l'aide de la courbe d'automation, en raison de la nature de la réverbération à convolution, la valeur n'est mise à jour que toutes les noires (time=0.25) à la manière d'un escalier à partir du point de départ de l'automation (cependant, ceci est à peine remarquable). (cependant, ceci est à peine remarquable). |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |La fréquence de coupure (en Hz) du filtre passe-bas appliqué à l'ambiance. Plus la valeur est basse, plus la réverbération donnera un effet sombre. |10000.0 |200.0 |18000.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[ringmod]]
=== RINGMOD
@@ -282,15 +561,38 @@
++++
-`RINGMOD` multiplie les signaux provenant de deux sons en même temps : votre son original et une onde sinusoïdale pure (qui ressemble à un diapason). L'effet de cette multiplication produit un son différent à chaque fréquence du son original, ce qui crée un résultat complètement artificiel, car ce type de son ne pourrait jamais se produire naturellement. Certains réglages de paramètres pour cet effet produiront probablement des effets sonores reconnaissables, semblables à ceux utilisés dans les vieux films de science-fiction. Il peut être ainsi utile d'expérimenter avec cet effet, car il existe un large éventail de sons qui peuvent être générés à partir de votre son original.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` multiplie les signaux provenant de deux sons en même temps : votre son original et une onde sinusoïdale pure (qui ressemble à un diapason). Certains réglages de paramètres pour cet effet produiront probablement des effets sonores reconnaissables, semblables à ceux utilisés dans les vieux films de science-fiction.
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| RINGMOD_MODFREQ | La fréquence (en Hz) de l'oscillateur sinusoïdal qui est multipliée dans votre son original. | 40.0 | 0.0 | 100.0
-| RINGMOD_FEEDBACK | La quantité du son produit qui est « réinjecté » dans l'effet. Des valeurs élevées créent plus de sons robotiques et d'artefacts sonores. | 0.0 | 0.0 | 100.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|RINGMOD_MODFREQ |La fréquence (en Hz) de l'oscillateur sinusoïdal qui est multipliée dans votre son original. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |La quantité du son produit qui est « réinjecté » dans l'effet. Des valeurs élevées créent plus de sons robotiques et d'artefacts sonores. |0.0 |0.0 |100.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[tremolo]]
=== TREMOLO
@@ -304,15 +606,38 @@
++++
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
`TREMOLO` modifie rapidement le volume du son original alternativement de sa valeur initiale au silence, ce qui entraîne un effet de sonorité vacillante.
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| TREMOLO_FREQ | La fréquence (en Hz) à laquelle le volume est modifié dans les deux sens. | 4.0 | 0.0 | 100.0
-| TREMOLO_AMOUNT | Le niveau (en dB) pour lequel le volume change alternativement au cours de chaque cycle. | -6.0 | -60.0 | 0.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|TREMOLO_FREQ |La fréquence (en Hz) à laquelle le volume est modifié dans les deux sens. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |Le niveau (en dB) pour lequel le volume change alternativement au cours de chaque cycle. |-6.0 |-60.0 |0.0
+
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[volume]]
=== VOLUME
@@ -326,13 +651,30 @@
++++
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
`VOLUME` vous permet de modifier le volume d'un clip audio.
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| GAIN | Indique le niveau de volume de sortie du son original. | 0.0 | -60.0 | 12.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|GAIN |Indique le niveau de volume de sortie du son original. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
[[wah]]
=== WAH
@@ -346,12 +688,33 @@
++++
-`WAH` est un filtre passe-bande résonant (voir l'effet `BANDPASS`) qui crée un son de pédale de type « wah-wah » lorsque modifié au fil du temps à l'aide d'enveloppes dans la fonction setEffect().
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` est un filtre passe-bande résonant (voir l'effet `BANDPASS`) qui crée un son de pédale de type « wah-wah » lorsque modifié au fil du temps à l'aide d'enveloppes dans la fonction setEffect(). It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Paramètre |Description |Valeur par défaut |minValue |maxValue
+
+|WAH_POSITION |La fréquence centrale de la gamme de fréquences à largeur fixe amplifiée. |0.0 |0.0 |1.0
+|MIX |Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. |1.0 |0.0 |1.0
-|========================================================================
-| Paramètre | Description | Valeur par défaut | minValue | maxValue
-| WAH_POSITION | La fréquence centrale de la gamme de fréquences à largeur fixe amplifiée. | 0.0 | 0.0 | 1.0
-| MIX | Le pourcentage de son produit (avec effet) qui est mixé au son original (sans effet). À sa valeur minimale (0.0), aucun effet ne peut être entendu. À sa valeur maximale (1.0), aucun son original n'est entendu, il s'agit uniquement d'effets. | 1.0 | 0.0 | 1.0
-| BYPASS | Implique que l'effet est activé/"on" (1.0) ou désactivé/"off" (0.0). Si le contournement ou « bypass » est activé/"on" (1.0) pour un effet, cela signifie que l'audio ne sera pas affecté par l'effet. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. | 0.0 | 0.0 | 1.0
-|========================================================================
\ No newline at end of file
+|BYPASS |When you bypass an effect, the effect turns off. Notez que contrairement aux autres paires de nom/paramètre, les seules valeurs valides pour BYPASS sont 0.0 et 1.0. |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/fr/v1/every-error-explained-in-detail.adoc b/src/locales/fr/v1/every-error-explained-in-detail.adoc
index 5b6f3bd7e..09cc6dc39 100644
--- a/src/locales/fr/v1/every-error-explained-in-detail.adoc
+++ b/src/locales/fr/v1/every-error-explained-in-detail.adoc
@@ -1,9 +1,27 @@
[[ch_29]]
== Tous les effets expliqués en détail
+
:nofooter:
-[[importerror]]
-=== Import Error
+[[othererrors]]
+=== Overview
+
+Il arrive que les programmeur.se.s commettent des erreurs qui ont pour effet de mal faire fonctionner le code, voire de ne pas le faire fonctionner du tout. En programmation, les fautes de codage sont appelées *erreurs* ou *bogues*.
+
+Le processus de recherche et de correction des bogues s'appelle le *débogage*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
//Python only
@@ -39,7 +57,7 @@ include::code-examples/every-error-explained-in-detail-import-error-correction.p
*Solution :* Vérifiez que les instructions `from...import` dans la section supérieure de votre script ne comportent pas de fautes de frappe ni d'erreurs de casse.
[role="curriculum-javascript"]
-Les erreurs de type « Import Error » ne se produisent pas en JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
[[indentationerror]]
=== Indentation Error
@@ -149,6 +167,8 @@ include::code-examples/every-error-explained-in-detail-index-error-correction.js
[role="curriculum-python"]
*Description :* Une erreur de type « Name Error » se produit lorsqu'un programme essaie d'utiliser une variable ou d'appeler une fonction qui n'a jamais été définie, le plus souvent en raison d'une faute de frappe.
+Les erreurs de type « Import Error » ne se produisent pas en JavaScript.
+
[role="curriculum-javascript"]
*Description :* Une erreur de type « Name Error » se produit lorsqu'un programme essaie d'utiliser une variable ou d'appeler une fonction qui n'a jamais été définie, le plus souvent en raison d'une faute de frappe. JavaScript fait spécifiquement référence à ce type d'erreur comme étant une erreur de type « Reference Error ».
@@ -158,7 +178,6 @@ include::code-examples/every-error-explained-in-detail-index-error-correction.js
[role="curriculum-javascript"]
*Exemple :* Ci-dessous se trouve un script simple pour afficher la chaîne de caractères assignée à la variable `today`. Cependant, une erreur relative à la fonction `println()` empêche le script de s'exécuter.
-
[role="curriculum-python"]
[source,python]
----
@@ -185,7 +204,7 @@ include::code-examples/every-error-explained-in-detail-name-error-correction.py.
include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
----
-*Solution :* Vérifiez l'orthographe et la casse de vos variables et de vos fonctions. Lorsque vous utilisez une variable ou que vous appelez une fonction, assurez-vous que chacune a été précédemment définie et veillez à bien définir une fonction avant de l'appeler. Bien que vous puissiez coller les noms directement, assurez-vous que vos noms de constantes de sons s'alignent sur les noms de clips dans le navigateur de sons.
+*Solution :* Vérifiez l'orthographe et la casse de vos variables et de vos fonctions. Lorsque vous utilisez une variable ou que vous appelez une fonction, assurez-vous que chacune a été précédemment définie et veillez à bien définir une fonction avant de l'appeler. Notez qu'il manque un deux-points (:) dans l'instruction _if_. Bien que vous puissiez coller les noms directement, assurez-vous que vos noms de constantes de sons s'alignent sur les noms de clips dans le navigateur de sons.
[[parseerror]]
=== Parse Error
@@ -246,10 +265,10 @@ include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
----
[role="curriculum-python"]
-Pour ce script, l'éditeur de code nous signale la ligne fautive. Notez qu'il manque un deux-points (:) dans l'instruction _if_. À la même ligne, il y a également une condition invalide ; il faut utiliser l'opérateur d'égalité `==` au lieu de l'opérateur d'affectation `=`.
+Pour ce script, l'éditeur de code nous signale la ligne fautive. Notice that we forgot to end our _if_ statement with a colon. À la même ligne, il y a également une condition invalide ; il faut utiliser l'opérateur d'égalité `==` au lieu de l'opérateur d'affectation `=`.
[role="curriculum-javascript"]
-Pour ce script, l'éditeur de code nous signale la ligne fautive. Notez qu'il manque une accolade d'ouverture dans l'instruction de corps _if_. À la même ligne, il y a également une condition invalide ; il faut utiliser l'opérateur d'égalité stricte `===` au lieu de l'opérateur d'affectation `=`.
+Pour ce script, l'éditeur de code nous signale la ligne fautive. Notice that we forgot to open our _if_ statement body with a curly brace. À la même ligne, il y a également une condition invalide ; il faut utiliser l'opérateur d'égalité stricte `===` au lieu de l'opérateur d'affectation `=`.
[role="curriculum-python"]
[source,python]
@@ -374,4 +393,4 @@ include::code-examples/every-error-explained-in-detail-value-error-correction.py
include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
----
-*Solution :* Vérifiez vos chaînes de caractères de beat pour vous assurer que les valeurs sont dans la plage appropriée. De plus, confirmez que tous les arguments fournis à la fonction `setEffect()` sont dans la plage requise pour l'effet.
+*Solution :* Vérifiez vos chaînes de caractères de beat pour vous assurer que les valeurs sont dans la plage appropriée. De plus, confirmez que tous les arguments fournis à la fonction `setEffect()` sont dans la plage requise pour l'effet.
\ No newline at end of file
diff --git a/src/locales/fr/v1/the-earSketch-api.adoc b/src/locales/fr/v1/the-earSketch-api.adoc
index 1df17591e..9d979427d 100644
--- a/src/locales/fr/v1/the-earSketch-api.adoc
+++ b/src/locales/fr/v1/the-earSketch-api.adoc
@@ -1,5 +1,6 @@
[[ch_27]]
== L'API de EarSketch
+
:nofooter:
-link:[Cliquez ici] pour ouvrir l'API de EarSketch.
+link:[Cliquez ici] pour ouvrir l'API de EarSketch.
\ No newline at end of file
diff --git a/src/locales/fr/v2/add-beats.adoc b/src/locales/fr/v2/add-beats.adoc
index 74a7ca5d4..e584aacbb 100644
--- a/src/locales/fr/v2/add-beats.adoc
+++ b/src/locales/fr/v2/add-beats.adoc
@@ -1,10 +1,10 @@
[[addsomebeats]]
== Ajoutez quelques « beats » ou rythmes !
+
:nofooter:
Dans ce chapitre, vous apprendrez à créer vos propres beats ! Nous examinerons les variables, une nouvelle fonction appelée makeBeat() ainsi que différents exemples de beats pour différents genres.
-
[[variables]]
=== Les variables
@@ -16,25 +16,26 @@ video::./videoMedia/002-05-Variables-PY.mp4[]
[[video2js]]
video::./videoMedia/002-05-Variables-JS.mp4[]
-Qu'est-ce qu'une variable ? Il s'agit d'un nom qui aidera l'ordinateur à trouver une information ou des données. Cela fonctionne pour toutes sortes de données. Par exemple, une variable peut pointer vers :
+Qu'est-ce qu'une variable ? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
* un chiffre (comme un numéro de piste ou un numéro de mesure) ;
-* un fichier (comme un fichier audio) ;
-* une chaîne de caractères (comme le nom d'un clip audio ou des paroles). Un *caractère* est un chiffre, une lettre ou un symbole, comme `A`, `a`, `2`, ou `=`. Une chaîne de caractères est une série de caractères entourée de guillemets, comme `"Bonjour le monde 123 !"`.
+* un fichier (comme un fichier audio) ;
+* une chaîne de caractères (comme le nom d'un clip audio ou des paroles).
+* Un *caractère* est un chiffre, une lettre ou un symbole, comme `A`, `a`, `2`, ou `=`.
-Nous donnons un nom aux données pour qu'il soit plus facile de les appeler et de les modifier.
+A *character* can be any number, letter or symbol. Une chaîne de caractères est une série de caractères entourée de guillemets, comme `"Bonjour le monde 123 !"`.
-[role="curriculum-python"]
Pour utiliser une variable,
+[role="curriculum-python"]
. Vous devez d'abord lui *affecter une valeur*. Nous utilisons le symbole « = », qui est appelé *l'opérateur d'affectation*. Le fait d'écrire `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` signifie que vous créez une variable appelée synth1 et que vous stockez la donnée (le clip audio) HIPHOP_SYNTHPLUCKLEAD_005 dans cette variable.
. HIPHOP_SYNTHPLUCKLEAD_005 est la *valeur* de `synth1`.
. Ensuite, vous devez appeler la variable : utilisez `synth1` dans votre code. Vous ne pourrez utiliser la variable qu'une fois qu'elle aura été affectée, pas avant. Par exemple, vous pouvez écrire `fitMedia(synth1, 1, 1, 3)`.
-. Lorsque vous exécuterez le code, l'ordinateur comprendra qu'il doit utiliser le nom du clip audio HIPHOP_SYNTHPLUCKLEAD_005 lorsqu'il lit `synth1`.
+. Lorsque vous exécuterez le code, l'ordinateur comprendra qu'il doit utiliser le nom du clip audio HIPHOP_SYNTHPLUCKLEAD_005 lorsqu'il lit `synth1`.
[role="curriculum-javascript"]
-Pour utiliser une variable,
-
. Vous devez d'abord lui *affecter une valeur*. Nous utilisons le symbole « = », qui est appelé *l'opérateur d'affectation*. Nous utilisons également la commande `var` au début de la ligne. L'expression `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` signifie que vous créez une variable appelée synth1 et que vous stockez la donnée (clip audio) HIPHOP_SYNTHPLUCKLEAD_005 dans cette variable.
. HIPHOP_SYNTHPLUCKLEAD_005 est la *valeur* de `synth1`.
. Ensuite, vous devez appeler la variable : utilisez `synth1` dans votre code. Par exemple, vous pouvez écrire `fitMedia(synth1, 1, 1, 3);`.
@@ -52,11 +53,15 @@ include::code-examples/add-beats-instead-of-this.py.txt[]
include::code-examples/add-beats-instead-of-this.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
-Dans vos scripts précédents, utilisez des variables pour stocker vos noms de clips de sons. Consultez les exemples ci-dessous pour obtenir de l'aide. Assurez-vous que vos variables comportent des noms courts et compréhensibles (comme « bass », « voice_1 », ...) qui décrivent votre clip de son.
+Dans vos scripts précédents, utilisez des variables pour stocker vos noms de clips de sons. Consultez les exemples ci-dessous pour obtenir de l'aide. Assurez-vous que vos variables comportent des noms courts et compréhensibles (comme « bass », « voice_1 », ...)
****
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
@@ -68,6 +73,7 @@ include::code-examples/add-beats-variables.py.txt[]
----
include::code-examples/add-beats-variables.js.txt[]
----
+
Notez qu'il est important de nommer votre variable de manière compréhensible et descriptive. Par exemple, utilisez `synth1` au lieu de `music1` ou `test`, qui ne fournissent aucune information. De cette façon, lorsque vous ou quelqu'un d'autre lisez votre code, il est facile de comprendre à quoi vous faites référence.
Une *constante* est similaire à une variable, car elle stocke des valeurs. Toutefois, la valeur d'une constante ne change jamais. Par exemple, dans EarSketch, `TECHNO_SYNTHPLUCK_001` est une constante, elle fait référence au fichier audio correspondant. Par convention, les noms de constante sont en majuscule et utilisent des traits de soulignement au lieu d'espaces.
@@ -77,27 +83,28 @@ Une *constante* est similaire à une variable, car elle stocke des valeurs. Tout
Commençons par découvrir quelques notions de base sur le rythme :
-* Le *rythme* d'une chanson est la manière dont les sons sont arrangés dans le temps.
+* *Rhythm* is a pattern of sound, often repeated.
* Le *tempo* est la vitesse de la musique en BPM (battements ou beats par minute).
* Le *temps ou « beat »* est comme le « pouls régulier » d'une chanson. Lors d'un concert, lorsqu'un public tape des mains, il suit le beat.
-* Une *mesure* est une unité de temps musicale avec un nombre de beats prédéterminé. Dans EarSketch, 1 *mesure* comporte 4 temps. Les beats sont aussi appelés des *noires*. En anglais, comme il y a 4 beats par measure, on appelle les beats des 1/4 notes.
-* Chaque temps peut être divisé en *sous-temps*. Par exemple, une noire peut valoir *deux croches (1/8)*. Lorsque vous comptez des noires, vous dites « 1, 2, 3, 4... ». En comptant des croches, vous pouvez utiliser le terme « et » : « 1 et 2 et 3 et 4 et... ». Une croche peut également valoir * deux doubles croches (1/16)*.
-* Une mesure correspond à 4 noires ou 8 croches ou 16 doubles croches. Notez que la somme de toutes les notes d'une mesure doit être égale à 1. Elles peuvent être mélangées et combinées comme 1/4 (noire) + 1/4 (noire) + [1/8 (croche) + 1/8 (croche)] + [1/16 (double croche) + 1/16 (double croche) + 1/16 (double croche) + 1/16 (double croche)] = 1.
+* Une *mesure* est une unité de temps musicale avec un nombre de beats prédéterminé. Dans EarSketch, 1 *mesure* comporte 4 temps. En anglais, comme il y a 4 beats par measure, on appelle les beats des 1/4 notes.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. Lorsque vous comptez des noires, vous dites « 1, 2, 3, 4... En comptant des croches, vous pouvez utiliser le terme « et » : « 1 et 2 et 3 et 4 et...
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Notez que la somme de toutes les notes d'une mesure doit être égale à 1. Elles peuvent être mélangées et combinées comme 1/4 (noire) + 1/4 (noire) + [1/8 (croche) + 1/8 (croche)] + [1/16 (double croche) + 1/16 (double croche) + 1/16 (double croche) + 1/16 (double croche)] = 1.
* Un *métronome* aide le musicien à régler le rythme de sa pièce en faisant un bruit de clic sur le temps. Dans la station de travail audionumérique (DAW) de EarSketch, vous pouvez activer ou désactiver le métronome à l'aide de l'icône du métronome à gauche du niveau du son.
[[imediameasurepng]]
.Une mesure
-[caption="Figure 1: "]
-image::../media/U1P1/beat.png[A measure]
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
[[imediabeatpng]]
.Un temps
-[caption="Figure 2: "]
+[caption="Figure 3.2.2: "]
image::../media/U1P1/beat.png[A beat]
[[imediasixteenthnotepng]]
.Une double croche
-[caption="Figure 3: "]
+[caption="Figure 3.2.3: "]
image::../media/U1P1/sixteenthnote.png[A sixteenth note]
.ENTRAÎNEZ-VOUS
@@ -105,48 +112,54 @@ image::../media/U1P1/sixteenthnote.png[A sixteenth note]
Écoutez votre chanson préférée et essayez de taper des mains sur le rythme. Vous pouvez faire cet exercice avec votre voisin.e.
****
-Nous allons créer un nouveau type de variable : des *chaînes de percussion* pour nos motifs percussifs.
-Une chaîne de percussion est une chaîne de caractères utilisant les caractères `« 0 »`, `« + »` ou `« - »`. Par exemple : `"0-00-00-0+++0+0+"`. En général, elle est composée de 16 caractères, mais sa longueur peut varier. Chaque caractère correspond à une double croche (1/16), donc les chaînes de percussion de 16 caractères dureront une mesure.
+We'll compose each of our rhythms in a *beat* string.
+
+Une chaîne de percussion est une chaîne de caractères utilisant les caractères `« 0 »`, `« + »` ou `« - »`. Pour rappel, une chaîne de caractères est un type de données.
+
+Par exemple : `"0-00-00-0+++0+0+"`.
* `0` commence à jouer le clip de son percussif (un seul coup de percussion, par exemple).
* `+` prolonge le clip audio à la prochaine demi-croche (1/16). Il suit toujours un `0` ou `+`.
* `-` correspond à un silence.
-Pour rappel, une chaîne de caractères est un type de données. Elle se compose d'une série de caractères (comme `0` ou `+`) entre guillemets.
-
.ENTRAÎNEZ-VOUS
****
-Pour chacune des chaînes de percussion suivantes, essayez de taper des mains sur les zéros. Écoutez ensuite le clip audio correspondant et comparez votre réponse. Cet exercice vous aidera à comprendre comment fonctionnent les chaînes de percussion.
+Pour chacune des chaînes de percussion suivantes, essayez de taper des mains sur les zéros. Écoutez ensuite le clip audio correspondant et comparez votre réponse. Cet exercice vous aidera à comprendre comment fonctionnent les chaînes de percussion.
****
Voici quelques exemples de chaînes de percussion à une mesure :
Quarter notes: `"0\+++0+++0\+++0+++"`
(read: "1,2,3,4")
+
++++
audioMedia/beatString1.mp3
++++
Croches : `"0+0+0+0+0+0+0+0+"`
(lire : "1 et 2 et 3 et 4")
+
++++
audioMedia/beatString11.mp3
++++
Doubles croches : `"00000000000000000000"`
(c'est très rapide, selon le tempo)
+
++++
audioMedia/beatString12.mp3
++++
`"0-0-0---0-0-0---"`
(lire : "1 et 2, 3 et 4")
+
++++
audioMedia/beatString2.mp3
++++
`"0---0---0-0-0---"`
(lire : "1, 2, 3 et 4")
+
++++
audioMedia/beatString3.mp3
++++
@@ -157,22 +170,23 @@ Doubles croches : `"00000000000000000000"`
audioMedia/beatString4.mp3
++++
+{nbsp} +
+
////
ADDITIONAL VIDEO TO BE ADDED
See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
video revamping tab
////
-
[[makebeat]]
=== La fonction `makeBeat()`
Maintenant, voyons comment vous pouvez créer votre rythme ou « beat ». Ici, nous utiliserons le terme « beat » au lieu de rythme percussif : un motif répété de sons percussifs. Nous utiliserons la fonction `makeBeat()` avec quatre arguments :
-. *Nom du clip* : Il s'agit du clip audio que vous désirez. Vous pouvez utiliser le filtre Artist dans la bibliothèque de sons et sélectionner « MAKEBEAT » : ce sont des clips audio courts adaptés pour les motifs rythmiques.
-. *Numéro de piste* : Il s'agit de la piste sur laquelle se trouvera votre beat.
+. *Sound*: A sound constant. Vous pouvez utiliser le filtre Artist dans la bibliothèque de sons et sélectionner « MAKEBEAT » : ce sont des clips audio courts adaptés pour les motifs rythmiques. These are short sounds appropriate for beat patterns.
+. *trackNumber :* La piste sur laquelle la musique est placée.
. *Numéro de mesure* : Il s'agit de la mesure de départ pour votre beat.
-. *Chaîne de percussion* : Il s'agit d'une chaîne composée des caractères `« 0 »`, `« + »`, et `« - »`.
+. *Chaîne de percussion :* Une chaîne de caractères qui spécifie le rythme créé.
Par exemple : `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` placera votre motif `0--0--000--00-0-` sur la piste 1, à la mesure 1, en utilisant le clip audio `DUBSTEP_FILTERCHORD_002`.
@@ -180,11 +194,11 @@ Découvrons plus de détails dans la vidéo suivante :
[role="curriculum-python curriculum-mp4"]
[[video12py]]
-video::./videoMedia/011-03-makeBeat()-PY.mp4[]
+video::./videoMedia/3_3_makebeat_py.mp4[]
[role="curriculum-javascript curriculum-mp4"]
[[video12js]]
-video::./videoMedia/011-03-makeBeat()-JS.mp4[]
+video::./videoMedia/3_3_makebeat_js.mp4[]
Voici l'exemple montré dans la vidéo :
@@ -200,6 +214,8 @@ include::code-examples/add-beats-multi-beat.py.txt[]
include::code-examples/add-beats-multi-beat.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
Créez une nouvelle variable `beatString1` , une chaîne de 16 caractères avec les caractères `"0"`, `"+"`, et `"-"`.
@@ -213,6 +229,8 @@ Remarques importantes :
Lorsque vous jouerez votre musique, si vous n'aimez pas votre première version, ne vous en faites pas : vous n'avez qu'à améliorer votre beat jusqu'à ce que vous en soyez entièrement satisfait.
****
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
Créez un nouveau script et ajoutez deux ou trois clips de sons en utilisant `fitMedia()`. Utilisez des variables pour stocker les noms de vos clips.
@@ -227,9 +245,9 @@ Vous avez appris qu'un genre musical est un type de composition artistique (par
Nous utiliserons trois types de sons : une grosse caisse ou « kick » (piste 1), une caisse claire ou « snare » (piste 2) et un charleston ou « hihat » (piste 3). Nous utiliserons une fonction `makeBeat()` pour chacun de ces sons, sur trois pistes différentes.
-////
-video is currently being edited
-////
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
Voici le code correspondant :
@@ -248,16 +266,16 @@ include::code-examples/add-beats-examples-of-beats.js.txt[]
[[chapter3summary]]
=== Résumé du chapitre 3
-* Dans EarSketch, une mesure est divisée en quatre temps ou quatre noires. Un temps est divisé en quatre doubles croches.
-* Les *variables* créent un espace dans la mémoire de l'ordinateur pour stocker des données.
+* Dans EarSketch, une mesure est divisée en quatre temps ou quatre noires. Chaque caractère correspond à une double croche (1/16), donc les chaînes de percussion de 16 caractères dureront une mesure.
+* Les *variables* créent un espace dans la mémoire de l'ordinateur pour stocker des données.
* Vous devez d'abord affecter la valeur (les données) au nom de la variable en utilisant le signe `=`. Ensuite, vous pouvez utiliser la variable en écrivant son nom dans le code.
-* Une *chaîne de caractères* est un type de données qui se compose d'une série de caractères entourés de guillemets simples ou doubles.
+* Une *chaîne de caractères* est un type de données qui se compose d'une série de caractères entourés de guillemets simples ou doubles.
* Des clips de sons percussifs peuvent être trouvés en utilisant le filtre ARTIST dans le navigateur de sons ; sélectionnez l'artiste MAKEBEAT.
* Les chaînes de caractères sont utilisées avec la fonction `makeBeat()` pour créer des motifs rythmiques dans EarSketch. `makeBeat()` utilise une chaîne de beat pour définir chaque double croche de son motif. Un `0` commence à jouer un clip, un `+` prolonge la note jusqu’à la prochaine double croche et `-` crée un silence.
* La fonction `makeBeat()` nécessite quatre arguments :
-** *clipName :* Le clip à partir duquel un beat est construit.
+** *Sound*: A sound constant
** *trackNumber :* La piste sur laquelle la musique est placée.
-** *measureNumber :* La mesure de départ du beat. La chaîne du beat détermine la longueur totale.
+** *Numéro de mesure* : Il s'agit de la mesure de départ pour votre beat.
** *Chaîne de percussion :* Une chaîne de caractères qui spécifie le rythme créé.
* Différents motifs rythmiques correspondent à différents genres musicaux.
@@ -267,16 +285,18 @@ include::code-examples/add-beats-examples-of-beats.js.txt[]
[question]
--
Parmi les options suivantes, laquelle est une chaîne de caractères ?
+
[answers]
* "Cinq"
* 5
-* CINQ
+* ENTRAÎNEZ-VOUS
* Cinq
--
[question]
--
Quel rôle joue le caractère "0" dans une chaîne de beat ou de motif rythmique ?
+
[answers]
* Commence à jouer le clip
* Silence
@@ -287,6 +307,7 @@ Quel rôle joue le caractère "0" dans une chaîne de beat ou de motif rythmique
[question]
--
Dans EarSketch, une mesure correspond à...
+
[answers]
* 4 temps
* 4 sous-temps
@@ -296,7 +317,8 @@ Dans EarSketch, une mesure correspond à...
[question]
--
-Une double croche correspond à...
+One sixteenth note is...
+
[answers]
* un quart de noire
* un demi-temps
@@ -307,9 +329,10 @@ Une double croche correspond à...
[question]
--
Pour utiliser la fonction `makeBeat()`, de quels paramètres avez-vous besoin ?
+
[answers]
* nom du clip, numéro de piste, mesure de départ, chaîne du beat
* tempo, numéro de piste, mesure de départ, mesure de fin
* nom du clip, mesure de départ, mesure de fin, chaîne du beat
* chaîne du beat, numéro de piste, mesure de départ, nom du clip
---
+--
\ No newline at end of file
diff --git a/src/locales/fr/v2/code-examples/add-beats-variables.js.txt b/src/locales/fr/v2/code-examples/add-beats-variables.js.txt
index 8304651bb..09991e11d 100644
--- a/src/locales/fr/v2/code-examples/add-beats-variables.js.txt
+++ b/src/locales/fr/v2/code-examples/add-beats-variables.js.txt
@@ -1,7 +1,7 @@
// Variables : Utilisation de variables pour stocker des clips et simplifier les modifications
// Paramétrage
-setTempo(100);
+setTempo(120);
// Musique
var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigne un clip à la variable "synth1".
@@ -9,7 +9,7 @@ var synth2 = HIPHOP_SOLOMOOGLEAD_001;
var drums = HIPHOP_TRAPHOP_BEAT_008;
// fitMedia() ajoute les clips synth1 et synth2 en alternance sur la piste 1.
-fitMedia(synth1, 1, 1, 2);
+fitMedia(synth1, 1, 1, 1, 2);
fitMedia(synth2, 1, 2, 3);
fitMedia(synth1, 1, 1, 3, 4);
fitMedia(synth2, 1, 4, 5);
diff --git a/src/locales/fr/v2/code-examples/add-beats-variables.py.txt b/src/locales/fr/v2/code-examples/add-beats-variables.py.txt
index bd9341828..8d34c248b 100644
--- a/src/locales/fr/v2/code-examples/add-beats-variables.py.txt
+++ b/src/locales/fr/v2/code-examples/add-beats-variables.py.txt
@@ -5,13 +5,12 @@ from earsketch import *
setTempo(100)
# Musique
-# Clips de sons
synth1 = HIPHOP_SYNTHPLUCKLEAD_005
synth2 = HIPHOP_SOLOMOOGLEAD_001
drums = HIPHOP_TRAPHOP_BEAT_008
# fitMedia() ajoute les clips synth1 et synth2 en alternance sur la piste 1.
-fitMedia(synth1, 1, 1, 2)
+fitMedia(synth1, 1, 1, 1, 2)
fitMedia(synth2, 1, 2, 3)
fitMedia(synth1, 1, 3, 4)
fitMedia(synth2, 1, 4, 5)
diff --git a/src/locales/fr/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/fr/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
index 9341a9560..e3dc03dc5 100644
--- a/src/locales/fr/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
+++ b/src/locales/fr/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -1,4 +1,5 @@
# Total Atlanta Song of Summer : création d'une chanson complète avec des abstractions
+# structure of the song: intro-A-B-A-B
from earsketch import *
setTempo(110)
diff --git a/src/locales/fr/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/fr/v2/code-examples/custom-functions-untitled1.js.txt
index 1e24e87ee..e29349197 100644
--- a/src/locales/fr/v2/code-examples/custom-functions-untitled1.js.txt
+++ b/src/locales/fr/v2/code-examples/custom-functions-untitled1.js.txt
@@ -4,5 +4,4 @@ function sectionA() {
fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // percussions
fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // ligne de basse
setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // augmentation du volume de la ligne de basse
- // Cette portion de code est indentée. Lorsque vous écrivez le reste de votre script, assurez-vous d'arrêter l'indentation.
-}
+}
\ No newline at end of file
diff --git a/src/locales/fr/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/fr/v2/code-examples/data-structures-iterating-through-arrays.js.txt
index 2399978ab..97a66693f 100644
--- a/src/locales/fr/v2/code-examples/data-structures-iterating-through-arrays.js.txt
+++ b/src/locales/fr/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -8,6 +8,7 @@ setTempo(130);
// Création d'un tableau de clips
var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+// Going through the array
for (var track = 1; track < 4; track++) {
var index = track - 1;
fitMedia(myEnsemble[index], track, 1, 5);
diff --git a/src/locales/fr/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/fr/v2/code-examples/data-structures-making-a-drum-set.js.txt
index 25573885c..513bb8b21 100644
--- a/src/locales/fr/v2/code-examples/data-structures-making-a-drum-set.js.txt
+++ b/src/locales/fr/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -1,7 +1,7 @@
// Création d'un enchaînement de rythmes percussifs : Utilisation de tableaux avec la fonction makeBeat()
// Paramétrage
-setTempo(100);
+setTempo(120);
// Musique
// Avant, nous avions une piste pour chaque son (mesure 1):
diff --git a/src/locales/fr/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/fr/v2/code-examples/data-structures-string-and-lists-operations.js.txt
index 1492689ad..a509430fd 100644
--- a/src/locales/fr/v2/code-examples/data-structures-string-and-lists-operations.js.txt
+++ b/src/locales/fr/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -1,4 +1,5 @@
-// Opérations de chaînes de caractères et de tableaux : Ce qui peut être réalisé avec des tableaux et des chaînes de caractères
+// String and Lists Operations: Showing what we can do with arrays and strings
+
// Paramétrage
setTempo(120);
diff --git a/src/locales/fr/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/fr/v2/code-examples/effects-and-envelopes-envelopes.js.txt
index ec4815313..a802f2cda 100644
--- a/src/locales/fr/v2/code-examples/effects-and-envelopes-envelopes.js.txt
+++ b/src/locales/fr/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -8,6 +8,4 @@ fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
// Établissement d'une rampe d'effet entre les mesures 1 et 3, allant de -60 dB à 0 dB.
# Ceci est un fondu d'ouverture
-setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
-
-#Fin:
\ No newline at end of file
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/fr/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/fr/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
index 2a3336124..aedaadb7d 100644
--- a/src/locales/fr/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
+++ b/src/locales/fr/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -1,7 +1,7 @@
// Fondus d'ouverture et de fermeture : Ajout de boucle sur toutes les pistes pour ajouter un fondu d'ouverture et un fondu de fermeture
// Paramétrage
-setTempo(100);
+setTempo(120);
// Variables
var melody1 = MILKNSIZZ_ADIOS_BRASS;
diff --git a/src/locales/fr/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/fr/v2/code-examples/get-user-input-return-statements.js.txt
index 86de5ba40..35529719d 100644
--- a/src/locales/fr/v2/code-examples/get-user-input-return-statements.js.txt
+++ b/src/locales/fr/v2/code-examples/get-user-input-return-statements.js.txt
@@ -1,7 +1,7 @@
// Instructions de retour : Liaison de deux rythmes à l'aide d'instructions de retour
// Paramétrage
-setTempo(100);
+setTempo(120);
var rhythm1 = "0+++0+0+0+--0+00";
var rhythm2 = "0+0-00++0-000+++";
@@ -20,5 +20,6 @@ function createBeat(startMeasure, soundClip, beatString) {
// Appels de fonction
// Affectation de la valeur retournée à une valeur
var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
// Passage de la valeur retournée dans une autre fonction
createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/fr/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/fr/v2/code-examples/get-user-input-return-statements.py.txt
index 4f922b859..821757cb9 100644
--- a/src/locales/fr/v2/code-examples/get-user-input-return-statements.py.txt
+++ b/src/locales/fr/v2/code-examples/get-user-input-return-statements.py.txt
@@ -19,5 +19,6 @@ def createBeat(startMeasure, soundClip, beatString):
# Appels de fonction
# Affectation de la valeur retournée à une variable
newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
# Passage de la valeur retournée dans une autre fonction
createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/fr/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/fr/v2/code-examples/getting-started-using-fitmedia-2.js.txt
index 8830141f6..7ac669bf9 100644
--- a/src/locales/fr/v2/code-examples/getting-started-using-fitmedia-2.js.txt
+++ b/src/locales/fr/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -1,7 +1,7 @@
// Utilisation de la fonction fitMedia() 2 : Plusieurs appels de fonction fitMedia() sur différentes pistes
// Paramétrage
-setTempo(100);
+setTempo(120);
// Musique
fitMedia(Y01_DRUMS_1, 1, 1, 9);
diff --git a/src/locales/fr/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/fr/v2/code-examples/loops-and-layers-loops.js.txt
index 48505e1c8..258eb02e3 100644
--- a/src/locales/fr/v2/code-examples/loops-and-layers-loops.js.txt
+++ b/src/locales/fr/v2/code-examples/loops-and-layers-loops.js.txt
@@ -8,7 +8,6 @@ var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
// Utilisation d'une boucle au lieu de répéter des lignes similaires dans le code
-
for (var measure = 1; measure < 9; measure = measure + 1) {
fitMedia(drums1, 1, measure, measure + 0.5);
fitMedia(drums2, 1, measure + 0.5, measure + 1);
diff --git a/src/locales/fr/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/fr/v2/code-examples/loops-and-layers-loops.py.txt
index d3f4bb906..0d601af29 100644
--- a/src/locales/fr/v2/code-examples/loops-and-layers-loops.py.txt
+++ b/src/locales/fr/v2/code-examples/loops-and-layers-loops.py.txt
@@ -9,7 +9,6 @@ drums1 = ELECTRO_DRUM_MAIN_BEAT_008
drums2 = ELECTRO_DRUM_MAIN_BEAT_007
# Utilisation d'une boucle au lieu de répéter des lignes similaires dans le code
-
for measure in range(1, 9):
fitMedia(drums1, 1, measure, measure + 0.5)
fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/fr/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/fr/v2/code-examples/loops-and-layers-no-loops.py.txt
index 35cb07f82..b5a2b7684 100644
--- a/src/locales/fr/v2/code-examples/loops-and-layers-no-loops.py.txt
+++ b/src/locales/fr/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -9,7 +9,6 @@ drums1 = ELECTRO_DRUM_MAIN_BEAT_008
drums2 = ELECTRO_DRUM_MAIN_BEAT_007
# Tous ces appels de fonction fitMedia() peuvent être remplacés par deux appels placés dans une boucle.
-
fitMedia(drums1, 1, 1, 1.5)
fitMedia(drums2, 1, 1.5, 2)
fitMedia(drums1, 1, 2, 2.5)
diff --git a/src/locales/fr/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/fr/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
index f2516ec67..a51fa844e 100644
--- a/src/locales/fr/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
+++ b/src/locales/fr/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -1,4 +1,5 @@
# AnalyzeTrack() : Utilisation de la fonction analyzeTrack() pour afficher l'intensité sonore d'une piste
+
# Paramétrage
from earsketch import *
setTempo(120)
diff --git a/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
index ebef4c9b5..ab55a2fd7 100644
--- a/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
+++ b/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -6,12 +6,12 @@ setTempo(120);
// Création de deux pistes
var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
var melody2 = RD_UK_HOUSE__5THCHORD_1;
-fitMedia(melody1, 1, 1, 9);
-fitMedia(melody2, 2, 1, 9);
+fitMedia(melody1,1,1,9);
+fitMedia(melody2,2,1,9);
// Évaluation de l'intensité sonore des pistes
-var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
-var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+var loudnessTrack1 = analyzeTrack(1,RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2,RMS_AMPLITUDE);
// Si la piste 1 est plus forte que la piste 2, nous réduirons le volume
if (loudnessTrack1 > loudnessTrack2) {
diff --git a/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
index c0a2d3bfa..535980d88 100644
--- a/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
+++ b/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -1,6 +1,6 @@
// Mélange automatique 2 : Utilisation d'instructions conditionnelles pour mixer les pistes
-// Setup
+// Paramétrage
setTempo(120);
// Adding a melody and bass
@@ -9,7 +9,7 @@ var melody2 = YG_ALT_POP_GUITAR_1;
var bass1 = YG_ALT_POP_BASS_1;
var bass2 = DUBSTEP_SUBBASS_008;
var strings = YG_HIP_HOP_STRINGS_4;
-fitMedia(melody1, 1, 1, 9);
+fitMedia(melody1,1,1,9);
fitMedia(melody2, 1, 9, 17);
fitMedia(bass1, 2, 1, 9);
fitMedia(bass2, 2, 9, 17);
@@ -27,9 +27,9 @@ for (var measure = 5; measure > 17; measure++) {
// Mixing my tracks
// First, we analyze the tracks for loudness
-var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack1 = analyzeTrack(1,RMS_AMPLITUDE);
println("The loudness of track 1 is" + loudnessTrack1);
-var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2,RMS_AMPLITUDE);
println("The loudness of track 2 is" + loudnessTrack2);
var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
println("The loudness of track 3 is" + loudnessTrack3);
diff --git a/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
index 81c694b40..5b84fb3f4 100644
--- a/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
+++ b/src/locales/fr/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -1,6 +1,6 @@
# Mélange automatique 2 : Utilisation d'instructions conditionnelles pour mixer les pistes
-# Setup
+# Paramétrage
from earsketch import *
setTempo(120)
diff --git a/src/locales/fr/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/fr/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
index 6786315ae..b52a3c4f6 100644
--- a/src/locales/fr/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
+++ b/src/locales/fr/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -20,7 +20,7 @@ println(comparison1);
// Création d'une boucle for pour comparer l'intensité sonore de chaque piste à la valeur 0.5
for (var track = 1; track < 3; track++) {
- var loudness = analyzeTrack(track,RMS_AMPLITUDE);
- println ('Est-ce que l'intensité sonore de la piste ' + track + ' est plus élevée que 0.01 ?');
- println (loudness > 0.01);
+ var loudness = analyzeTrack(track,RMS_AMPLITUDE);
+ println ('Est-ce que l'intensité sonore de la piste ' + track + ' est plus élevée que 0.01 ?');
+ println (loudness > 0.01);
}
\ No newline at end of file
diff --git a/src/locales/fr/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/fr/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
index 343a3bdbe..05de0ef98 100644
--- a/src/locales/fr/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
+++ b/src/locales/fr/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -1,3 +1,4 @@
if (condition){
// Ici, vous devez écrire les instructions que l'ordinateur doit exécuter si la condition est true (vraie)
- // Notez que les instructions sont indentées, comme pour les boucles
\ No newline at end of file
+ // Notez que les instructions sont indentées, comme pour les boucles
+}
\ No newline at end of file
diff --git a/src/locales/fr/v2/custom-functions.adoc b/src/locales/fr/v2/custom-functions.adoc
index c11b6e6c3..acd34ad9b 100644
--- a/src/locales/fr/v2/custom-functions.adoc
+++ b/src/locales/fr/v2/custom-functions.adoc
@@ -1,11 +1,13 @@
[[customfunctionssongstructure]]
== Custom Functions, Song Structure
+
:nofooter:
-The song structure is the song's organization over time: how to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own functions: custom functions, to structure your songs!
+The song structure is the song's organization over time: how to create meaningful sections and transitions for the flow of your music. C'est très courant en musique de danse électronique ou dance (EDM) et crée l'anticipation d'une perte de niveau sonore. In this chapter, you'll create your own functions: custom functions, to structure your songs!
[[asongsstructure]]
=== La structure d'une chanson
+
:nofooter:
Une chanson peut être divisée en *parties ou « sections »*. Une section est composée de plusieurs mesures (unités de temps musicales), elle exprime une idée ou un sentiment. Habituellement, les musiciens essaient d'ajouter un certain contraste entre les différentes sections. Les intros, les couplets, les refrains et les outros sont des exemples de sections de morceaux.
@@ -23,13 +25,14 @@ image::../media/U2/sections_052016.png[Alt Text]
include::code-examples/custom-functions-a-b-a-form.py.txt[]
----
-
[role="curriculum-javascript"]
[source,javascript]
----
include::code-examples/custom-functions-a-b-a-form.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
Sélectionnez d'abord une chanson que vous aimez. Écoutez-la et tentez de repérer les différentes sections. Pouvez-vous distinguer le moment où les musiciens changent de partie ? Combien de refrains ou de couplets pouvez-vous entendre ? Quels types de contrastes observez-vous ? Partagez votre chanson avec votre voisin.e.
@@ -40,9 +43,9 @@ Gardez à l'esprit qu'une phrase musicale semble plus naturelle lorsque les clip
[[creatingyourcustomfunctions]]
=== Create your custom functions
-Dans l'exemple précédent avec la chanson de forme ABA, le code est long et se répète pour la deuxième partie A. Cependant, il y a un moyen d'être plus efficace, grâce aux *fonctions personnalisées* ! Nous allons définir une fonction qui représentera la partie A, puis nous l'appelerons à deux reprises.
+Dans l'exemple précédent avec la chanson de forme ABA, le code est long et se répète pour la deuxième partie A. Cependant, il y a un moyen d'être plus efficace, grâce aux *fonctions personnalisées* ! There is a way to be more concise, thanks to *custom functions*! Nous allons définir une fonction qui représentera la partie A, puis nous l'appelerons à deux reprises.
-La différence avec les fonctions que vous avez précédemment utilisées comme `fitMedia()` est que vous devrez définir votre fonction personnalisée, tandis que la fonction `fitMedia()` est déjà prédéfinie. Voici comment vous définirez la partie A :
+La différence avec les fonctions que vous avez précédemment utilisées comme `fitMedia()` est que vous devrez définir votre fonction personnalisée, tandis que la fonction `fitMedia()` est déjà prédéfinie. In a custom function, you get to define exactly what it does. Voici comment vous définirez la partie A :
[role="curriculum-python"]
[source,python]
@@ -56,13 +59,13 @@ include::code-examples/custom-functions-untitled1.py.txt[]
include::code-examples/custom-functions-untitled1.js.txt[]
----
-. Ici, nous avons choisi sectionA() comme nom pour notre fonction, mais vous pouvez choisir le nom que vous souhaitez. Essayez de nommer votre fonction de manière descriptive afin que votre code soit plus facile à lire.
+. Ici, nous avons choisi sectionA() comme nom pour notre fonction, mais vous pouvez choisir le nom que vous souhaitez. You can choose any name you like. Essayez de nommer votre fonction de manière descriptive afin que votre code soit plus facile à lire.
. Les instructions correspondent au *corps* de la fonction. Elles sont indentées.
.ENTRAÎNEZ-VOUS
****
-Collez ce code dans un nouveau script et exécutez-le. Vous remarquerez que votre DAW n'affiche rien.
-C'est parce que vous devez *appeler* une fonction pour l'utiliser.
+Collez ce code dans un nouveau script et exécutez-le. Vous remarquerez que votre DAW n'affiche rien.
+C'est parce que vous devez *appeler* une fonction pour l'utiliser.
Pour appeler votre fonction, ajoutez la ligne `sectionA()` non indentée après la définition de votre fonction. Lorsque vous exécuterez le code, vous devriez voir la partie A dans votre DAW.
****
@@ -70,12 +73,13 @@ Nous voulons maintenant ajouter la partie A de la mesure 9 à 13. Cependant, lor
.ENTRAÎNEZ-VOUS
****
-In your current script,
-1. ajoutez les paramètres `startMeasure` et `endMeasure` séparés par une virgule entre les parenthèses de la fonction sectionA() dans sa définition. (`sectionA(startMeasure,endMeasure)`).
-2. Dans le corps de la fonction, remplacez les mesures de début (1) et de fin (5) par `startMeasure` et `endMeasure` respectivement.
-3. Lorsque vous appelez votre fonction, ajoutez les paramètres `1` et `5` entre les parenthèses. Exécutez le code pour vous assurer qu'il n'y a aucune erreur.
-4. Ajoutez un deuxième appel de fonction, mais cette fois-ci, avec les paramètres `9` et `13`. Exécutez le code pour vous assurer qu'il n'y a aucune erreur.
-5. Définissez une fonction pour la partie B, en suivant le même processus, et appelez la partie B des mesures 5 à 9 et des mesures 13 à 17.
+In your current script you created for the previous practice problem:
+
+1. ajoutez les paramètres `startMeasure` et `endMeasure` séparés par une virgule entre les parenthèses de la fonction sectionA() dans sa définition.
+1. Dans le corps de la fonction, remplacez les mesures de début (1) et de fin (5) par `startMeasure` et `endMeasure` respectivement.
+1. Lorsque vous appelez votre fonction, ajoutez les paramètres `1` et `5` entre les parenthèses. Exécutez le code pour vous assurer qu'il n'y a aucune erreur.
+1. Ajoutez un deuxième appel de fonction, mais cette fois-ci, avec les paramètres `9` et `13`. Exécutez le code pour vous assurer qu'il n'y a aucune erreur.
+1. Définissez une fonction pour la partie B, en suivant le même processus, et appelez la partie B des mesures 5 à 9 et des mesures 13 à 17.
****
Voici à quoi devrait ressembler votre code :
@@ -92,10 +96,8 @@ include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
----
-
//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
-
[role="curriculum-python curriculum-mp4"]
[[video93py]]
video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
@@ -104,29 +106,29 @@ video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
[[video93js]]
video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
-
[[transitionstrategies]]
=== Stratégies de transition
-Maintenant que vous savez comment créer des fonctions personnalisées pour structurer votre chanson, nous allons examiner la notion de transitions. Les *transitions* aident à passer en douceur d'une partie à l'autre. Celles-ci permettent de relier les versets et le refrain, de faire une montée jusqu'à un drop, de mixer des pistes (DJing) ou de faire un changement de tonalité. Le but d'une transition est d'attirer l'attention de l'auditeur et de leur faire savoir qu'un changement est sur le point de se produire.
+Maintenant que vous savez comment créer des fonctions personnalisées pour structurer votre chanson, nous allons examiner la notion de transitions. *Transitions* help one section smoothly go into the next. Celles-ci permettent de relier les versets et le refrain, de faire une montée jusqu'à un drop, de mixer des pistes (DJing) ou de faire un changement de tonalité. Le but d'une transition est d'attirer l'attention de l'auditeur et de leur faire savoir qu'un changement est sur le point de se produire.
Voici quelques stratégies populaires pour créer des transitions musicales :
-. *Cymbale à main ou « Crash Cymbal »* : placement d'une cymbale à main sur le premier beat ou rythme d'une nouvelle partie. Voyez l'exemple https://www.youtube.com/watch?v=RssWT0Wem2w&t=0m55s[suivant^].
-. *Roulement de batterie ou « Drum Fill »* : une variation rythmique pour combler le vide avant une nouvelle partie. Voyez ces https://www.youtube.com/watch?v=YMskGG39Y0Y[exemples^] de remplissage de batterie.
-. *Pistes en sourdine ou «Track Dropouts »* : Ajouts de drops de manière temporaire dans les pistes (une piste devient muette) pour créer des pauses. Écoutez https://www.youtube.com/watch?v=PxIgHSOLO_Q[Love de Imagine Dragons], à 1'16 par exemple.
-. *Variation de mélodie* : Introduction d'une variation des accords, de la ligne de basse ou de la mélodie avant la nouvelle partie. Il arrive souvent qu'un dossier dans la bibliothèque de sons EarSketch contienne des variations similaires.
-. *Riser* (lire "raïseur") : Une note ou un bruit qui augmente en hauteur. C'est très courant en musique de danse électronique ou dance (EDM) et crée l'anticipation d'une perte de niveau sonore. Vous pouvez utiliser le terme de recherche « riser » dans le navigateur de sons. Une cymbale à main inversée peut être utilisée comme riser, comme YG_EDM_REVERSE_CRASH_1. Voici un exemple de riser dans https://www.youtube.com/watch?v=1KGsAozrCnA&t=31m30s[un set techno de Carl Cox^].
-. *Roulement de caisse claire ou « Snare Roll »* : Une séquence de coups de caisse claire répétés, avec une densité, hauteur ou amplitude croissante. Vous pouvez utiliser un clip comme RD_FUTURE_DUBSTEP_FILL_1 ou HOUSE_BREAK_FILL_003, ou `makeBeat()`. Voyez ici un https://www.youtube.com/watch?v=c3HLuTAsbFE[exemple^].
-. *Boucle ou « Looping »* : Répétition d'un court segment de mélodie avant une nouvelle partie. Voyez ici un https://www.youtube.com/watch?v=AQg4wnbBjiQ[exemple^] de boucle en DJing.
-. *Fondu enchaîné ou « Crossfading »* : Diminution du volume d'une partie en augmentant le volume de la partie suivante.
+. *Cymbale à main ou « Crash Cymbal »* : placement d'une cymbale à main sur le premier beat ou rythme d'une nouvelle partie.
+. *Roulement de batterie ou « Drum Fill »* : une variation rythmique pour combler le vide avant une nouvelle partie.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Variation de mélodie* : Introduction d'une variation des accords, de la ligne de basse ou de la mélodie avant la nouvelle partie. Il arrive souvent qu'un dossier dans la bibliothèque de sons EarSketch contienne des variations similaires.
+. *Riser* (lire "raïseur") : Une note ou un bruit qui augmente en hauteur. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. Vous pouvez utiliser le terme de recherche « riser » dans le navigateur de sons. Une cymbale à main inversée peut être utilisée comme riser, comme YG_EDM_REVERSE_CRASH_1.
+. *Roulement de caisse claire ou « Snare Roll »* : Une séquence de coups de caisse claire répétés, avec une densité, hauteur ou amplitude croissante. Vous pouvez utiliser un clip comme RD_FUTURE_DUBSTEP_FILL_1 ou HOUSE_BREAK_FILL_003, ou `makeBeat()`.
+. *Boucle ou « Looping »* : Répétition d'un court segment de mélodie avant une nouvelle partie.
+. *Fondu enchaîné ou « Crossfading »* : Diminution du volume d'une partie en augmentant le volume de la partie suivante.
. *Anacrouse ou « Anacrusis »* : Lorsque la mélodie de la nouvelle partie commence quelques beats plus tôt.
.ENTRAÎNEZ-VOUS
****
Dans la liste de transitions possibles, sélectionnez-en deux et essayez de voir comment vous pouvez les implémenter en utilisant un code. Vous pouvez travailler en équipe. Une fois que vous y avez réfléchi, jetez un coup d'œil aux exemples ci-dessous.
+
+La transition doit être placée 1 ou 2 mesures avant la nouvelle partie. Vous pouvez utiliser plusieurs techniques de transition à la fois.
****
-La transition doit être placée 1 ou 2 mesures avant la nouvelle partie. Vous pouvez utiliser plusieurs techniques de transition à la fois.
Remplissages de batterie :
@@ -170,6 +172,8 @@ include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
----
+{nbsp} +
+
[[yourfullsong]]
=== Votre chanson complète
@@ -180,7 +184,7 @@ En programmation, nous pouvons créer des *abstractions*, soit le fait de regrou
À présent, tentez de créer une chanson complète en utilisant tous les outils que vous avez découverts dans EarSketch ! Retrouvez ci-dessous une suggestion de méthodologie de travail, mais que vous pouvez adapter comme vous le souhaitez :
. Choisissez un thème pour votre chanson. Pensez au type de sons, d'instruments ou de paroles qui véhiculeront au mieux votre message.
-. Then select a simple structure.
+. Sélectionnez ensuite une structure simple.
. Et maintenant, vous pouvez enfin commencer à coder ! Commencez par sélectionner les sons et mettez-les dans des fonctions `fitMedia()`.
. Utilisez `makeBeat()` pour ajouter des percussions.
. Vous pouvez aussi ajouter vos propres sons.
@@ -211,7 +215,6 @@ include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
Dans cet exemple, nous avons utilisé une boucle « for » à l'intérieur d'une fonction personnalisée ! Nous avons utilisé des paramètres de la fonction (`start` et `end`) à l'intérieur de la boucle « for ».
-
[[chapter7summary]]
=== Résumé du chapitre 7
@@ -221,23 +224,24 @@ Dans cet exemple, nous avons utilisé une boucle « for » à l'intérieur d
* Les *fonctions personnalisées* sont des fonctions uniques écrites par le programmeur pour accomplir une tâche spécifique. Vous devez créer une fonction personnalisée pour pouvoir l'appeler. Il est possible de créer autant de paramètres que vous voulez.
* Une *abstraction* est un regroupement d'idées pour former un concept unique, souvent moins complexe. Les fonctions sont un exemple d'abstraction.
-
[[chapter-questions]]
=== Questions
[question]
--
Parmi les propositions suivantes, laquelle N'EST PAS un exemple de section musicale ?
+
[answers]
* Les percussions
* L'intro
-* Le couplet
+* Le refrain
* Le refrain
--
[question]
--
Qu'est-ce qu'une abstraction ?
+
[answers]
* Un regroupement d'idées pour former un concept unique
* Une variété de sons à travers les parties
@@ -249,6 +253,7 @@ Qu'est-ce qu'une abstraction ?
[question]
--
Parmi les options suivantes, laquelle définit correctement la fonction `myFunction()` avec les paramètres `startMeasure` et `endMeasure` ?
+
[answers]
* `def myFunction(startMeasure, endMeasure):`
* `def myFunction():`
@@ -260,6 +265,7 @@ Parmi les options suivantes, laquelle définit correctement la fonction `myFunct
[question]
--
Parmi les options suivantes, laquelle définit correctement la fonction `myFunction()` avec les paramètres `startMeasure` et `endMeasure` ?
+
[answers]
* `function myFunction(startMeasure, endMeasure) {}`
* `function myFunction() {}`
@@ -270,9 +276,10 @@ Parmi les options suivantes, laquelle définit correctement la fonction `myFunct
[question]
--
Parmi les propositions suivantes, laquelle N'EST PAS un exemple de transition ?
+
[answers]
* La cohérence de la mélodie
* La cymbale à main
* Riser
-* Les pistes en sourdine
---
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/fr/v2/data-structures.adoc b/src/locales/fr/v2/data-structures.adoc
index 17c750ae9..2160ab0f8 100644
--- a/src/locales/fr/v2/data-structures.adoc
+++ b/src/locales/fr/v2/data-structures.adoc
@@ -1,5 +1,6 @@
[[getorganizedwithdatastructures]]
-== Comment organiser votre code avec les structures de données
+== Les structures de données
+
:nofooter:
[role="curriculum-python"]
@@ -9,13 +10,13 @@ Vous avez maintenant de nombreux outils à votre disposition pour créer des mor
Vous avez maintenant de nombreux outils à votre disposition pour créer des morceaux dans EarSketch. Il est possible que vos scripts soient très variés et longs. Ce chapitre vous aidera à organiser votre code, en particulier à l'aide d'une abstraction appelée « tableau » et d'une nouvelle fonctionnalité de `makeBeat()`.
[[datastructures]]
-=== Les structures de données
+=== What is a Data Structure
[role="curriculum-python"]
-Si vous avez de très longues listes de variables de sons, il est possible de les organiser efficacement grâce à des *listes*. Une *liste, également appelée tableau dans certains langages de programmation, est une collection de valeurs ou d'*éléments entre crochets (`[]`) et séparés par des virgules. En voici un exemple :
+If you have very long lists of sound variables, it's possible to organize them using *lists*. Une liste, également appelée tableau dans certains langages de programmation, est une collection de valeurs ou d'éléments entre crochets ([]
) et séparés par des virgules. Voici un exemple :
[role="curriculum-javascript"]
-Si vous avez de très longues listes de variables de sons, il est possible de les organiser efficacement grâce à des *tableaux*. Un *tableau, également appelé liste dans certains langages de programmation, est une collection de valeurs ou d'*éléments entre crochets (`[]`) et séparés par des virgules. En voici un exemple :
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Voici un exemple :
[role="curriculum-python"]
[source,python]
@@ -30,15 +31,15 @@ include::code-examples/data-structures-instead-of-writing-this.js.txt[]
----
[role="curriculum-python"]
-Si vous avez remplacé les variables par une liste, comment allez-vous accéder au contenu de la liste ? En fait, nous allons utiliser des index. Chaque élément d'une liste se verra assigner un index, commençant par `0`. Dans l'exemple précédent, `drums[0]` appelle `OS_KICK03`, `drums[1]` appelle `OS_OPENHAT01` et `drums[3]` appelle OS_SNARE05.
+If you have replaced variables with a list, how will you reference the content of the list? En fait, nous utiliserons des index. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
[role="curriculum-javascript"]
-Si vous avez remplacé les variables par un tableau, comment allez-vous accéder au contenu du tableau ? En fait, nous utiliserons des index. Chaque élément d'un tableau se verra assigner un index, commençant par `0`. Dans l'exemple précédent, `drums[0]` appelle `OS_KICK03`, `drums[1]` appelle `OS_OPENHAT01` et `drums[3]` appelle OS_SNARE05.
+If you have replaced variables with an array, how will you reference the content of the array? En fait, nous utiliserons des index. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
.ENTRAÎNEZ-VOUS
****
-Créez un tableau avec trois noms de clips de sons.
-Puis, à l'aide de trois appels de fonction `fitMedia()`, placez les trois clips sur les pistes 1, 2 et 3 ; des mesures 1 à 5.
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
****
Voici un exemple :
@@ -55,21 +56,22 @@ include::code-examples/data-structures-list.py.txt[]
include::code-examples/data-structures-arrays.js.txt[]
----
-[[Graphic]]
//.The EarSketch Share window for collaboration (Let Others Edit)
+
//[caption="Figure 21.4.2: "]
+
image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
[role="curriculum-python"]
-Nous avons vu que `liste[index]` appellera un élément de la liste. Ceci peut également être utilisé pour modifier un élément de la liste. Par exemple, dans l'exemple précédent : `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` assignera `RD_ROCK_POPRHYTHM_MAINDRUMS_11` au premier élément de la liste Ce processus est similaire à la mise à jour d'une variable, il utilise l'opérateur d'affectation `=`.
+We've seen that `list[index]` will reference an element of the list. Ceci peut également être utilisé pour modifier un élément de la liste. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
[role="curriculum-javascript"]
-Nous avons vu que `tableau[index]` appellera un élément du tableau. Ceci peut également être utilisé pour modifier un élément du tableau. Par exemple, dans l'ensemble précédent : l'expression `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` assignera `RD_ROCK_POPRHYTHM_MAINDRUMS_11` au premier élément du tableau. Ce processus est similaire à la mise à jour d'une variable, il utilise l'opérateur d'affectation `=`.
+We've seen that `array[index]` will reference an element of the array. Ceci peut également être utilisé pour modifier un élément du tableau. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
.ENTRAÎNEZ-VOUS
****
-Dans l'exemple précédent, utilisez une boucle « for » pour éviter d'appeler la fonction `fitMedia()` trois fois. Vous pouvez utiliser le numéro de piste comme compteur.
-Le numéro d'index doit commencer à `0`, tandis que votre piste commencera à `1`. À l'intérieur de votre boucle, vous devrez créer une variable `index` égale au nombre de pistes moins un.
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. Vous pouvez utiliser le numéro de piste comme compteur.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
****
Voyez l'exemple ci-dessous. Vous pouvez jeter un coup d'œil dans la console pour voir ce qui s'affichera lorsque vous exécuterez le code.
@@ -87,25 +89,25 @@ include::code-examples/data-structures-iterating-through-arrays.js.txt[]
----
[role="curriculum-python"]
-Conseil utile : la fonction len(), avec le nom de la liste comme paramètre, renvoie le nombre d'éléments de la liste. Donc `list[0]` est le premier élément de `list` et `list[len(list)-1]` est le dernier. Par exemple, si `list = ["Hello","fellow","EarSketchers"]`, `len(list)` renvoie `3`. Les index sont `0`, `1` et `2`. Le dernier index est 3-1 = 2.
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. Le dernier index est 3-1 = 2.
[role="curriculum-javascript"]
-Conseil utile : la propriété `length` (`tableau.length`) renvoie le nombre d'éléments du tableau. Donc `array[0]` est le premier élément de `tableau` et `tableau[tableau.length-1]` est le dernier. Par exemple, si `tableau = ["Hello","fellow","EarSketchers"];`, `tableau.length` renvoie `3`. Les index sont `0`, `1` et `2`. Le dernier index est 3-1 = 2.
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. Le dernier index est 3-1 = 2.
[role="curriculum-python"]
.ENTRAÎNEZ-VOUS
****
-Nous allons créer une introduction par couches dans EarSketch dans laquelle les instruments (pistes) sont ajoutés à la musique un par un au fil du temps. Par exemple, la première piste commencera à la mesure 1, puis la deuxième piste commencera à la mesure 2, etc. Cette technique est couramment utilisé pour une introduction de morceau. Voir la chanson https://www.youtube.com/watch?v=L53gjP-TtGEKanye[« Power » de Kanye West^].
-À l’aide d’une liste et d’une boucle « for », créez une telle introduction de la mesure 1 à 5. Comme dans l'exemple précédent, vous pouvez utiliser `track` comme compteur, et vous devrez créer une variable `index`. De plus, vous pouvez créer une variable `measure`.
-Utilisez la fonction `len()`.
+Nous allons créer une introduction par couches dans EarSketch dans laquelle les instruments (pistes) sont ajoutés à la musique un par un au fil du temps. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
****
[role="curriculum-javascript"]
.ENTRAÎNEZ-VOUS
****
-Nous allons créer une introduction additive dans EarSketch dans laquelle les instruments (pistes) sont ajoutés à la musique un par un au fil du temps. Par exemple, la première piste commencera à la mesure 1, puis la deuxième piste commencera à la mesure 2, etc. Ceci est couramment utilisé pour une introduction de chanson. Voir la chanson https://www.youtube.com/watch?v=L53gjP-TtGEKanye[« Power » de Kanye West^].
-À l’aide d’un tableau et d’une boucle « for », créez une telle introduction de la mesure 1 à 5. Comme dans l'exemple précédent, vous pouvez utiliser `track` comme compteur, et vous devrez créer une variable `index`. De plus, vous pouvez créer une variable `measure`.
-Utilisez la propriété `length`.
+Nous allons créer une introduction par couches dans EarSketch dans laquelle les instruments (pistes) sont ajoutés à la musique un par un au fil du temps. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
****
Voici un exemple :
@@ -122,50 +124,26 @@ include::code-examples/data-structures-additive-introduction.py.txt[]
include::code-examples/data-structures-additive-introduction.js.txt[]
----
+{nbsp} +
+
[[usingdatastructureswithmakebeat]]
-=== Utiliser des structures de données avec la fonction `makeBeat()`
+=== Use Data Structures with `makeBeat()`
[role="curriculum-python"]
-Nous allons voir deux façons d'utiliser les structures de données avec la fonction `makeBeat()`. Tout d'abord, voyons à quel point les chaînes de caractères et les listes sont similaires :
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
[role="curriculum-javascript"]
-Nous allons voir deux façons d'utiliser les structures de données avec la fonction `makeBeat()`. Tout d'abord, voyons à quel point les chaînes de caractères et les tableaux sont similaires :
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
[role="curriculum-python"]
-1. Tout comme les listes, les chaînes de caractères ont des index. Un *index* représente la position d'un caractère particulier dans une chaîne de caractère commençant par 0. Par exemple, `"Sarah"[3]` renvoie `a`.
-2. Vous pouvez utiliser la fonction `len()` avec des chaînes de caractères, ce qui renvoie le nombre de caractères dans la chaîne de caractères. Le dernier caractère est à l'index `len(string)-1`.
-Les index de la chaîne de caractères `"EarSketch"` sont affichés dans le tableau ci-dessous.
-
-
-[cols="h,^,^,^,^,^,^,^,^,^"]
-|===
-|Caractère
-|E
-|a
-|r
-|S
-|k
-|e
-|t
-|c
-|h
-
-|Index
-|0
-|1
-|2
-|3
-|4
-|5
-|6
-|7
-|8
-|===
+* Tout comme les listes, les chaînes de caractères ont des index. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
[role="curriculum-javascript"]
-1. Tout comme les tableaux, les chaînes de caractères ont des index. Un *index* représente la position d'un caractère particulier dans une chaîne de caractère commençant par 0. Par exemple, `"Sarah"[3]` renvoie `a`.
-2. Vous pouvez utiliser la propriété `.length` avec des chaînes de caractères, ce qui renvoie le nombre de caractères dans la chaîne de caractères. Le dernier caractère est à l'index `string.length-1`.
-Les index de la chaîne `"EarSketch"` sont affichés dans le tableau ci-dessous.
+* Tout comme les tableaux, les chaînes de caractères ont des index. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
[cols="h,^,^,^,^,^,^,^,^,^"]
|===
@@ -192,32 +170,30 @@ Les index de la chaîne `"EarSketch"` sont affichés dans le tableau ci-dessous.
|8
|===
-
-
[role="curriculum-python"]
-3. Vous pouvez concaténer des listes comme vous le faites avec des chaînes de caractères. Utilisez l'opérateur de concaténation (`+`) et la syntaxe sera `newList = listA + listB`.
+* Vous pouvez concaténer des listes comme vous le faites avec des chaînes de caractères. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
[role="curriculum-javascript"]
-3. Vous pouvez concaténer des tableaux comme vous le faites avec des chaînes de caractères. Nous utiliserons la *méthode* `concat`. En fait, une méthode est similaire à une fonction, car elle possède des parenthèses qui contiennent des paramètres. Pour l'utiliser, vous devez la placer après le nom de votre tableau avec un point : la syntaxe est `newArray = arrayA.concat(arrayB)`. C'est ce qu'on appelle la *notation par points*.
+* Vous pouvez concaténer des tableaux comme vous le faites avec des chaînes de caractères. We use the `concat` *method*. En fait, une méthode est similaire à une fonction, car elle possède des parenthèses qui contiennent des paramètres. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
[role="curriculum-python"]
-4. Vous pouvez obtenir une *sous-chaîne*, également connue sous le nom de tranche d'une chaîne de caractères plus grande. Cela permet de découper un beat, une technique populaire dans la musique électronique et le remixage. Sa syntaxe est `newString = oldString[startIndex: endIndex]`. La sous-chaîne inclut le caractère à `startIndex`, mais pas le caractère à `endIndex`. Par exemple, `"Sarah"[1:4]` renverra `"ara"`. Vous pouvez faire la même chose avec des listes : `newList = oldList[startIndex: endIndex]`.
+* You can get a *substring*, also known as a slice, of a larger string. Cela permet de découper un beat, une technique populaire dans la musique électronique et le remixage. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
[role="curriculum-javascript"]
-4. Vous pouvez obtenir une *sous-chaîne*, également connue sous le nom de tranche d'une chaîne de caractères plus grande. Cela permet de découper un beat, une technique populaire dans la musique électronique et le remixage. Sa syntaxe est `newString = oldString.substring(startIndex, endIndex)`. La sous-chaîne inclut le caractère à `startIndex`, mais pas le caractère à `endIndex`. Par exemple, `"Sarah.substring(1,4)"` renverra `"ara"`. Vous pouvez faire la même chose avec des tableaux, en utilisant la méthode `slice()` : `newList = oldList.slice(startIndex, endIndex)`. Notez que `concat()`, `substring()` et `slice()` sont des méthodes et utilisent toutes la notation par points.
+* You can get a *substring*, also known as a slice, of a larger string. Cela permet de découper un beat, une technique populaire dans la musique électronique et le remixage. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
[role="curriculum-python"]
.ENTRAÎNEZ-VOUS
****
Dans un nouveau script :
-. Créez quatre variables : deux chaînes de caractères (`stringA` et `stringB`) et deux listes de clips de sons (`soundsA` et `soundsB`).
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
. Affichez le deuxième caractère de chaque chaîne de caractères.
. Affichez le dernier élément de vos listes.
-. Créez et affichez `stringC`, la concaténation de `stringA` et `stringB`.
-. Créez et affichez `soundsC`, la concaténation de vos `soundsA`, `soundsB` puis `soundsA`.
-. Créez et affichez `stringD`, la tranche de `stringC` comprenant du deuxième caractère au cinquième caractère.
-. Créez et affichez `soundsD`, la tranche de `stringC` comprenant du troisième caractère aux dernier élément.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
****
[role="curriculum-javascript"]
@@ -225,16 +201,16 @@ Dans un nouveau script :
****
Dans un nouveau script :
-. Créez quatre variables : deux chaînes de caractères (`stringA` et `stringB`) et deux tableaux de clips de sons (`soundsA` et `soundsB`).
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
. Affichez le deuxième caractère de chaque chaîne de caractères.
. Affichez le dernier élément de vos tableaux.
-. Créez et affichez `stringC`, la concaténation de `stringA` et `stringB`.
-. Créez et affichez `soundsC`, la concaténation de vos `soundsA`, `soundsB` puis `soundsA`.
-. Créez et affichez `stringD`, la tranche de `stringC` comprenant du deuxième caractère au cinquième caractère.
-. Créez et affichez `soundsD`, la tranche de `stringC` comprenant le troisième caractère jusqu'aux derniers éléments.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
****
-Voici un exemple de solution :
+Here is an example of a solution:
[role="curriculum-python"]
[source,python]
@@ -248,7 +224,7 @@ include::code-examples/data-structures-string-and-lists-operations.py.txt[]
include::code-examples/data-structures-string-and-lists-operations.js.txt[]
----
-Voyez ci-dessous un exemple de la façon dont vous pouvez utiliser les opérations de chaîne de caractères avec la fonction `makeBeat()` :
+This is an example of how you can use string operations with `makeBeat()`:
[role="curriculum-python curriculum-mp4"]
[[video13py]]
@@ -271,10 +247,10 @@ include::code-examples/data-structures-string-operations.js.txt[]
----
[role="curriculum-python"]
-Enfin, `makeBeat()` vous permet de gérer plusieurs clips de sons à la fois. Cela vous permet de placer tous les sons percussifs sur une seule piste à l'aide d'une seule ligne `makeBeat()`. Au lieu de mettre votre fichier son comme premier argument, vous utiliserez une liste de fichiers sons. Dans votre chaîne de caractères de beat, au lieu d'utiliser seulement des `0` pour jouer un son, vous pouvez utiliser des chiffres entre `0` et `9`. Ces chiffres renvoient à un index dans votre liste de sons. Examinez l'exemple « avant et après» ci-dessous, avec le rythme « boot cat boot cat ».
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
[role="curriculum-javascript"]
-Enfin, `makeBeat()` vous permet de gérer plusieurs clips de sons à la fois. Cela vous permet de placer tous les sons percussifs sur une seule piste à l'aide d'une seule ligne `makeBeat()`. Au lieu de mettre votre fichier son comme premier argument, vous utiliserez un tableau de fichiers sons. Dans votre chaîne de caractères de beat, au lieu d'utiliser seulement des `0` pour jouer un son, vous pouvez utiliser des chiffres entre `0` et `9`. Ces chiffres renvoient à un index dans votre tableau de sons. Examinez l'exemple « avant et après» ci-dessous, avec le rythme « boot cat boot cat ».
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
[role="curriculum-python"]
[source,python]
@@ -288,9 +264,11 @@ include::code-examples/data-structures-making-a-drum-set.py.txt[]
include::code-examples/data-structures-making-a-drum-set.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
-Copiez l'exemple de code dans le chapitre 3.4 pour les rythmes (beats) par genre. Modifiez le code de manière à avoir juste une ligne de fonction `makeBeat()` pour chaque genre. Parfois, le charleston joue en même temps que la grosse caisse ou la caisse claire ; dans ce cas, vous pouvez avoir une ligne `makeBeat()` juste pour le charleston.
+Copiez l'exemple de code dans le chapitre 3.4 pour les rythmes (beats) par genre. Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
****
Voici la solution :
@@ -307,66 +285,56 @@ include::code-examples/data-structures-examples-of-beats.py.txt[]
include::code-examples/data-structures-examples-of-beats.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
-À l'aide de ce que vous avez appris dans ce chapitre, créez les rythmes de votre choix avec la fonction `makeBeat()`. Vous pouvez vous référer à la vidéo du chapitre 3.4 pour des beats par genre. Rappelez-vous que vous pouvez exécuter votre code, écoutez votre création et la modifier jusqu'à ce que vous en soyez satisfait.e.
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. Vous pouvez vous référer à la vidéo du chapitre 3.4 pour des beats par genre. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
****
+{nbsp} +
+
[[evaluatingcorrectness]]
-=== Évaluer la qualité et la justesse du code
+=== Evaluate Correctness
-Félicitations ! Vous avez maintenant acquis des compétences musicales et de codage qui vous permettent d'être créatif.ve avec EarSketch ! Il y a un dernier point que nous aimerions aborder avec vous : veiller à ce que votre code soit aussi fluide et ordonné que possible. Voici quelques éléments que vous pouvez vérifier :
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Voici quelques éléments que vous pouvez vérifier :
-[role="curriculum-python"]
-* *La concision* implique un code bref qui réalise efficacement son objectif. Voici quelques questions à vous poser qui vous aideront à rendre votre code plus concis :
-** Ai-je copié/collé plusieurs appels de fonctions dans une ligne ? (si c'est le cas, vous pouvez rendre le tout plus concis à l'aide d'une boucle !)
-** Ai-je réutilisé des blocs de code ? (si c'est le cas, mettez-les dans une fonction !)
-** Y a-t-il des constantes de sons ou des expressions mathématiques que j'utilise à plusieurs reprises dans mon code ? (si c'est le cas, affectez-les à des variables ! Le recours à une liste/ un tableau peut également être utile.)
-* *La clarté* se rapporte à la manière dont le code communique sa fonction et l'intention du programmeur. Si vos collègues ne comprennent pas votre code, c'est qu'il manque probablement de clarté. Voici quelques questions à vous poser qui vous aideront à rendre votre code plus clair :
-** Ai-je inscrit tous les commentaires d'introduction dans mon script incluant le titre de mon script, l'auteur et la description ?
-** Les noms de mes variables et fonctions sont-ils descriptifs ? (dans le cas contraire, renommez-les)
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Voici quelques questions à vous poser qui vous aideront à rendre votre code plus concis :
+** Ai-je copié/collé plusieurs appels de fonctions dans une ligne ? If so, simplify with a loop!
+** Ai-je réutilisé des blocs de code ? If so, put them in a function!
+** Y a-t-il des constantes de sons ou des expressions mathématiques que j'utilise à plusieurs reprises dans mon code ? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. Si vos collègues ne comprennent pas votre code, c'est qu'il manque probablement de clarté. Voici quelques questions à vous poser qui vous aideront à rendre votre code plus clair :
+** Les noms de mes variables et fonctions sont-ils descriptifs ? If not, rename them.
** Ai-je utilisé des commentaires pour expliquer chaque bloc de code et toutes les lignes de code pouvant prêter à confusion ?
** Ai-je utilisé des structures informatiques comme des fonctions et des boucles personnalisées pour organiser mon code ?
-** Est-ce que la structure de mon script reflète la structure de ma chanson ? Cela facilite la lecture.
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
-[role="curriculum-javascript"]
-* *La concision* implique un code bref qui réalise efficacement son objectif. Voici quelques questions à vous poser qui vous aideront à rendre votre code plus concis :
-** Ai-je copié/collé plusieurs appels de fonctions dans une ligne ? (si c'est le cas, vous pouvez rendre le tout plus concis à l'aide d'une boucle !)
-** Ai-je réutilisé des blocs de code ? (si c'est le cas, mettez-les dans une fonction !)
-** Y a-t-il des constantes de sons ou des expressions mathématiques que j'utilise à plusieurs reprises dans mon code ? (si c'est le cas, affectez-les à des variables ! Le recours à un tableau peut également être utile.)
-* *La clarté* se rapporte à la manière dont le code communique sa fonction ainsi que l'intention du programmeur. Si vos collègues ne comprennent pas votre code, c'est qu'il manque probablement de clarté. Voici quelques questions à vous poser qui vous aideront à rendre votre code plus clair :
-** Ai-je inscrit tous les commentaires d'introduction dans mon script incluant le titre de mon script, l'auteur et la description ?
-** Les noms de mes variables et fonctions sont-ils descriptifs ? (dans le cas contraire, renommez-les)
-** Ai-je utilisé des commentaires pour expliquer chaque bloc de code et toutes les lignes de code pouvant prêter à confusion ?
-** Ai-je utilisé des structures informatiques comme des fonctions et des boucles personnalisées pour organiser mon code ?
-** Est-ce que la structure de mon script reflète la structure de ma chanson ? Cela facilite la lecture.
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. Lors de la rétroaction :
-Le *feedback par les pairs* est courant en programmation et vous aide à améliorer votre code et votre musique grâce aux commentaires des autres. Les commentaires doivent être *constructifs*, autrement dit, ils doivent permettre à un pair de s'améliorer, plutôt que de le.a rabaisser. Lors de la rétroaction :
-
-* *Soyez spécifique* : Faites référence à des blocs et des lignes de code spécifiques ainsi qu'à des mesures et des pistes de musique spécifiques.
-* *Soyez descriptif* : Expliquez votre raisonnement de manière détaillée ainsi que le processus que vous suivriez pour améliorer le script.
-* *Soyez sensible à la vision et aux objectifs musicaux de votre collègue* : Vos goûts musicaux ne devraient pas être pris en compte lorsque vous évaluez la musique de votre collègue.
-* *Soyez positif* : en plus d'indiquer ce qui a besoin d'être amélioré, signalez les blocs de code et les passages musicaux qui sont réussis.
-* *Ne faites pas de comparaisons* : Traitez le code de vos collègues comme le leur, et non comme une compétition avec votre propre code ou celui d'autes collègues.
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
De même, lorsque vous recevez des commentaires :
-* *Soyez spécifique* : Indiquez les blocs ou les lignes de code ainsi que les pistes ou les mesures de musique qui vous causent problème. Cela permettra à vos collègues de vous fournir des commentaires qui vous seront davantage utiles.
-* *Soyez attentif* : Attendez que votre collègue ait fini de parler avant de répondre. Soyez attentif aux informations que votre collègue vous transmet. Commentez votre code en fonction de ses commentaires. Ceux-ci vous seront utiles lors de la révision de votre code.
-* *Posez des questions* : Posez des questions sur les éléments de logique dont vous n'êtes pas sûr.e, les problèmes, les bogues, la cohérence musicale ou tout élément relatif à la justesse.
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. Cela permettra à vos collègues de vous fournir des commentaires qui vous seront davantage utiles.
+* *Listen* - Wait to respond until your peer has finished speaking. Soyez attentif aux informations que votre collègue vous transmet. Commentez votre code en fonction de ses commentaires. Ceux-ci vous seront utiles lors de la révision de votre code.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
[role="curriculum-python"]
.ENTRAÎNEZ-VOUS
****
Créez une chanson complète et faites-la évaluer par votre voisin.e pour l'améliorer. Voici quelques idées pour vous aider à démarrer :
-* Il est toujours recommandé de penser à un thème pour votre chanson et à une structure avant de commencer. Votre structure peut être aussi simple que la forme ABA.
-* Commencez à sélectionner des sons et à tester des choses. Créez des variables de sons et de chaînes de caractères de beats et utilisez des appels aux fonctions `fitMedia()` et `makeBeat()`. Vous pouvez aussi charger vos propres sons.
-* Lorsque c'est pertinent, créez des boucles « for » et des fonctions personnalisées.
-* Ajoutez quelques effets avec la fonction `setEffect()`. Vous pourriez ajouter, par exemple, un fondu d'ouverture, un fondu de fermeture, un délai, une réverbération, etc.
+* It's always recommended to think about a theme for your song and a structure before getting started. Votre structure peut être aussi simple que la forme ABA.
+* Commencez à sélectionner des sons et à tester des choses. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. Vous pouvez aussi ajouter vos propres sons.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
* Vous pouvez utiliser une instruction conditionnelle pour mixer votre chanson (adapter le volume de chaque piste).
* Vous pouvez demander une entrée d'utilisateur.rice pour modifier quelque chose dans votre chanson.
-* Si nécessaire, placez quelques éléments dans une liste.
+* If necessary, place some elements in a list.
****
[role="curriculum-javascript"]
@@ -374,52 +342,40 @@ Créez une chanson complète et faites-la évaluer par votre voisin.e pour l'am
****
Créez une chanson complète et faites-la évaluer par votre voisin.e pour l'améliorer. Voici quelques idées pour vous aider à démarrer :
-* Il est toujours recommandé de penser à un thème pour votre chanson et à une structure avant de commencer. Votre structure peut être aussi simple que la forme ABA.
-* Commencez à sélectionner des sons et à tester des choses. Créez des variables de sons et de chaînes de caractères de beats et utilisez des appels aux fonctions `fitMedia()` et `makeBeat()`. Vous pouvez aussi charger vos propres sons.
-* Lorsque c'est pertinent, créez des boucles « for » et des fonctions personnalisées.
-* Ajoutez quelques effets avec la fonction `setEffect()`. Vous pourriez ajouter, par exemple, un fondu d'ouverture, un fondu de fermeture, un délai, une réverbération, etc.
+* It's always recommended to think about a theme for your song and a structure before getting started. Votre structure peut être aussi simple que la forme ABA.
+* Commencez à sélectionner des sons et à tester des choses. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. Vous pouvez aussi ajouter vos propres sons.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
* Vous pouvez utiliser une instruction conditionnelle pour mixer votre chanson (adapter le volume de chaque piste).
* Vous pouvez demander une entrée d'utilisateur.rice pour modifier quelque chose dans votre chanson.
-* Si nécessaire, placez quelques éléments dans un tableau.
+* Si nécessaire, placez quelques éléments dans une liste.
****
-[[conclusion]]
-=== Conclusion
-
-Nous sommes ravis que vous ayez pu participer à l'aventure EarSketch ! Nous espérons que vous avez apprécié votre expérience et que vous avez appris beaucoup de choses avec cet outil :) Il y a bien plus à découvrir dans les chapitres facultatifs !
-
-////
-Thank you video
-////
-
-
[[chapter9summary]]
=== Résumé du chapitre 9
[role="curriculum-python"]
-* Une *liste* ou « list » est un ensemble de valeurs combinées en une seule entité, un moyen efficace de stocker des données. Aussi, il est possible de stocker n'importe quel type de données dans une liste.
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Aussi, il est possible de stocker n'importe quel type de données dans une liste.
* Tout comme pour les chaînes de caractère, les éléments d'une liste sont affectés à un index. Les index de liste commencent à 0.
-* Les éléments d'une liste sont accessibles par la notation entre crochets `myList[1]`. Les caractères dans une chaîne peuvent être accédés de la même manière : `myString[1]`.
-* La fonction `len()` renvoie le nombre d'éléments dans une liste ou le nombre de caractères dans une chaîne avec la syntaxe `len(list)`.
-* Les listes peuvent être concaténées et découpées en utilisant les *opérations de liste*, un ensemble d'outils pour modifier une liste.
-* La syntaxe pour créer un sous-ensemble de liste à partir d'une liste existante plus grande est `newList = oldList[startIndex: endIndex]`.
-* Les listes peuvent être combinées en utilisant l'opérateur de concaténation, `+`, comme dans l'exemple : `newList = listA + listB`.
-* `makeBeat()` permet de composer des rythmes à partir de plusieurs clips à la fois à l'aide d'une chaîne de caractères de beat (rythme) qui fait référence à différents index de liste. Aussi, `makeBeat()` peut accéder aux clips dans les index 0 à 9, à condition qu'ils soient stockés dans le même tableau.
-* L'échange de commentaires constructifs avec d'autres personnes est une forme de *feedback par les pairs*. Cela offre la possibilité d’apprendre des autres.
-
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. Cela offre la possibilité d’apprendre des autres.
[role="curriculum-javascript"]
-* Un *tableau* ou « array » est un ensemble de valeurs combinées en une seule entité, un moyen efficace de stocker des données. Aussi, il est possible de stocker n'importe quel type de données dans un tableau.
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
* Tout comme pour les chaînes de caractère, les éléments d'un tableau sont affectés à un index. Les index de tableau commencent à 0.
-* Les éléments d'un tableau sont accessibles par la notation entre crochets `myArray[1]`. Les caractères dans une chaîne peuvent être accédés de la même manière : `myString[1]`.
-* La propriété `length` renvoie le nombre d'éléments dans un tableau ou le nombre de caractères dans une chaîne avec la syntaxe `array.length` ou `string.length`.
-* Les tableaux peuvent être concaténés et découpés en utilisant des *opérations de tableau*, soit un ensemble d'outils pour modifier un tableau.
-* La syntaxe pour découper un tableau à partir d'un tableau existant plus grand est `newArray = oldArray.slice(startIndex, endIndex)`.
-* La syntaxe pour découper une sous-chaîne d'une chaîne de caractères plus grande est `newString = oldString.substring(startIndex, endIndex)`.
-* Les tableaux peuvent être concaténés en utilisant la méthode de concaténation `concat()`, comme dans l'exemple : `newArray = arrayA.concat(arrayB)`.
-* `makeBeat()` permet de composer des rythmes à partir de plusieurs clips à la fois à l'aide d'une chaîne de caractères de beat (rythme) qui fait référence à différents index de tableau. Aussi, `makeBeat()` peut accéder aux clips dans les index 0 à 9, à condition qu'ils soient stockés dans le même tableau.
-* L'échange de commentaires constructifs avec d'autres personnes est une forme de *feedback par les pairs*. Cela offre la possibilité d’apprendre des autres.
-
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. Cela offre la possibilité d’apprendre des autres.
[[chapter-questions]]
=== Questions
@@ -427,6 +383,7 @@ Thank you video
[question]
--
Parmi les opérations suivantes, laquelle est utilisée pour combiner des listes ou des tableaux ?
+
[answers]
* La concaténation
* Le découpage
@@ -438,6 +395,7 @@ Parmi les opérations suivantes, laquelle est utilisée pour combiner des listes
[question]
--
Quel est le numéro d'index du premier élément d'une liste en Python ?
+
[answers]
* `0`
* `1`
@@ -448,18 +406,20 @@ Quel est le numéro d'index du premier élément d'une liste en Python ?
[role="curriculum-python"]
[question]
--
-Qu'est-ce que l'expression `len(myList)` renvoie ?
+What does `len(myList)` return?
+
[answers]
-* Le nombre d'éléments dans `myList`
-* Les types de données de `myList`
-* Les éléments dans `myList`
-* La longueur de `myList`
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
--
[role="curriculum-python"]
[question]
--
-Quelle est la syntaxe pour concaténer deux listes (`listA` et `listB`) ?
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
[answers]
* `listA + listB`
* `listA ++ listB`
@@ -471,17 +431,19 @@ Quelle est la syntaxe pour concaténer deux listes (`listA` et `listB`) ?
[question]
--
Comment pouvez-vous obtenir une liste à partir de oldList sans le premier et le dernier élément ?
+
[answers]
-* `oldList[1:len(oldList)-1]`
+* `oldList[1:len(oldList) - 1]`
* `oldList[1:len(oldList)]`
* `oldList[0:len(oldList)]`
-* `oldList[2:len(oldList-1)]`
+* `oldList[2:len(oldList - 1)]`
--
[role="curriculum-javascript"]
[question]
--
Quel est le numéro d'index du premier élément d'un tableau en Javascript ?
+
[answers]
* `0`
* `1`
@@ -492,18 +454,20 @@ Quel est le numéro d'index du premier élément d'un tableau en Javascript ?
[role="curriculum-javascript"]
[question]
--
-Qu'est-ce que l'expression `myArray.length` renvoie ?
+What does `myArray.length` return?
+
[answers]
-* Le nombre d'éléments dans `myArray`
-* Les types de données de `myArray`
-* Les éléments dans `myArray`
-* La longueur de `myArray`
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
--
[role="curriculum-javascript"]
[question]
--
-Quelle est la syntaxe pour concaténer deux tableaux (`arrayA` and `arrayB`) ?
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
[answers]
* `arrayA.concat(arrayB)`
* `arrayA.concatenate(arrayB)`
@@ -514,10 +478,20 @@ Quelle est la syntaxe pour concaténer deux tableaux (`arrayA` and `arrayB`) ?
[role="curriculum-javascript"]
[question]
--
-Comment pouvez-vous obtenir un tableau à partir de oldArray sans le premier et le dernier élément ?
+How can you get an array from `oldArray` without the first and last elements?
+
[answers]
-* `oldArray.slice(1,oldArray.length-1]`
-* `oldArray.slice(1,oldArray.length)`
-* `oldArray.slice(0,oldArray.length)`
-* `oldArray.slice(2:oldArray.length-1)`
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
--
+
+[[conclusion]]
+=== Conclusion
+
+Nous sommes ravis que vous ayez pu participer à l'aventure EarSketch ! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/fr/v2/effects-and-envelopes.adoc b/src/locales/fr/v2/effects-and-envelopes.adoc
index c134114ae..927414033 100644
--- a/src/locales/fr/v2/effects-and-envelopes.adoc
+++ b/src/locales/fr/v2/effects-and-envelopes.adoc
@@ -1,13 +1,16 @@
[[effectsandenvelopes]]
== Effets et enveloppes
+
:nofooter:
-EarSketch permet au compositeur de modifier des clips audio pour produire des sons nouveaux et uniques. Ceci est réalisé grâce à la fonction `setEffect()`, soit l'objet de ce chapitre.
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
[[effectsinearsketch]]
-=== Utiliser les effets dans EarSketch
+=== Use Effects in EarSketch
+
+:nofooter:
-Les *effets* nous permettent de modifier la qualité des sons. Tout comme ajouter un filtre permet de modifier une photo, ajouter un effet permet de modifier un son. Par exemple, vous pouvez modifier le volume, ajouter un écho ou une réverbération, etc.
+*Effects* allow us to change qualities of sounds. Tout comme ajouter un filtre permet de modifier une photo, ajouter un effet permet de modifier un son. For example, you can change the volume, add some echo or reverb, etc.
[role="curriculum-python curriculum-mp4"]
[[video4py]]
@@ -17,17 +20,17 @@ video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
[[video4js]]
video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
-Nous utiliserons la fonction `setEffect()`, qui nécessite quatre arguments, comme `fitMedia()` :
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
-. *trackNumber* : La piste à laquelle l'effet est ajouté.
-. *Nom de l'effet* : L'effet spécifique qui est utilisé.
-. *Paramètre de l'effet*: Le paramètre pour l'effet.
-. *Valeur de l'effet* : La valeur du paramètre, un nombre dans une plage spécifique. La plage dépend du paramètre de l'effet.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
.ENTRAÎNEZ-VOUS
****
-Écrivez une nouvelle chanson comprenant deux pistes et modifiez le volume de celles-ci en utilisant la fonction `setEffect()`.
-Dans ce cas, le nom de l'effet (2ᵉ argument) est VOLUME et le paramètre de l'effet (3ᵉ argument) est GAIN. La valeur de l'effet (4ᵉ argument) est un nombre de décibels (dB), entre -60 et +12.
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
****
Voyez l'exemple ci-dessous :
@@ -44,30 +47,36 @@ include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
----
-Nous avons vu l'effet `VOLUME`. Voyons maintenant l'effet `DELAY`. Écoutez les deux clips ci-dessous. Un des clips comprend l'effet *delay* appliqué et l'autre non.
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
Aucun effet :
+
++++
audioMedia/reference.mp3
++++
Effet de délai :
+
++++
audioMedia/delay2.mp3
++++
-Dans ce cas, le nom de l'effet (2ᵉ argument) est `DELAY` et le paramètre de l'effet (3ᵉ argument) peut être soit `DELAY_TIME` (le temps avant que l'écho ne « réponde ») ou `DELAY_FEEDBACK` (le niveau ou force de l'écho). La valeur de `DELAY_TIME` est en millisecondes (1000 millisecondes correspond à une seconde) et la valeur de `DELAY_FEEDBACK` est un nombre compris entre -120 et -1.
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
.ENTRAÎNEZ-VOUS
****
-. Read about the delay effect in the list of effects chapter here: <>
+. Read about the delay effect in the list of effects chapter here: <>
. Exécutez ensuite le code ci-dessous et écoutez la musique sans les effets.
-. Puis, décommentez (« décommenter » signifie supprimer la syntaxe du commentaire, `#` ou <0>//0> dans un bloc de code) la première ligne <0>setEffect()0> et observez la différence.
-. Puis, décommentez la deuxième ligne `setEffect()` et écoutez la différence.
-Notez que le délai, soit 500 ms, correspond à la longueur d'un beat. Comme le tempo correspond à 120 battements par minute, il y a un battement tous les 60/120 = 1/2 seconde. 1 seconde correspond à 1000 ms, donc 1/2 seconde correspond à 1000/2 = 500 ms.
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Comme le tempo correspond à 120 battements par minute, il y a un battement tous les 60/120 = 1/2 seconde. 1 seconde correspond à 1000 ms, donc 1/2 seconde correspond à 1000/2 = 500 ms.
Vous pouvez essayer de modifier le délai et d'évaluer si votre musique sonne mieux ou pas.
****
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
@@ -80,25 +89,29 @@ include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
----
+{nbsp} +
+
[[functionsandmoreeffects]]
=== Fonctions et autres effets
-Jusqu'à présent, vous avez utilisé plusieurs fonctions dans EarSketch comme `fitMedia()` ou `setEffect()`. Notez que les noms des fonctions commencent toujours par une lettre minuscule et sont souvent un verbe. Les parenthèses indiquent à l'ordinateur d’*appeler* ou d'*exécuter* la fonction. Les *arguments*, ou paramètres, entre les parenthèses sont séparés par des virgules.
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Notez que les noms des fonctions commencent toujours par une lettre minuscule et sont souvent un verbe. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
[role="curriculum-python"]
-* Les fonctions `setTempo()`, `fitMedia()`, `makeBeat()` et maintenant `setEffect()` nécessitent des arguments. Elles font partie de l'*interface de programmation d'applications* ou *API* de EarSketch. EarSketch, ou l'API EarSketch, ajoute des fonctionnalités musicales à Python. Un autre exemple d'API est l'API de Google Maps : un ensemble d'outils pour intégrer des cartes dans des sites Web ou des applications.
-* Dans un chapitre ultérieur, vous apprendrez également à créer vos propres fonctions personnalisées.
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, ou l'API EarSketch, ajoute des fonctionnalités musicales à Python. Un autre exemple d'API est l'API de Google Maps : un ensemble d'outils pour intégrer des cartes dans des sites Web ou des applications.
+* In a later chapter, you'll also learn how to create your own custom functions.
[role="curriculum-javascript"]
-* Les fonctions `setTempo()`, `fitMedia()`, `makeBeat()` et maintenant `setEffect()` nécessitent des arguments. Elles font partie de l'*interface de programmation d'applications* ou *API* de EarSketch. EarSketch, ou l'API de EarSketch, ajoute des fonctionnalités musicales à JavaScript. Un autre exemple d'API est l'API de Google Maps : un ensemble d'outils pour intégrer des cartes dans des sites Web ou des applications.
-* Dans un chapitre ultérieur, vous apprendrez également à créer vos propres fonctions personnalisées.
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, ou l'API de EarSketch, ajoute des fonctionnalités musicales à JavaScript. Un autre exemple d'API est l'API de Google Maps : un ensemble d'outils pour intégrer des cartes dans des sites Web ou des applications.
+* In a later chapter, you'll also learn how to create your own custom functions.
Chacun des arguments de la fonction peut avoir un type de données spécifique. L'ordre des arguments est également important. Voyez ci-dessous quelques exemples de type de données :
-* *Nombres*. *Les entiers* (ou « int ») sont des nombres entiers comme 0, 5 ou -26. *Les nombres en virgules flottantes* sont des nombres rationnels comme 0.125 ou -21.0. Par exemple, les arguments de la fonction `fitMedia()` « track number », « start measure » et « end measure » sont tous des nombres.
-* *Chaînes de caractères*. Une chaîne de caractères de beat comme `"0000----0000----"` est utilisée comme argument dans la fonction `makeBeat()`.
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
-Maintenant, amusons-nous davantage avec la fonction `setEffect()`. La vidéo suivante montre comment utiliser certains effets :
+Now, let's play more with the `setEffect()` function. La vidéo suivante montre comment utiliser certains effets :
////
VIDEO IS BEEING MADE
@@ -106,52 +119,55 @@ more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNP
("videos revamping" tab)
////
-La *réverbération* (ou « reverb ») est un son qui rebondit sur les murs et revient à vos oreilles. Cela donne un sens de l'espace à votre son. Pensez à la différence entre le fait de parler dans une petite chambre et parler dans une grande église. Plus la pièce est grande, plus les ondes mettent de temps à revenir vers vos oreilles, d'où ce son d'« écho de grande pièce ». L'effet `REVERB` possède des paramètres pour contrôler le temps de réverbération (`REVERB_DECAY`) et le niveau d'effet présent (`MIX`).
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. Cela donne un sens de l'espace à votre son. Pensez à la différence entre le fait de parler dans une petite chambre et parler dans une grande église. Plus la pièce est grande, plus les ondes mettent de temps à revenir vers vos oreilles, d'où ce son d'« écho de grande pièce ». The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
Écoutez les clips ci-dessous pour découvrir le résultat de l'ajout de réverbération à une piste :
Aucun effet :
+
++++
audioMedia/reverbReference.mp3
++++
Effet de réverbération :
+
++++
audioMedia/reverbEffect.mp3
++++
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
-Go to this chapter for a complete list of effects: <>.
-Créez une chanson avec un effet de volume et deux autres effets. N'oubliez pas d'inscrire ce que vous souhaitez faire dans les commentaires et de créer des variables si nécessaire.
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
****
-
-[[effectsandenvelopes]]
+[[effectsandenvelopes2]]
=== Effets et enveloppes
-Vous avez maintenant commencé à utiliser des effets et peut-être que vous souhaiterez modifier un effet au fil du temps ; par exemple, vous voudrez peut-être ajouter un fondu d'ouverture (lorsque le volume devient plus élevé) au début de votre chanson.
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
-Les *enveloppes* nous permettent de définir comment un effet change au fil du temps.
+*Envelopes* allow us to define how an effect changes over time.
-Nous utiliserons deux paires de valeur-temps (value-time). Chaque paire contient une valeur d'effet et une mesure correspondante. Par exemple, (-60, 1, 0, 3) signifie qu'un point est placé à la valeur -60 à la mesure 1 et un autre point est placé à la valeur 0 à la mesure 3. L'enveloppe crée une ligne entre ces points appelée *rampe* :
+We will use two value-time pairs. Chaque paire contient une valeur d'effet et une mesure correspondante. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
[[envelopepoints]]
.Une enveloppe annotée dans EarSketch
-[caption="Figure 5.1: "]
+[caption="Figure 5.3.1: "]
image::../media/U2/NewEnvelope.png[Alt Text]
-Pour modifier une enveloppe, vous avez uniquement besoin de la fonction `setEffect()` avec sept arguments. Les quatre derniers arguments sont les deux paires de valeur-temps.
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
-. Numéro de piste
-. Nom de l'effet
-. Paramètre de l'effet
-. Valeur de départ
-. Mesure de départ
-. Valeur de fin
-. Mesure de fin
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
-Les trois derniers paramètres sur sept sont des *paramètres facultatifs*. S'ils ne sont pas spécifiés, comme c'était le cas lorsque nous avons utilisé `setEffect()` avec seulement quatre paramètres, l'effet doit être appliqué à la piste entière.
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
Voici un exemple de fondu d'ouverture :
@@ -173,14 +189,12 @@ Maintenant, visualisez la vidéo suivante pour voir d'autres exemples d'envelopp
[[video5b]]
video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
-
[role="curriculum-python"]
[source,python]
----
include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
----
-
[role="curriculum-javascript curriculum-mp4"]
video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
@@ -190,14 +204,15 @@ video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
-Créez une nouvelle chanson. Utilisez une boucle « for » pour ajouter une enveloppe à toutes les pistes (par exemple : un fondu d'ouverture et de fermeture pour toutes vos pistes) ou répéter un effet sur la même piste. Il vous est possible d'utiliser n'importe quel effet de votre choix.
+Créez une nouvelle chanson. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. Il vous est possible d'utiliser n'importe quel effet de votre choix.
Faites ensuite écouter votre chanson avec et sans effet à votre voisin.e (pour écouter votre chanson sans effet, veuillez commenter les lignes qui créent l'effet). Votre voisin.e doit deviner quel effet vous avez ajouté.
****
-Voyez l'exemple ci-dessous. Chaque itération de la boucle ajoute un segment (durée du segment : une mesure) de l'enveloppe. L'automatisation du paramètre GAIN crée des fondus de volume rythmique, un effet populaire en musique de dance électronique (EDM) illustré dans la chanson https://www.youtube.com/watch?v=Us_U-d2YN5Y[Rhythm] par Lvly. Essayez d'activer le contournement des effets dans le DAW pour entendre la différence que fait l'ajout d'effet (le bouton « bypass » à gauche de la piste d'effet dans votre DAW).
-
+Below is an example of the above practice. Chaque itération de la boucle ajoute un segment (durée du segment : une mesure) de l'enveloppe. Automating the GAIN parameter creates rhythmic volume fades. Essayez d'activer le contournement des effets dans le DAW pour entendre la différence que fait l'ajout d'effet (le bouton « bypass » à gauche de la piste d'effet dans votre DAW).
[role="curriculum-python"]
[source,python]
@@ -218,28 +233,29 @@ Et voici un exemple de fondus d'ouverture et de fermeture sur toutes les pistes
----
include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
----
+
[role="curriculum-javascript"]
[source,javascript]
----
include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
----
+{nbsp} +
[[chapter5summary]]
=== Résumé du chapitre 5
-* Les *effets* permettent de modifier la qualité d'un son pour le rendre plus unique.
-* Le *volume* est lié à l'intensité sonore. Le *délai ou « Delay »* permet de créer un écho. La *réverbération ou « Reverb »* donne l'impression que le son est produit dans une grande pièce. Le réglage *panoramique ou « panning »* consiste à placer votre musique à gauche ou à droite dans l'espace sonore tout en conservant le volume.
-* Les effets sont créés dans EarSketch à l'aide de la fonction `setEffect()`. La syntaxe à utiliser est `setEffect(Numéro de piste, Nom de l'effet, Paramètre de l'effet, Valeur de l'effet)`.
-** *Numéro de piste* : La piste à laquelle l'effet est ajouté.
-** *Nom de l'effet* : L'effet spécifique qui est utilisé.
-** *Paramètre de l'effet* : Le paramètre utilisé pour l'effet.
-** *Valeur de l'effet* : La valeur du paramètre, un nombre dans une plage spécifique.
-* Les *fonctions* contiennent des instructions que l'ordinateur exécute. Les données sont envoyées aux fonctions par les *arguments*, qui affectent la façon dont la fonction s'exécute. Par exemple, la syntaxe d'un *appel* de fonction à deux arguments est `myFunction(argument1, argument2)` et pour un *appel* de fontion à quatre arguments on a `makeBeat(kick, 2, measure, kickBeat)`.
-* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
-* Les *enveloppes* nous permettent de définir comment un paramètre d'effet change au fil du temps. Elles sont décrites avec des paires de valeur-temps, comme _(valeur, temps, valeur, temps)_.
-* Pour une enveloppe, les arguments de la fonction `setEffect()` à sept paramètres sont : `setEffect(Numéro de piste, Nom de l'effet, Paramètre de l'effet, Valeur de départ, Mesure de départ, Valeur de fin, Mesure de fin)`.
-
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
[[chapter-questions]]
=== Questions
@@ -247,6 +263,7 @@ include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
[question]
--
Qu'est-ce qu'un effet vous permet de faire dans EarSketch ?
+
[answers]
* Modifier les qualités sonores d'un projet
* Ajouter un son à une piste
@@ -256,7 +273,8 @@ Qu'est-ce qu'un effet vous permet de faire dans EarSketch ?
[question]
--
-Parmi les arguments suivants, lequel n'est PAS un argument de la fonction `setEffect()` ?
+Which of these is NOT a `setEffect()` argument?
+
[answers]
* Nom de clip
* Nom de l'effet
@@ -267,6 +285,7 @@ Parmi les arguments suivants, lequel n'est PAS un argument de la fonction `setEf
[question]
--
Comment régleriez-vous le délai d'un effet de délai sur la piste 3 à 50 millisecondes ?
+
[answers]
* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
@@ -276,7 +295,8 @@ Comment régleriez-vous le délai d'un effet de délai sur la piste 3 à 50 mill
[question]
--
-Parmi les éléments suivants, lequel n'est pas un paramètre utilisé dans les enveloppes `setEffect()` ?
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
[answers]
* Longueur du clip
* Valeur de départ
@@ -286,14 +306,16 @@ Parmi les éléments suivants, lequel n'est pas un paramètre utilisé dans les
[question]
--
-Quel serait l'effet de la fonction suivante `setEffect()` ?
+What would the following `setEffect()` function do?
+
[source,python]
----
-setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 10)
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
----
+
[answers]
* Augmenter la quantité de distorsion sur la piste 1 pendant 10 mesures.
* Diminuer la quantité de distorsion sur la piste 1 pendant 50 mesures.
* Augmenter le volume de la piste 1 sur 10 mesures.
* Diminuer le volume sur la piste 1 sur 50 mesures.
---
+--
\ No newline at end of file
diff --git a/src/locales/fr/v2/get-user-input.adoc b/src/locales/fr/v2/get-user-input.adoc
index ee980bf8f..c515ec198 100644
--- a/src/locales/fr/v2/get-user-input.adoc
+++ b/src/locales/fr/v2/get-user-input.adoc
@@ -1,5 +1,6 @@
[[getuserinput]]
-== Obtenir une entrée d’utilisateur.rice
+== Obtenir une entrée de l'utilisateur.rice
+
:nofooter:
Dans ce chapitre, vous apprendrez à demander à l'utilisateur.rice de saisir des informations et à adapter votre musique en conséquence. Pour ce faire, nous allons examiner les instructions de retour et la fonction `readInput()`.
@@ -17,10 +18,10 @@ video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
[[video131js]]
video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
-. En plus de prendre des paramètres en entrée, les fonctions peuvent aussi produire une valeur en sortie. En programmation, nous appelons cela renvoyer une valeur.
-. L'*instruction de retour* est une instruction à l'intérieur de la fonction qui : 1) indique à une fonction de renvoyer une valeur lorsqu'elle est appelée. 2) indique à la fonction de s'arrêter. S'il y a des instructions après le mot clé `return`, celles-ci seront ignorées.
-. Pour utiliser la valeur retournée par la fonction, créez une variable et affectez-lui l'appel de fonction.
-. Une instruction de retour n'est pas obligatoire. Sans une instruction de retour, une fonction ne renverra aucune valeur. `fitMedia()` et `setEffect()` sont des exemples de fonctions qui ne renvoient rien.
+* En plus de prendre des paramètres en entrée, les fonctions peuvent aussi produire une valeur en sortie. En programmation, nous appelons cela renvoyer une valeur.
+* L'*instruction de retour* est une instruction à l'intérieur de la fonction qui : 1) indique à une fonction de renvoyer une valeur lorsqu'elle est appelée. 2) indique à la fonction de s'arrêter. S'il y a des instructions après le mot clé `return`, celles-ci seront ignorées.
+* Pour utiliser la valeur retournée par la fonction, créez une variable et affectez-lui l'appel de fonction.
+* Une instruction de retour n'est pas obligatoire. Sans une instruction de retour, une fonction ne renverra aucune valeur. `fitMedia()` et `setEffect()` sont des exemples de fonctions qui ne renvoient rien.
Voici un exemple de code :
@@ -40,7 +41,7 @@ Avec l'instruction de retour, le flux de commande complet d'une fonction ressemb
[[return]]
.Flux de commande de l'instruction de retour
-[caption="Figure 13.1: "]
+[caption="Figure 8.1.1: "]
image::../media/U2/Return.png[Alt Text]
.ENTRAÎNEZ-VOUS
@@ -69,18 +70,20 @@ include::code-examples/get-user-input-return-statements-2.py.txt[]
include::code-examples/get-user-input-return-statements-2.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
Disons que vous avez une partie A, mais que vous voulez qu'elle varie légèrement lorsqu'on y fait appel à différents moments de la chanson. Vous allez créer une fonction appelée `sectionA()` avec deux appels de fonction `fitMedia()`.
-La fonction devra prendre deux paramètres : `start` et un paramètre booléen `variation` qui permettra à l'utilisateur.rice de choisir une variation lors de l'appel de fonction.
+La fonction devra prendre deux paramètres : `start` et un paramètre booléen `variation` qui permettra à l'utilisateur.rice de choisir une variation lors de l'appel de fonction.
Dans le corps de la fonction, vous devrez avoir une instruction conditionnelle qui évaluera le paramètre. Selon la valeur du paramètre, vous modifierez le clip de son utilisé dans un de vos appels `fitMedia()`.
-Ensuite, vous ferez appel à la fonction à différentes mesures avec différentes variations.
+Ensuite, vous ferez appel à la fonction à différentes mesures avec différentes variations.
****
-Voici un exemple de code :
+Voici un exemple :
[role="curriculum-python"]
[source,python]
@@ -94,6 +97,8 @@ include::code-examples/get-user-input-conditional-statement.py.txt[]
include::code-examples/get-user-input-conditional-statement.js.txt[]
----
+{nbsp} +
+
[[userinput]]
=== Obtenir une entrée de l'utilisateur.rice
@@ -124,7 +129,7 @@ Nous pourrions avoir besoin de convertir une information en un autre type de don
* `String()` - convertit n'importe quelle valeur en une chaîne de caractères. Notez que dans ce cas, il s'agit d'un nom de fonction qui commence par une lettre majuscule.
* `Number()` - convertit une chaîne de caractères en nombre (par exemple : `"3.5"` devient `3.5`).
-Dans l'exemple ci-dessous, l'entrée de la console est utilisée pour déterminer le tempo de la chanson. Nous devrons donc convertir l'entrée de l'utilisateur.rice en un entier.
+Dans l'exemple ci-dessous, l'entrée de la console est utilisée pour déterminer le tempo de la chanson. Nous devrons donc convertir l'entrée de l'utilisateur.rice en un entier.
[role="curriculum-python"]
[source,python]
@@ -138,7 +143,7 @@ include::code-examples/get-user-input-user-input-1.py.txt[]
include::code-examples/get-user-input-user-input-1.js.txt[]
----
-Voici un autre exemple de ce que vous pouvez faire avec une entrée d'utilisateur.rice.
+Voici un autre exemple de ce que vous pouvez faire avec une entrée d'utilisateur.rice.
La *concaténation* est un moyen de lier des chaînes de caractères ensemble, à l'aide du symbole `+`. Par exemple, concaténer les chaînes de caractères `"hello"` et `"world"` renvoie `"helloworld"`. Dans l'exemple suivant, l'utilisateur.rice est invité.e à spécifier un numéro de clip. Le numéro est concaténé avec `DUBSTEP_BASS_WOBBLE_0` pour former un nom de clip complet donnant `DUBSTEP_BASS_WOBBLE_010`.
@@ -154,40 +159,44 @@ include::code-examples/get-user-input-user-input-2.py.txt[]
include::code-examples/get-user-input-user-input-2.js.txt[]
----
+{nbsp} +
+
.ENTRAÎNEZ-VOUS
****
Demandez une entrée d'utilisateur pour modifier quelque chose dans votre chanson.
Voici quelques suggestions d'outils que vous pouvez utiliser :
-. La concaténation de chaînes de caractères
-. La conversion de données
+. La concaténation de chaînes de caractères
+. La conversion de données
. La création d'un paramètre spécifique dans une fonction personnalisée
****
+{nbsp} +
+
[[booleanlogic]]
=== Logique booléenne
Nous allons maintenant combiner la logique booléenne et les entrées d'utilisateur pour examiner autre exemple d'interaction utilisateur.
[role="curriculum-python"]
-Voyons d'abord en quoi consiste la logique booléenne. Nous savons que les *opérateurs de comparaison* aident à créer un booléen. Par exemple, l'opérateur `==` vérifie si deux valeurs sont égales, et si c'est le cas, le booléen sera `True`.
+Voyons d'abord en quoi consiste la logique booléenne. You know that *comparison operators* help create a boolean. Par exemple, l'opérateur `==` vérifie si deux valeurs sont égales, et si c'est le cas, le booléen sera `True`.
[role="curriculum-javascript"]
-Voyons d'abord en quoi consiste la logique booléenne. Nous savons que les *opérateurs de comparaison* aident à créer un booléen. Par exemple, l'opérateur `===` vérifie si deux valeurs sont égales, et si c'est le cas, le booléen sera
- `true`.
+Voyons d'abord en quoi consiste la logique booléenne. You know that *comparison operators* help create a boolean. Par exemple, l'opérateur `===` vérifie si deux valeurs sont égales, et si c'est le cas, le booléen sera
+ `true`.
Maintenant, examinons les *opérateurs booléens* ; ceux-ci permettent de combiner plusieurs booléens. Il existe trois opérateurs booléens :
[role="curriculum-python"]
-* `and` : prend deux booléens en entrée et renvoie `True` uniquement lorsque les deux sont `True`, sinon il renvoie `False`.
-* `or` : prend deux booléens en entrée et renvoie `True` lorsqu'au moins un booléen est `True`, sinon il renvoie `False`.
-* `not` : prend un booléen et renvoie le booléen opposé.
+* `and` : prend deux booléens en entrée et renvoie `True` uniquement lorsque les deux sont `True`, sinon il renvoie `False`.
+* `or` : prend deux booléens en entrée et renvoie `True` lorsqu'au moins une entrée est `True`, sinon il renvoie `False`.
+* `not` : prend un booléen en entrée et renvoie le booléen opposé.
[role="curriculum-javascript"]
* `&&`: is called "and", it takes 2 boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
* `||`: is called "or": it takes 2 boolean inputs and returns `true` when at least 1 input is `true`, otherwise returns `false`.
-* `!` : est nommé « not ». Il prend un booléen en entrée et renvoie le booléen opposé.
+* `!` : est nommé « not ».
Par exemple, si vous avez 16 ans, la phrase "J'ai 16 ans" est vraie et la phrase "J'ai 17 ans" est fausse. La phrase "J'ai 16 ans and J'ai 17 ans" (vrai and faux) est fausse, car vous ne pouvez pas avoir à la fois 16 ans et 17 ans. Mais la phrase "J'ai 16 ans or J'ai 17 ans" (vrai ou faux) est vraie.
@@ -243,14 +252,16 @@ video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
[[video17ajs]]
video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
-
.ENTRAÎNEZ-VOUS
****
+Il prend un booléen en entrée et renvoie le booléen opposé.
+
Combinons maintenant des entrées d'utilisateur et des opérations booléennes :
-Rédigez un script qui demandera à l'utilisateur de choisir un genre, avec un nombre limité d'options (par exemple "hip-hop" et "classique"). Selon la réponse de l'utilisateur, sélectionnez une chaîne de caractères de beat (ou rythme) qui s'adapte bien au genre musical. Vous pouvez accepter plusieurs possibilités, par exemple : "HIP HOP", "hip hop" et "Hip Hop" afficheront la même chanson.
+Rédigez un script qui demandera à l'utilisateur de choisir un genre, avec un nombre limité d'options (par exemple "hip-hop" et "classique"). Selon la réponse de l'utilisateur, sélectionnez une chaîne de caractères de beat (ou rythme) qui s'adapte bien au genre musical. You can accept several possibilities. Vous pouvez accepter plusieurs possibilités, par exemple : "HIP HOP", "hip hop" et "Hip Hop" afficheront la même chanson.
****
Voici un exemple :
+
[role="curriculum-python"]
[source,python]
----
@@ -263,46 +274,48 @@ include::code-examples/get-user-input-boolean-operations.py.txt[]
include::code-examples/get-user-input-boolean-operations.js.txt[]
----
+{nbsp} +
+
.DÉFI
****
Voici le défi Juke-box : Rédigez un script qui demandera à l'utilisateur de choisir un genre musical parmi trois options (par exemple, "latino", "trap" et "dubstep"). Selon la réponse de l'utilisateur, créez une chanson appropriée au genre.
****
+{nbsp} +
+
[[chapter8summary]]
=== Résumé du chapitre 8
[role="curriculum-python"]
-* *Les instructions de retour* peuvent être incluses dans une définition de fonction pour renvoyer un résultat lorsque la fonction est appelée.
+* Les *instructions de retour* peuvent être incluses dans une définition de fonction pour renvoyer un résultat lorsque la fonction est appelée.
* `readInput()` demandera à l'utilisateur du texte lorsque le code sera exécuté. Le seul paramètre est une chaîne de caractères que l'utilisateur verra s'afficher. Vous pouvez ensuite utiliser le texte de l'utilisateur dans votre code, par exemple, pour changer le tempo ou le genre de votre musique.
* Certaines fonctions vous permettent de convertir des données d'un type à un autre. `str()` convertit n'importe quelle valeur en une chaîne de caractères.
`int()` convertit une chaîne de caractères en nombres entiers. `float()` convertit une chaîne de caractères en nombres décimaux.
* Vous pouvez *concaténer* (lier) des chaînes de caractères ensemble : "Hello"+"World" renverra "HelloWorld".
* La *logique booléenne* inclut les opérations booléennes. Voici les opérateurs booléens :
-** `and` : prend deux booléens en entrée et renvoie `True` uniquement lorsque les deux sont `True`, sinon il renvoie `False`.
+** `and` : prend deux booléens en entrée et renvoie `True` uniquement lorsque les deux sont `True`, sinon il renvoie `False`.
** `or` : prend deux booléens en entrée et renvoie `True` lorsqu'au moins une entrée est `True`, sinon il renvoie `False`.
** `not` : prend un booléen en entrée et renvoie le booléen opposé.
* Vous disposez maintenant de nombreux outils pour introduire des variations dans votre musique : les entrées d'utilisateur peuvent déterminer les éléments. Vous pouvez ajouter un paramètre dans vos fonctions personnalisées pour sélectionner une variation lorsque vous appelez votre fonction.
[role="curriculum-javascript"]
* Les *instructions de retour* peuvent être incluses dans une définition de fonction pour renvoyer un résultat lorsque la fonction est appelée.
-* `readInput()` demandera à l'utilisateur d'écrire du texte lorsque le code sera exécuté. Le seul paramètre est une chaîne de caractères que l'utilisateur verra s'afficher. Vous pouvez ensuite utiliser le texte de l'utilisateur dans votre code, par exemple, pour changer le tempo ou le genre de votre musique.
-* Certaines fonctions vous permettent de convertir des données d'un type à un autre. `String()` convertit n'importe quelle valeur en une chaîne de caractères. Notez que dans ce cas, il s'agit d'un nom de fonction qui commence par une lettre majuscule. Number() convertit une chaîne de caractères en nombre.
+* `readInput()` demandera à l'utilisateur du texte lorsque le code sera exécuté. Le seul paramètre est une chaîne de caractères que l'utilisateur verra s'afficher. Vous pouvez ensuite utiliser le texte de l'utilisateur dans votre code, par exemple, pour changer le tempo ou le genre de votre musique.
+* Certaines fonctions vous permettent de convertir des données d'un type à un autre. La concaténation de chaînes de caractères `String()` convertit n'importe quelle valeur en une chaîne de caractères. Notez que dans ce cas, il s'agit d'un nom de fonction qui commence par une lettre majuscule. Number() convertit une chaîne de caractères en nombre.
* Vous pouvez *concaténer* (lier) des chaînes de caractères ensemble : "Hello"+"World" renverra "HelloWorld".
* La *logique booléenne* inclut les opérations booléennes. Voici les opérateurs booléens :
** `&&`: is called "and", it takes 2 boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
** `||`: is called "or": it takes 2 boolean inputs and returns `true` when at least 1 input is `true`, otherwise returns `false`.
-** `!` : est nommé « not ». Il prend un booléen en entrée et renvoie le booléen opposé.
+** `!` : est nommé « not ».
* Vous disposez maintenant de nombreux outils pour introduire des variations dans votre musique : les entrées d'utilisateur peuvent déterminer les éléments. Vous pouvez ajouter un paramètre dans vos fonctions personnalisées pour sélectionner une variation lorsque vous appelez votre fonction.
-
-
-
[[chapter-questions]]
=== Questions
[question]
--
Parmi les éléments suivants, lequel serait considéré comme un exemple de conversion de type de données ?
+
[answers]
* Convertir une chaîne de caractères en un nombre.
* Stockage d'un tempo défini par l'utilisateur dans une variable.
@@ -314,42 +327,40 @@ Parmi les éléments suivants, lequel serait considéré comme un exemple de con
[question]
--
Quelle serait la valeur de retour du bloc de code suivant (qu'est-ce qui afficherait dans la console) ?
+
[source,python]
----
-n = 5
-if (n * 3) == 15:
- m = 5 + n
- print(m)
+not (True and (4 > 5))
----
+
[answers]
+* `True`
* `10`
* `n`
-* `True`
* `False`
--
[role="curriculum-javascript"]
[question]
--
-Quelle serait la valeur de retour du bloc de code suivant (qu'est-ce qui s'afficherait dans la console) ?
+Quelle serait la valeur de retour du bloc de code suivant (qu'est-ce qui afficherait dans la console) ?
+
[source,javascript]
----
-var n = 5;
-if (n * 3 == 15) {
- var m = 5 + n;
- println(m);
-}
+!(true && (4 > 5));
----
+
[answers]
-* `10`
+* `true`
* `n`
-* `True`
-* `False`
+* `false`
+* `10`
--
[question]
--
Parmi les éléments suivants, lequel est un exemple de concaténation ?
+
[answers]
* `x = beatstring1 + beatstring2`
* `x = beatstring1.beatstring2`
@@ -360,29 +371,23 @@ Parmi les éléments suivants, lequel est un exemple de concaténation ?
[role="curriculum-python"]
[question]
--
-Que retourne l'expression suivante ?
-[source,python]
-----
-not (True and (4 > 5))
-----
+How would you obtain the boolean True with the booleans True and False?
+
[answers]
-* `True`
-* `False`
-* `true`
-* `"False"`
+* `True or False`
+* `not True`
+* `True and False`
+* ENTRAÎNEZ-VOUS
--
[role="curriculum-javascript"]
[question]
--
-Que retourne l'expression suivante ?
-[source,javascript]
-----
-!(true && (4 > 5));
-----
+How would you obtain the boolean true with the booleans true and false?
+
[answers]
-* `true`
-* `false`
-* `True`
+* DÉFI
+* `!true`
* `"false"`
---
+* `"False"`
+--
\ No newline at end of file
diff --git a/src/locales/fr/v2/getting-started.adoc b/src/locales/fr/v2/getting-started.adoc
index 2f61d9307..8a8288f94 100644
--- a/src/locales/fr/v2/getting-started.adoc
+++ b/src/locales/fr/v2/getting-started.adoc
@@ -1,36 +1,33 @@
[[getstartedwithearsketch]]
== Commencer avec EarSketch
-:nofooter:
-Dans ce chapitre, vous apprendrez comment fonctionne EarSketch, comment placer des sons (clips) dans votre musique et comment déboguer votre code.
+:nofooter:
+Dans ce chapitre, vous apprendrez comment fonctionne EarSketch, comment placer des sons (clips) dans votre musique et comment déboguer votre code. You will place sounds into your music and see how to debug your code.
[[discoverearsketch]]
=== Découvrir EarSketch
+
:nofooter:
-Dans EarSketch, vous donnerez des instructions à l'ordinateur en écrivant du code. Une ligne de code représente une instruction. L'ensemble des instructions est appelé le programme (ces instructions peuvent aussi être appelées un algorithme). Tout comme il est possible de suivre une recette dans un livre de cuisine pour obtenir un plat cuisiné, l'exécution d'un programme dans EarSketch permet de composer une chanson. Mais où va le code dans le programme ? Découvrez-le dans la vidéo ci-dessous !
+Dans EarSketch, vous donnerez des instructions à l'ordinateur en écrivant du code. Une ligne de code représente une instruction. L'ensemble des instructions est appelé le programme (ces instructions peuvent aussi être appelées un algorithme). Tout comme il est possible de suivre une recette dans un livre de cuisine pour obtenir un plat cuisiné, l'exécution d'un programme dans EarSketch permet de composer une chanson. How does it work? Découvrez-le dans la vidéo ci-dessous !
[role="curriculum-mp4"]
[[video1a]]
-video::./videoMedia/001-03-EarSketchWorkplace-PY-JS.mp4[]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
////
-TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+TODO: upload video
////
-Pour utiliser EarSketch
+As you become familiar with EarSketch these are the main panels.
-. Vous pouvez naviguer et sélectionner des sons dans votre *bibliothèque de sons*
-. Vous écrirez ensuite du code dans votre *éditeur de code*.
-. Lorsque vous cliquerez sur le bouton *Exécuter*, votre musique s'affichera dans la *station de travail audionumérique* (ou *DAW*).
-. Vous pourrez ensuite cliquer sur le bouton *Jouer* pour écouter votre musique.
-. Par la suite, vous pourrez modifier votre code à votre guise jusqu'à ce que vous soyez satisfait de votre musique !
-. Vous pouvez ouvrir et fermer ce panneau de cours en utilisant le bouton bascule en haut du panneau.
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
-////
-OPTIONAL:
-////
+{nbsp} +
Qu'est-ce qu'un DAW ?
@@ -38,8 +35,6 @@ Une *station de travail audionumérique*, ou *DAW* (Digital Audio Workstation en
Parmi les DAW populaires, on retrouve https://www.ableton.com/[Ableton^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^] et http://www.reaper.fm/[Reaper^].
-Avec un DAW, vous pouvez enregistrer, éditer, visualiser et jouer des fichiers audio. Ces fichiers audio se nomment des *clips*.
-
EarSketch est comme un DAW, sauf que vous pouvez programmer directement les éléments musicaux en utilisant du code.
Voyez comment vous pouvez pleinement tirer parti du DAW :
@@ -52,10 +47,6 @@ video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
////
-////
-END OF OPTIONAL
-////
-
Essayons d'exécuter un exemple de code dans EarSketch ! Dans la case ci-dessous, appuyez sur l'icône du presse-papiers bleu en haut à droite. Ceci aura pour effet de coller l'exemple de code dans l'*éditeur de code*. Vous n'avez pas besoin de comprendre le code pour l'instant, appuyez simplement sur le bouton _Exécuter_ : votre musique s'affichera ensuite dans le DAW. Vous pouvez appuyer sur _Jouer_ pour l'écouter.
[role="curriculum-python"]
@@ -70,62 +61,45 @@ include::code-examples/getting-started-intro-script.py.txt[]
include::code-examples/getting-started-intro-script.js.txt[]
----
-
+{nbsp} +
[[createanewscript]]
=== Créer votre premier script
-Dans EarSketch, chaque script que vous écrivez correspond à une chanson. Voyons comment créer un script :
-
-. *Connectez-vous ou créez un nouveau compte* en haut à droite de votre écran. Si vous cliquez sur le bouton blanc qui indique « Créer/réinitialiser le compte », vous pouvez soit récupérer un mot de passe perdu, soit créer un nouveau compte (« Créer un nouveau compte »). Attention : en règle générale sur Internet, il convient de ne pas utiliser le même mot de passe pour tous vos comptes et de ne jamais partager vos mots de passe.
+Voyons comment créer un script :
-. *Cliquez pour créer :* Si vous n'avez pas de scripts ouverts, cliquez sur le long lien bleu dans l'éditeur de code « Cliquez ici pour créer un nouveau script ».
+. *Create.* In the editor tabs, click the white "+" icon.
+
-Si vous avez déjà un ou plusieurs scripts(s) ouverts, cliquez sur l'icône blanche « + » à côté des onglets.
+*Cliquez pour créer :* Si vous n'avez pas de scripts ouverts, cliquez sur le long lien bleu dans l'éditeur de code « Cliquez ici pour créer un nouveau script ».
+
[[newscriptplus]]
.Créer un nouveau script, ouvrir des scripts
[caption="Figure 1.2.1: "]
image::../media/U1P1/NewScriptPlus.png[Alt Text]
-
-////
-TODO: update this screenshot to the current "+"
-////
-
-. *Choisissez un nom et un langage :* Une fois que la boîte de dialogue « Créer un nouveau script » sera ouverte, donnez un nom à votre nouveau script : il s'agira du titre de votre chanson. Sélectionnez ensuite le langage de programmation (Python ou Javascript). Enfin, cliquez sur le bouton « Créer ».
+. Sélectionnez ensuite le langage de programmation (Python ou Javascript).
+
[[newscriptpromptpy]]
.La boîte de dialogue « Créer un nouveau script »
[role="curriculum-python"]
[caption="Figure 1.2.2: "]
image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
[[newscriptpromptjs]]
.La boîte de dialogue « Créer un nouveau script »
[role="curriculum-javascript"]
[caption="Figure 1.2.2: "]
image::../media/U1P1/newScriptPromptJS.png[Alt Text]
-
-////
-OPTIONAL
-////
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
Qu'est-ce qu'un langage de programmation ?
-Le code s'écrit dans un *langage de programmation* qui inclut un vocabulaire et une syntaxe, comme une langue parlée. Vous devez connaître les règles de grammaire de votre langage de programmation, sinon l'ordinateur ne sera pas en mesure d'exécuter vos instructions.
-
-Dans EarSketch, vous pouvez coder soit en Python, soit en JavaScript.
-
-[role="curriculum-python"]
-Vous êtes en mode Python. Python est utilisé par des entreprises comme Google, Yahoo, NASA, Disney ainsi que pour coder des jeux comme Civilization 4, Battlefield 2 et Crystal Space.
-
-[role="curriculum-javascript"]
-Vous êtes en mode JavaScript. JavaScript est l'un des dix langages de programmation les plus populaires au monde. Presque tous les sites Web utilisent JavaScript.
+Le code s'écrit dans un *langage de programmation* qui inclut un vocabulaire et une syntaxe, comme une langue parlée. Like a spoken language it has vocabulary and syntax. Vous devez connaître les règles de grammaire de votre langage de programmation, sinon l'ordinateur ne sera pas en mesure d'exécuter vos instructions.
-Au niveau le plus élémentaire, les ordinateurs fonctionnent en termes de 1 et 0, soit des nombres binaires. Cela s'explique par le fait que les composants électroniques réagissent différemment à la présence de courant électrique (1) ou à l'absence de courant électrique (0). Lorsque vous appuyez sur le bouton *Exécuter*, l'ordinateur traduit les instructions Python ou JavaScript en code binaire. Le code est ensuite *exécuté* par l'ordinateur et vous pouvez voir votre musique apparaître dans le DAW.
+Lorsque vous appuyez sur le bouton *Exécuter*, l'ordinateur traduit les instructions Python ou JavaScript en code binaire. Le code est ensuite *exécuté* par l'ordinateur et vous pouvez voir votre musique apparaître dans le DAW.
-////
-END OF OPTIONAL
-////
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
[[fitmedia]]
=== La fonction `fitMedia()`
@@ -136,32 +110,57 @@ Regardez la vidéo suivante pour voir comment ajouter un clip audio à votre cha
[role="curriculum-python curriculum-mp4"]
[[video110py]]
-video::./videoMedia/001-10-ComposingInEarSketch-PY.mp4[]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
[role="curriculum-javascript curriculum-mp4"]
[[video110js]]
-video::./videoMedia/001-10-ComposingInEarSketch-JS.mp4[]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
-Pour ajouter un clip de son au DAW, nous commençons par entrer la fonction `fitMedia()`. Entre les parenthèses, nous aurons quatre paramètres, séparés par des virgules :
+Pour ajouter un clip de son au DAW, nous commençons par entrer la fonction `fitMedia()`.
-. *Un nom de clip* : placez votre curseur entre les parenthèses, allez dans la bibliothèque de sons, sélectionnez un clip, puis collez-le en utilisant l'icône de collage bleue.
-. *Le numéro de piste* : les pistes sont les rangées que l'on retrouve dans le DAW ; elles vous aident à organiser vos sons par type d'instruments (voix, guitare soliste, guitare d'accompagnement, basse, batterie, etc.). Vous pouvez commencer à la piste numéro un pour votre premier son.
-. *Mesure de début* : le moment où votre son commencera à jouer. Les mesures sont des unités de temps musicales. Une mesure est composée de quatre temps. Vous pouvez commencer à la mesure numéro un pour votre premier son.
-. *Mesure de fin* : le moment où votre son arrêtera de jouer.
-Par exemple : `fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)` placera le son `Y18_DRUM_SAMPLES_2` sur la piste 1, de la mesure 1 à la mesure 5.
+`fitMedia(sound, track, start, end)`
-Ensuite, appuyez sur _Exécuter_ : vous devriez voir s'afficher votre son dans le DAW. Lorsque vous appuierez sur _Jouer_, vous pourrez l'écouter.
+Entre les parenthèses, nous aurons quatre paramètres, séparés par des virgules :
-[role="curriculum-javascript"]
-Une *instruction* indique à l'ordinateur d'effectuer une action. Par exemple, `fitMedia(Y18_DRUM_SAMPLES_1, 1, 1, 5 );` est une instruction. Chaque instruction en JavaScript *_doit se terminer par un point-virgule_*.
+. *Sound*: the sound constant from the sound browser
+. *Numéro de piste :* La piste sur laquelle la musique est placée.
+. *Mesure de début :* La mesure de départ du clip de son.
+. *Mesure de fin :* La mesure de fin du clip de son.
+
+_Example:_
+
+Par exemple, `fitMedia(Y18_DRUM_SAMPLES_1, 1, 1, 5 );` est une instruction.
+
+Par exemple : `fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)` placera le son `Y18_DRUM_SAMPLES_2` sur la piste 1, de la mesure 1 à la mesure 5. Une *instruction* indique à l'ordinateur d'effectuer une action.
+Vous êtes en mode JavaScript.
+
+When you've finished adding all your parameters, press _run_. Après avoir appuyé sur « Exécuter », la musique est visible dans le panneau du DAW. Lorsque vous appuierez sur _Jouer_, vous pourrez l'écouter.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
////
OPTIONAL
////
-La *bibliothèque de sons* : parcourez ou recherchez plus de 4 000 clips audio à utiliser dans votre musique, créés par les musicien.ne.s/producteur.rice.s https://en.wikipedia.org/wiki/Young_Guru[Young Guru^], https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^], https://en.wikipedia.org/wiki/Ciara[Ciara^], https://en.wikipedia.org/wiki/Common_(rapper)[Common^], https://en.wikipedia.org/wiki/Pharrell_Williams[Pharrell Williams^], Irizarry y Caraballo, et https://www.sndbrd.com/[Milknsizz^].
+{nbsp} +
+
+Vous pouvez naviguer et sélectionner des sons dans votre *bibliothèque de sons*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Ensuite, appuyez sur _Exécuter_ : vous devriez voir s'afficher votre son dans le DAW.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
////
END OF OPTIONAL
@@ -170,8 +169,8 @@ END OF OPTIONAL
////
OPTIONAL
////
-
-Retrouvez ci-dessous quelques exemples de code utilisant la fonction `fitMedia()` :
+
+Retrouvez ci-dessous quelques exemples de code utilisant la fonction `fitMedia()` : Remember, you can import this script by clicking the blue clipboard icon.
[role="curriculum-python"]
[source,python]
@@ -199,17 +198,13 @@ include::code-examples/getting-started-using-fitmedia-2.py.txt[]
include::code-examples/getting-started-using-fitmedia-2.js.txt[]
----
-
-////
-END OF OPTIONAL
-////
-
+{nbsp} +
.ENTRAÎNEZ-VOUS
****
À l'aide de sons que vous aimez :
-. Placez des sons sur deux pistes différentes
+. Placez des sons sur deux pistes différentes
. Placez des sons des mesures 2 à 12
. Créez une chanson courte comprenant trois pistes, d'une longueur de huit mesures ou plus
@@ -218,7 +213,6 @@ Pour chaque exercice, faites écouter votre chanson à votre voisin.
Si vous rencontrez des erreurs lors de l'exécution de votre code, consultez le chapitre suivant sur le débogage.
****
-
[[debugging]]
=== Déboguer votre code
@@ -226,11 +220,11 @@ Il arrive que les programmeur.se.s commettent des erreurs qui ont pour effet de
[role="curriculum-python curriculum-mp4"]
[[video3py]]
-video::./videoMedia/003-02-UsingtheConsole-PY.mp4[]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
[role="curriculum-javascript curriculum-mp4"]
[[video3js]]
-video::./videoMedia/003-02-UsingtheConsole-JS.mp4[]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
////
TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
@@ -242,22 +236,28 @@ OPTIONAL
Quels sont les différents types d'erreurs ?
-. *Erreurs de syntaxe* : Votre programme ne s'exécute pas parce que votre code enfreint les règles de *syntaxe* du langage (p. ex. : si vous oubliez de fermer une parenthèse ou si vous avez écrit la fonction fitMedia incorrectement).
+. *Erreurs de syntaxe* : Votre programme ne s'exécute pas parce que votre code enfreint les règles de *syntaxe* du langage (p. ex.
. *Erreurs d'exécution* : Votre programme commence à s'exécuter, mais s'arrête à cause d'une erreur.
-. *Erreurs de logique* : Votre programme s'exécute, mais ne fait pas ce qu'il doit faire. Vous pouvez corriger celles-ci en examinant le DAW pour vérifier si les clips que vous vouliez ajouter ont été réellement ajoutés au bon endroit.
+. *Erreurs de logique* : Votre programme s'exécute, mais ne fait pas ce qu'il doit faire. Vous pouvez corriger celles-ci en examinant le DAW pour vérifier si les clips que vous vouliez ajouter ont été réellement ajoutés au bon endroit.
////
END OF OPTIONAL
////
-
Voici quelques erreurs courantes :
-. *Erreur d'orthographe :* Vérifiez l'orthographe lors de l'utilisation d'une fonction comme `fitMedia()` ou des constantes de son.
-. *Sensibilité à la casse :* La plupart des mots utilisés en programmation sont sensibles à la casse (l'ordinateur reconnaît la différence entre les lettres majuscules et minuscules). Faites attention aux lettres minuscules et majuscules. Par exemple, vous devez écrire `fitMedia()` et non `FitMedia()` ou `fitmedia()`. La plupart des éléments d'un script suivent une règle appelée la *notation "Camel Case"* : c'est-à-dire que le premier mot est en minuscule et que la première lettre des mots suivants sera en majuscule, comme dans `exempleNomFonction()`.
-. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+[role="curriculum-python"]
+. : si vous oubliez de fermer une parenthèse ou si vous avez écrit la fonction fitMedia incorrectement).
+. *Sensibilité à la casse :* La plupart des mots utilisés en programmation sont sensibles à la casse (l'ordinateur reconnaît la différence entre les lettres majuscules et minuscules). Il est possible de les désigner en saisissant ou en collant leur nom en majuscule. Vous écrirez ensuite du code dans votre *éditeur de code*. *Choisissez un nom et un langage :* Une fois que la boîte de dialogue « Créer un nouveau script » sera ouverte, donnez un nom à votre nouveau script : il s'agira du titre de votre chanson.
+. Chaque instruction en JavaScript *_doit se terminer par un point-virgule_*.
. *Paramétrage du script :* EarSketch ajoute automatiquement des code de paramétrage à un nouveau script, mais vous pourriez accidentellement supprimer `from earsketch import *`.
-. *Ponctuation :* Virgules manquantes ou autres erreurs de ponctuation
+. Parmi les erreurs habituelles, on retrouve les fautes de frappe, les erreurs de casse, les parenthèses manquantes, le paramétrage incorrect du script, etc.
+
+[role="curriculum-javascript"]
+. : si vous oubliez de fermer une parenthèse ou si vous avez écrit la fonction fitMedia incorrectement).
+. *Sensibilité à la casse :* La plupart des mots utilisés en programmation sont sensibles à la casse (l'ordinateur reconnaît la différence entre les lettres majuscules et minuscules). Il est possible de les désigner en saisissant ou en collant leur nom en majuscule. Vous écrirez ensuite du code dans votre *éditeur de code*. *Choisissez un nom et un langage :* Une fois que la boîte de dialogue « Créer un nouveau script » sera ouverte, donnez un nom à votre nouveau script : il s'agira du titre de votre chanson.
+. Chaque instruction en JavaScript *_doit se terminer par un point-virgule_*.
+. Parmi les erreurs habituelles, on retrouve les fautes de frappe, les erreurs de casse, les parenthèses manquantes, le paramétrage incorrect du script, etc.
C'est le moment de mettre en pratique tout ce que vous avez appris !
Trouvez les cinq erreurs dans le code suivant :
@@ -273,6 +273,7 @@ include::code-examples/getting-started-finding-errors.py.txt[]
----
include::code-examples/getting-started-finding-errors.js.txt[]
----
+
////
OPTIONAL
////
@@ -291,64 +292,37 @@ END OF OPTIONAL
Take a look at <> for a description of different error types and what you can do to prevent them.
-
////
TODO: when options are ready, modify the link
////
-
-
-
-
-
[[chapter1summary]]
=== Résumé du chapitre 1
-[role="curriculum-python"]
-* Une ligne de code est une instruction à exécuter par l'ordinateur. L'ensemble des instructions constitue le programme.
-* Une *station de travail audionumérique ou DAW* est un logiciel informatique spécialisé pour l'enregistrement, l'édition et la lecture de fichiers audio numériques ou *clips*. EarSketch est un DAW qui permet de placer des clips audio sur une séquence temporelle avec du code.
-* Pour créer de la musique dans EarSketch, le code doit d'abord être saisi dans le panneau de l'éditeur de code. Après avoir appuyé sur « Exécuter », la musique est visible dans le panneau du DAW.
-* Les clips de sons peuvent être trouvés dans la bibliothèque de sons. Il est possible de les désigner en saisissant ou en collant leur nom en majuscule.
-* Un *programme* d'ordinateur est une séquence d'instructions que l'ordinateur exécute pour accomplir une tâche spécifique.
-* Les *langages de programmation* sont un ensemble de mots et de symboles qui sont compris par l'ordinateur. Un langage de programmation suit une syntaxe spécifique afin d'organiser le code.
-* Un script EarSketch comprend une section de commentaires, une section de paramétrage, et une section dédiée à la musique.
-* Vous pouvez créer un nouveau script en cliquant sur le long lien bleu ou sur l'icône « + » si un autre script est déjà ouvert.
-* La fonction `fitMedia()` permet d'ajouter du son dans le DAW. Elle comprend quatre arguments, soient les informations dont elle a besoin pour faire de la musique :
-** *Nom de clip :* Le clip de son qui est placé dans le DAW.
-** *Numéro de piste :* La piste sur laquelle la musique est placée.
-** *Mesure de début :* La mesure de départ du clip de son.
-** *Mesure de fin :* La mesure de fin du clip de son.
-* Le *débogage* est le processus de recherche et de correction de *bogues* ou d'erreurs faites par le programmeur.
+* Un *programme* d'ordinateur est une séquence d'instructions que l'ordinateur exécute pour accomplir une tâche spécifique.
+* A *script* is a nickname for a short program.
+* Une *station de travail audionumérique ou DAW* est un logiciel informatique spécialisé pour l'enregistrement, l'édition et la lecture de fichiers audio numériques ou *clips*. EarSketch est un DAW qui permet de placer des clips audio sur une séquence temporelle avec du code.
+* Lorsque vous cliquerez sur le bouton *Exécuter*, votre musique s'affichera dans la *station de travail audionumérique* (ou *DAW*). Vous pourrez ensuite cliquer sur le bouton *Jouer* pour écouter votre musique. Par la suite, vous pourrez modifier votre code à votre guise jusqu'à ce que vous soyez satisfait de votre musique !
+* *Sounds* can be found in the *Sound Browser*. La fonction `fitMedia()` permet d'ajouter du son dans le DAW.
+* Les *langages de programmation* sont un ensemble de mots et de symboles qui sont compris par l'ordinateur.
* Les règles de syntaxe ** définissent comment le code doit être écrit dans un langage de programmation spécifique.
-* La *console* affiche des informations sur l'état d'un programme, ce qui la rend utile pour déboguer les erreurs de syntaxe.
-* Parmi les erreurs habituelles, on retrouve les fautes de frappe, les erreurs de casse, les parenthèses manquantes, le paramétrage incorrect du script, etc.
-
-[role="curriculum-javascript"]
-* Une ligne de code est une instruction à exécuter par l'ordinateur. L'ensemble des instructions constitue le programme.
-* Une *station de travail audionumérique ou DAW* est un logiciel informatique spécialisé pour l'enregistrement, l'édition et la lecture de fichiers audio numériques ou *clips*. EarSketch est un DAW qui permet de placer des clips audio sur une séquence temporelle avec du code.
-* Pour créer de la musique dans EarSketch, le code doit d'abord être saisi dans le panneau de l'éditeur de code. Après avoir appuyé sur « Exécuter », la musique est visible dans le panneau du DAW.
-* Les clips de sons peuvent être trouvés dans la bibliothèque de sons. Il est possible de les désigner en saisissant ou en collant leur nom en majuscule.
-* Un *programme* d'ordinateur est une séquence d'instructions que l'ordinateur exécute pour accomplir une tâche spécifique.
-* Les *langages de programmation* sont un ensemble de mots et de symboles qui sont compris par l'ordinateur. Un langage de programmation suit une syntaxe spécifique afin d'organiser le code.
-* Un script EarSketch comprend une section de commentaires, une section de paramétrage, et une section dédiée à la musique.
* Vous pouvez créer un nouveau script en cliquant sur le long lien bleu ou sur l'icône « + » si un autre script est déjà ouvert.
-* La fonction `fitMedia()` permet d'ajouter du son dans le DAW. Elle comprend quatre arguments, soient les informations dont elle a besoin pour faire de la musique :
-** *Nom de clip :* Le clip de son qui est placé dans le DAW.
-** *trackNumber :* La piste sur laquelle la musique est placée.
+* La fonction `fitMedia()` permet d'ajouter du son dans le DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Numéro de piste :* La piste sur laquelle la musique est placée.
** *Mesure de début :* La mesure de départ du clip de son.
** *Mesure de fin :* La mesure de fin du clip de son.
* Le *débogage* est le processus de recherche et de correction de *bogues* ou d'erreurs faites par le programmeur.
-* Les règles de syntaxe ** définissent comment le code doit être écrit dans un langage de programmation spécifique.
-* La *console* affiche des informations sur l'état d'un programme, ce qui la rend utile pour déboguer les erreurs de syntaxe.
+* La *console* affiche des informations sur l'état d'un programme, ce qui la rend utile pour déboguer les erreurs de syntaxe.
* Parmi les erreurs habituelles, on retrouve les fautes de frappe, les erreurs de casse, les parenthèses manquantes, le paramétrage incorrect du script, etc.
-
[[chapter-questions]]
=== Questions
[question]
--
Parmi les éléments suivants, lequel n'est PAS un panneau dans l'espace de travail EarSketch ?
+
[answers]
* La bibliothèque d'effets
* L'éditeur de code
@@ -359,6 +333,7 @@ Parmi les éléments suivants, lequel n'est PAS un panneau dans l'espace de trav
[question]
--
De combien de paramètres avez-vous besoin pour votre fonction `fitMedia()` ?
+
[answers]
* 4
* 6
@@ -369,6 +344,7 @@ De combien de paramètres avez-vous besoin pour votre fonction `fitMedia()` ?
[question]
--
Un script correspond à...
+
[answers]
* une chanson sur EarSketch
* une ligne de code
@@ -379,16 +355,18 @@ Un script correspond à...
[question]
--
Qu'est-ce qu'une mesure ?
+
[answers]
-* Une unité de temps musical
+* Les mesures sont des unités de temps musicales.
* Une unité de volume audio
* Une ligne dans le DAW
-* La hauteur d'une note
+* Une unité de temps musical
--
[question]
--
Parmi les éléments suivants, lequel N'EST PAS un type commun d'erreur retrouvé dans les codes ?
+
[answers]
* Les erreurs grammaticales
* Les erreurs d'exécution
@@ -399,9 +377,10 @@ Parmi les éléments suivants, lequel N'EST PAS un type commun d'erreur retrouv
[question]
--
À quel endroit dans l'espace de travail EarSketch pouvez-vous obtenir des informations sur vos bogues ?
+
[answers]
* La console
* Le navigateur de sons
* Le navigateur de scripts
* Le DAW
---
+--
\ No newline at end of file
diff --git a/src/locales/fr/v2/legacy.adoc b/src/locales/fr/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/fr/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/fr/v2/loops-and-layers.adoc b/src/locales/fr/v2/loops-and-layers.adoc
index af67b30ac..ae4fdf551 100644
--- a/src/locales/fr/v2/loops-and-layers.adoc
+++ b/src/locales/fr/v2/loops-and-layers.adoc
@@ -1,16 +1,16 @@
[[loopandlayers]]
-== Boucles et textures musicales
+== Loops and Layers
+
:nofooter:
Dans ce chapitre, vous en apprendrez davantage sur les boucles `for` et comment vous pouvez créer des répétitions dans votre code et votre musique. Nous aborderons également la notion de texture musicales, ainsi que quelques conseils de débogage.
-
[[forloops]]
=== Boucles `for`
-Tout comme les musiciens peuvent jouer un motif de façon répétée, ou en *boucle*, les programmeurs peuvent également demander à l'ordinateur d'effectuer des tâches à répétition dans une *boucle* ! C'est plus efficace, car au lieu d'écrire une instruction à plusieurs reprises, vous pouvez écrire une boucle comprenant les instructions et l'ordinateur comprendra qu'il devra les répéter.
+Tout comme les musiciens peuvent jouer un motif de façon répétée, ou en *boucle*, les programmeurs peuvent également demander à l'ordinateur d'effectuer des tâches à répétition dans une *boucle* ! in a *loop*! C'est plus efficace, car au lieu d'écrire une instruction à plusieurs reprises, vous pouvez écrire une boucle comprenant les instructions et l'ordinateur comprendra qu'il devra les répéter.
-Par exemple, si vous désirez répéter une fonction `makeBeat()` que vous avez créée, au lieu d'écrire plusieurs lignes de fonctions `makeBeat()`, vous pouvez créer une boucle `for`. Voici comment :
+Par exemple, si vous désirez répéter une fonction `makeBeat()` que vous avez créée, au lieu d'écrire plusieurs lignes de fonctions `makeBeat()`, vous pouvez créer une boucle `for`.
////
add new video
@@ -18,8 +18,6 @@ more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPu
in the "revamping videos" tab (includes link to script)
////
-Voyez ci-dessous le code final de la vidéo :
-
[role="curriculum-python"]
[source,python]
----
@@ -32,15 +30,59 @@ include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
----
+[role="curriculum-python"]
+En Python, les boucles `for` se composent de trois parties principales :
+
+[role="curriculum-javascript"]
+En JavaScript, les boucles `for` se composent de quatre parties principales :
+
+[[loop-components-PY]]
+.Les composants de base d'une boucle « for »
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.Les composants de base d'une boucle « for »
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Compteur de boucle* : Crée une variable à utiliser comme compteur de boucle. Vous pouvez avoir plus d'une ligne d'instructions à l'intérieur d'une boucle `for`.
+* *Plage ou « Range »* : Une fonction qui crée une liste de nombres à compter pour le compteur de boucle. The keyword `in` connects the loop counter to the range. La fonction `range()` nécessite deux arguments, un point de départ (inclusif) et un point de fin (exclusif) : `range(startingNumber, endingNumber)`.
+* *Corps de la boucle* : Le corps d'une boucle contient des instructions qui s'exécuteront de manière répétée. Cela inclut tout ce qui est *indenté* (avec un espace à gauche, à l'aide de la touche de tabulation ou _Tab_) directement après le deux-points `:`.
+
+[role="curriculum-javascript"]
+* *Initialisation* : Ceci crée une variable à utiliser comme *compteur de boucle* avant que la première boucle ne s'exécute.
+* *Condition de la boucle* : Ceci vérifie si la boucle doit être exécutée à nouveau. Si l'instruction est vraie, le corps de la boucle s'exécute à nouveau. Si le compteur dépasse la limite, l'instruction sera considérée comme fausse et la boucle se terminera. L'ordinateur continuera ensuite à exécuter le code situé après la boucle.
+* *Itération* : Une instruction qui met à jour le compteur de boucle. It counts up each time the loop repeats.
+* *Corps de la boucle* : Le corps d'une boucle contient des instructions qui s'exécuteront de manière répétée. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). Vous pouvez avoir plus d'une ligne d'instructions à l'intérieur d'une boucle `for`.
+
+.ENTRAÎNEZ-VOUS
+****
+. Créez une boucle `for` avec le compteur "measure" pour que votre fonction `makeBeat()` s'applique des mesures 1 à 4, comme dans la vidéo.
+. Modifiez votre code pour passer des mesures 3 à 7
+. Ensuite, modifiez votre code pour que vos beats se trouvent sur la piste 2 au lieu de la piste 1, mais toujours des mesures 3 à 7.
+. Puis, modifiez votre nom de compteur, choisissez une piste et des mesures, et créez la boucle `for` appropriée
+. Montrez à votre voisin.e votre dernière boucle `for`, et demandez-lui de trouver la piste sur laquelle se trouve votre beat, la mesure sur laquelle il va se trouver, ainsi que le nom de votre compteur.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
Pour mieux comprendre le flux de votre code, vous pouvez utiliser une instruction `print`. Cela vous permet d'afficher des informations dans la console lorsque vous exécutez le code.
[role="curriculum-python"]
-L'instruction `print` *évalue* une expression, c'est-à-dire qu'elle la simplifie à sa forme la plus élémentaire, quel que soit son type de données, puis l'affiche dans la console. Veuillez noter qu'en Python, l'instruction `print` est différente des autres fonctions, car nous n'avons pas besoin d'utiliser des parenthèses.
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
[role="curriculum-javascript"]
La fonction `println()` *évalue* une expression, c'est-à-dire qu'elle la simplifie à sa forme la plus élémentaire, quel que soit son type de données, puis l'affiche dans la console.
+Then the data is converted into text and shown in the console.
+
[role="curriculum-python"]
.ENTRAÎNEZ-VOUS
****
@@ -53,6 +95,8 @@ Avant d'exécuter le code suivant, essayez de deviner ce que la console va affic
Avant d'exécuter le code suivant, essayez de deviner ce que la console va afficher pour chaque appel de `println()`.
****
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
@@ -66,60 +110,20 @@ include::code-examples/loops-and-layers-printing.js.txt[]
----
Vous verrez apparaître dans votre console les lignes suivantes :
+
----
-4 (cela correspond à 1+3, simplifié)
-1 (au début, votre compteur "measure" est égal à 1)
-"ok"
-2 (maintenant, votre compteur "measure" est égal à 2)
-"ok" (chaque fois que nous passons à travers une boucle, nous affichons "ok", voilà pourquoi cela se répète)
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
3
-"ok"
+ok
4
-"ok"
+ok
----
-Cela prend fin là, car la mesure doit être inférieure à 5, donc 4 est la limite.
-.ENTRAÎNEZ-VOUS
-****
-. Créez une boucle `for` avec le compteur "measure" pour que votre fonction `makeBeat()` s'applique des mesures 1 à 4, comme dans la vidéo.
-. Modifiez votre code pour passer des mesures 3 à 7
-. Ensuite, modifiez votre code pour que vos beats se trouvent sur la piste 2 au lieu de la piste 1, mais toujours des mesures 3 à 7.
-. Puis, modifiez votre nom de compteur, choisissez une piste et des mesures, et créez la boucle `for` appropriée
-. Montrez à votre voisin.e votre dernière boucle `for`, et demandez-lui de trouver la piste sur laquelle se trouve votre beat, la mesure sur laquelle il va se trouver, ainsi que le nom de votre compteur.
-****
-
-Vous pouvez avoir plus d'une ligne d'instructions à l'intérieur d'une boucle `for`.
-
-[role="curriculum-python"]
-En Python, les boucles `for` se composent de trois parties principales :
-
-[role="curriculum-javascript"]
-En JavaScript, les boucles `for` se composent de quatre parties principales :
-
-[[loop-components-PY]]
-.Les composants de base d'une boucle « for »
-[role="curriculum-python"]
-[caption="Figure 12.2: "]
-image::../media/U1P2/Loop_Components_PY.png[Alt Text]
-
-[[loop-components-JS]]
-.Les composants de base d'une boucle « for »
-[role="curriculum-javascript"]
-[caption="Figure 12.2: "]
-image::../media/U1P2/Loop_Components_JS.png[Alt Text]
-
-[role="curriculum-python"]
-* *Corps de la boucle* : Le corps d'une boucle contient des instructions qui s'exécuteront de manière répétée. Cela inclut tout ce qui est *indenté* (avec un espace à gauche, à l'aide de la touche de tabulation ou _Tab_) directement après le deux-points `:`.
-* *Compteur de boucle* : Crée une variable à utiliser comme compteur de boucle.
-* *Plage ou « Range »* : Une fonction qui crée une liste de nombres à compter pour le compteur de boucle. Le mot clé `in` vérifie si la valeur du compteur de boucle se trouve dans la plage spécifiée. La fonction `range()` nécessite deux arguments, un point de départ (inclusif) et un point de fin (exclusif) : `range(startingNumber, endingNumber)`.
-
-[role="curriculum-javascript"]
-* *Corps de la boucle* : Le corps d'une boucle contient des instructions qui s'exécuteront de manière répétée. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key).
-* *Initialisation* : Ceci crée une variable à utiliser comme *compteur de boucle* avant que la première boucle ne s'exécute.
-* *Itération* : Une instruction qui met à jour le compteur de boucle. Il compte à chaque itération.
-* *Condition de la boucle* : Ceci vérifie si la boucle doit être exécutée à nouveau. Si l'instruction est vraie, le corps de la boucle s'exécute à nouveau. Si le compteur dépasse la limite, l'instruction sera considérée comme fausse et la boucle se terminera. L'ordinateur continuera ensuite à exécuter le code situé après la boucle.
-
-Vous pouvez avoir plus d'une ligne d'instructions à l'intérieur d'une boucle `for`.
+Cela prend fin là, car la mesure doit être inférieure à 5, donc 4 est la limite.
[[controlflow]]
=== Flux de commande
@@ -162,7 +166,7 @@ include::code-examples/loops-and-layers-loops.py.txt[]
include::code-examples/loops-and-layers-loops.js.txt[]
----
-L'*interpréteur* lit et exécute un script. L'ordre dans lequel il est exécuté est appelé le *flux de commande*. En général, il procède par ligne, de haut en bas. C'est pourquoi nous devons définir des variables avant de les appeler dans le code.
+L'*interpréteur* lit et exécute un script. L'ordre dans lequel il est exécuté est appelé le *flux de commande*. En général, il procède par ligne, de haut en bas. C'est pourquoi nous devons définir des variables avant de les appeler dans le code.
Une boucle est une *instruction de flux de commande*, qui modifie l'ordre d'execution. À la fin d'un corps de boucle, on revient au haut de la boucle.
@@ -171,12 +175,12 @@ Cette animation montre comment le flux de commande se déplace dans une boucle `
[[loop-py]]
.Passer à travers une boucle « for »
[role="curriculum-python"]
-[caption="Figure 12.4: "]
+[caption="Figure 4.2.1: "]
image::../media/U1P2/LoopPy_updated.gif[Alt Text]
.Passer à travers une boucle « for »
[role="curriculum-javascript"]
-[caption="Figure 12.4: "]
+[caption="Figure 4.2.1: "]
[[loop-js]]
image::../media/U1P2/LoopJS_updated.gif[Alt Text]
@@ -189,15 +193,17 @@ BMW
Un dernier aspect intéressant relatif aux boucles `for` est l'incrémentation.
[role="curriculum-python"]
-Incrémenter signifie augmenter la valeur du compteur. Dans les boucles `for`, nous utilisons la fonction `range()` pour incrémenter le compteur. Nous avons vu deux paramètres pour la plage (range) : `startingNumber` et `endingNumber` (qui est exclusif). Il y a un troisième paramètre optionnel : `increment`. Par défaut, `increment` est égal à 1, mais vous pouvez l'utiliser pour incrémenter par plus d'un.
+Incrémenter signifie augmenter la valeur du compteur. Dans les boucles `for`, nous utilisons la fonction `range()` pour incrémenter le compteur. Nous avons vu deux paramètres pour la plage (range) : `startingNumber` et `endingNumber` (qui est exclusif). Il y a un troisième paramètre optionnel : `increment`. Par défaut, `increment` est égal à 1, mais vous pouvez l'utiliser pour incrémenter par plus d'un. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
[role="curriculum-javascript"]
Incrémenter signifie augmenter la valeur du compteur. Dans les boucles `for` nous utilisons l'expression `measure = measure + 1`. Cela incrémente la `mesure ou « measure »` du compteur par 1 pour chaque boucle. Il est également possible de l'incrémenter par plus d'un de la manière suivante : `measure = measure + 4`.
.ENTRAÎNEZ-VOUS
-*****
+****
Avant d'exécuter le code suivant, essayez de deviner ce qu'il va renvoyer.
-*****
+****
+
+{nbsp} +
[role="curriculum-python"]
[source,python]
@@ -211,33 +217,44 @@ include::code-examples/loops-and-layers-incrementing.py.txt[]
include::code-examples/loops-and-layers-incrementing.js.txt[]
----
+[role="curriculum-python"]
+Ici, nous avons utilisé la fonction `range()` , mais vous pouvez également incrémenter (augmenter) ou décrémenter (diminuer) une variable en utilisant le type d'expression suivant : `measure = measure + 1`. Cela signifie que « measure » est maintenant égal à sa valeur précédente +1. Vous pouvez aussi utiliser le raccourci `+=` (ou `-=` pour décrémenter). Vous pouvez utiliser le raccourci `+=` (ou `-=` pour décrémenter) de la manière suivante : `measure += 1` est équivalent à `measure = measure + 1`. Et `measure -= 1` est équivalent à `measure = measure - 1`.
[role="curriculum-python"]
-Ici, nous avons utilisé la fonction `range()` , mais vous pouvez également incrémenter (augmenter) ou décrémenter (diminuer) une variable en utilisant le type d'expression suivant : `measure = measure + 1`. Cela signifie que « measure » est maintenant égal à sa valeur précédente +1. Vous pouvez utiliser le raccourci `+=` (ou `-=` pour décrémenter) de la manière suivante : `measure += 1` est équivalent à `measure = measure + 1`. Et `measure -= 1` est équivalent à `measure = measure - 1`.
+* 1. N'oubliez pas d'initialiser les variables avec l'expression `var` !
+* 1. Si vous voulez décrémenter par une valeur supérieure à un, utilisez `measure -= 2`.
[role="curriculum-javascript"]
-Ici, nous avons écrit `measure = measure + 4`, ce qui signifie que « measure » est maintenant égale à sa valeur précédente +4. Vous pouvez aussi utiliser le raccourci `+=` (ou `-=` pour décrémenter). Voici une méthode de raccourci pour incrémenter (ou décrémenter) un compteur :
+Ici, nous avons écrit `measure = measure + 4`, ce qui signifie que « measure » est maintenant égale à sa valeur précédente +4. Vous pouvez détecter une erreur en écrivant // avant une ligne de code. Voici une méthode de raccourci pour incrémenter (ou décrémenter) un compteur :
-* `measure++` ou `measure += 1` incrémente « measure » par 1. Si vous voulez incrémenter par une valeur supérieure à un, utilisez `measure += 2`.
+[role="curriculum-javascript"]
+* `measure++` ou `measure += 1` incrémente « measure » par 1. N'oubliez pas d'initialiser les variables avec l'expression `var` !
* `measure--` ou `measure -= 1` décrémente « measure » par 1. Si vous voulez décrémenter par une valeur supérieure à un, utilisez `measure -= 2`.
-
[[debuggingtips]]
=== Astuces de débogage
-La programmation ne se limite pas à l'écriture de code. Il y a aussi une partie de débogage et de maintenance du code. Le terme « déboguer » signifie résoudre les erreurs. Si vous rencontrez une erreur, essayez de suivre les étapes suivantes :
+La programmation ne se limite pas à l'écriture de code. Il y a aussi une partie de débogage et de maintenance du code. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Si vous rencontrez une erreur, essayez de suivre les étapes suivantes :
[role="curriculum-python"]
. *Lisez la console pour obtenir des indices*.
-. *Localisez l'erreur dans votre code :* vous avez trois options ici. 1. Si la console vous indique un numéro de ligne, jetez-y un coup d'œil, ainsi qu'à la ligne précédente dans votre code. 2. Utilisez la méthode de "mise en commentaire". Vous pouvez détecter une erreur en écrivant # avant une ligne de code. Cela s'appelle mettre la ligne en commentaire : lorsque le code est exécuté, la ligne n'est pas exécutée. S'il n'y a pas d'erreur renvoyée lorsque vous exécutez le code, l'erreur est probablement située dans la ligne commentée. 3. Le *débogage à l'aide de l'instruction « print »* peut également être utilisé pour localiser une erreur. Relisez la section de votre code qui pose problème et essayez de suivre la logique. Insérez des instructions `print` là où vous êtes incertain.e de la logique, afin d'obtenir la valeur des variables et de vérifier l'état du programme. Cela vous aidera à vérifier votre compréhension du programme par rapport à ce qui se passe concrètement.
+. *Localisez l'erreur dans votre code :* vous avez trois options ici.
+[role="curriculum-python"]
+.. Si la console vous indique un numéro de ligne, jetez-y un coup d'œil, ainsi qu'à la ligne précédente dans votre code.
+.. Utilisez la méthode de "mise en commentaire". You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. S'il n'y a pas d'erreur renvoyée lorsque vous exécutez le code, l'erreur est probablement située dans la ligne commentée.
+.. Le *débogage à l'aide de l'instruction « print »* peut également être utilisé pour localiser une erreur. Passez à travers la section de votre code qui pose problème et essayez de suivre la logique. Insérez des instructions `print` là où vous êtes incertain.e de la logique, afin d'obtenir la valeur des variables et de vérifier l'état du programme. Cela vous aidera à vérifier votre compréhension du programme par rapport à ce qui se passe concrètement.
. *Partez à la chasse aux bogues* : vérifiez la présence d'erreurs et modifiez les lignes de code fautives, puis exécuter le code pour vérifier sa justesse.
-. *Demandez de l'aide* : si vous trouvez que vous avez passé trop de temps sur un bogue, n'hésitez pas à demander l'aide de quelqu'un ! Un regard neuf peut être très utile pour repérer les erreurs.
+. *Demandez de l'aide* : si vous trouvez que vous avez passé trop de temps sur un bogue, n'hésitez pas à demander l'aide de quelqu'un ! Un regard neuf peut être très utile pour repérer les erreurs.
[role="curriculum-javascript"]
. *Lisez la console pour obtenir des indices*.
-. *Localisez l'erreur dans votre code :* vous avez trois options ici. 1. Si la console vous indique un numéro de ligne, jetez-y un coup d'œil, ainsi qu'à la ligne précédente dans votre code. 2. Utilisez la méthode de "mise en commentaire". Vous pouvez détecter une erreur en écrivant // avant une ligne de code. Cela s'appelle mettre la ligne en commentaire : lorsque le code est exécuté, la ligne n'est pas exécutée. S'il n'y a pas d'erreur renvoyée lorsque vous exécutez le code, l'erreur est probablement située dans la ligne commentée. 3. Le *débogage à l'aide de l'instruction « print »* peut également être utilisé pour localiser une erreur. Passez à travers la section de votre code qui pose problème et essayez de suivre la logique. Insérez des appels de fonction `println()` là où vous êtes incertain de la logique, afin d'obtenir la valeur des variables et de vérifier l'état du programme. Cela vous aidera à vérifier votre compréhension du programme par rapport à ce qui se passe concrètement.
+. *Localisez l'erreur dans votre code :* vous avez trois options ici.
+[role="curriculum-javascript"]
+.. Si la console vous indique un numéro de ligne, jetez-y un coup d'œil, ainsi qu'à la ligne précédente dans votre code.
+.. Utilisez la méthode de "mise en commentaire". You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. S'il n'y a pas d'erreur renvoyée lorsque vous exécutez le code, l'erreur est probablement située dans la ligne commentée.
+.. Le *débogage à l'aide de l'instruction « print »* peut également être utilisé pour localiser une erreur. Passez à travers la section de votre code qui pose problème et essayez de suivre la logique. Insérez des appels de fonction `println()` là où vous êtes incertain de la logique, afin d'obtenir la valeur des variables et de vérifier l'état du programme. Cela vous aidera à vérifier votre compréhension du programme par rapport à ce qui se passe concrètement.
. *Partez à la chasse aux bogues* : vérifiez la présence d'erreurs et modifiez les lignes de code fautives, puis exécuter le code pour vérifier sa justesse.
-. *Demandez de l'aide* : si vous trouvez que vous avez passé trop de temps sur un bogue, n'hésitez pas à demander l'aide de quelqu'un ! Un regard neuf peut être très bénéfique pour détecter les erreurs.
+. *Demandez de l'aide* : si vous trouvez que vous avez passé trop de temps sur un bogue, n'hésitez pas à demander l'aide de quelqu'un ! Un regard neuf peut être très utile pour repérer les erreurs.
Dans l'exemple ci-dessous, nous allons parcourir des variables print pour aider à déboguer un script :
@@ -259,16 +276,14 @@ Dans le chapitre 1, nous vous avons présenté une liste d'erreurs potentielles
. Les *arguments* : Les arguments de fonction comprenant des erreurs peuvent conduire à toutes sortes d'erreurs. Vous devez fournir le nombre et le type d'arguments appropriés à un appel de fonction.
[role="curriculum-javascript"]
-. L'*initialisation des variables* : Une variable doit être initialisée avant de pouvoir être utilisée dans un script. Cela signifie que vous devez affecter des valeurs à vos variables dans le haut de votre script. N'oubliez pas d'initialiser les variables avec l'expression `var` !
+. L'*initialisation des variables* : Une variable doit être initialisée avant de pouvoir être utilisée dans un script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
. *Comments:* Improper commenting will cause a <>. En JavaScript, les commentaires doivent commencer par le symbole `//`.
-. Les *points-virgules* : Inclure des points-virgules après chaque instruction est fortement recommandé en JavaScript.
. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
-. Les *arguments* : Les arguments de fonction comprenant des erreurs peuvent conduire à toutes sortes d'erreurs. Vous devez fournir le nombre et le type d'arguments appropriés à un appel de fonction.
-
+. Les *arguments* : Les arguments de fonction comprenant des erreurs peuvent conduire à toutes sortes d'erreurs. Vous devez fournir le nombre et le type d'arguments appropriés à un appel de fonction.
Take a look at <> for a full description of different error types and what you can do to prevent them.
-
[[musicaltips]]
=== Astuces musicales
@@ -276,9 +291,9 @@ Maintenant que vous disposez de plusieurs outils pour créer votre musique, comm
Commençons par la *tonalité* de votre chanson :
-* La *hauteur* (ou hauteur tonale) correspond au niveau de sonorité d'une note (aigue ou grave). Les notes musicales sont regroupées en *gammes* : un ensemble de notes de musique qui sonnent bien ensemble.
-* La *tonalité* d'une chanson indique la gamme ou le groupe de notes dans lequel la musique est composée. Les tonalités peuvent être majeures (habituellement des sons plus "joyeux" ) ou mineures (habituellement des sons plus "sombres").
-* Pour les compositeur.rice.s débutant.e.s, nous recommandons de n'avoir qu'une seule tonalité pour la chanson. Utiliser des sons provenants de tonalités différentes peut sonner... faux ! En général, les sons d'un dossier de la bibliothèque de sons EarSketch sont tous dans la même tonalité.
+* La *hauteur* (ou hauteur tonale) correspond au niveau de sonorité d'une note (aigue ou grave). Les notes musicales sont regroupées en *gammes* : un ensemble de notes de musique qui sonnent bien ensemble.
+* La *tonalité* d'une chanson indique la gamme ou le groupe de notes dans lequel la musique est composée. Les tonalités peuvent être majeures (habituellement des sons plus "joyeux" ) ou mineures (habituellement des sons plus "sombres").
+* Pour les compositeur.rice.s débutant.e.s, nous recommandons de n'avoir qu'une seule tonalité pour la chanson. Utiliser des sons provenants de tonalités différentes peut sonner... off-key! En général, les sons d'un dossier de la bibliothèque de sons EarSketch sont tous dans la même tonalité.
Écoutez le clip audio ci-dessous pour comprendre la différence entre les tonalités majeures et mineures :
@@ -288,16 +303,16 @@ Commençons par la *tonalité* de votre chanson :
Maintenant, voyons les différents types de pistes que vous pourriez avoir. Vous vous souvenez peut-être qu'il est possible d'utiliser une piste de votre DAW pour chaque type d'instrument. Dans une chanson pop, vous pouvez trouver les pistes de base suivantes :
-* La mélodie est l'idée principale de la chanson qui est souvent plus aiguë. Il peut s'agir d'une voix, de notes aiguës d'un clavier, de guitare, etc.
+* La mélodie est l'idée principale de la chanson qui est souvent plus aiguë. Ce sont des notes graves. Il peut s'agir d'une voix, de notes aiguës d'un clavier, de guitare, etc.
* L'harmonie correspond aux notes plus longues qui "soutiennent la mélodie", comme les accords d'un piano, les cordes d'une guitare ou un ensemble de cordes (violons, etc.).
* Vous avez également une ligne de basse. Ce sont des notes graves. Il peut s'agir d'une basse, d'un violoncelle, des notes graves d'un clavier, etc.
* Ensuite, il y a les percussions. Si vous utilisez la fonction `makeBeat()`, celle-ci peut prendre plusieurs pistes. Par exemple, vous pouvez avoir une piste pour votre grosse caisse, une pour votre caisse claire et une pour votre charleston.
-Il s'agit là d'idées de base qui permettent de définir la texture de votre chanson. Cependant, certaines parties de votre chanson peuvent ne contenir qu'un ou deux de ces quatre éléments. Vous pouvez également ajouter d'autres pistes, créer une deuxième mélodie, ajouter des bourdons (notes très longues en arrière-plan), des sons enregistrés, des « whooshes », etc. Explorez plusieurs idées et gardez celles qui vous plaisent le plus !
+Il s'agit là d'idées de base qui permettent de définir la texture de votre chanson. Cependant, certaines parties de votre chanson peuvent ne contenir qu'un ou deux de ces quatre éléments. Vous pouvez également ajouter d'autres pistes, créer une deuxième mélodie, ajouter des bourdons (notes très longues en arrière-plan), des sons enregistrés, des « whooshes », etc. The possibilities are endless! Explorez plusieurs idées et gardez celles qui vous plaisent le plus !
Enfin, parlons de la *répétition* et du *contraste*. Les êtres humains apprécient les répétitions en raison de ce que les psychologues appellent l'effet d'exposition. Lorsqu'il entend une partie de musique répétée, le cerveau essaie d'imaginer la note suivante avant qu'elle ne soit jouée, ce qui nous donne l'impression de participer. De même, chaque fois qu'une partie de musique est répétée, l'auditeur peut percevoir de nouveaux détails du morceau, car le cerveau n'a plus besoin de se concentrer sur la mélodie brute.
-La notion de contraste renvoie aux différences entre des parties successives de la musique, ce qui crée un équilibre important par rapport aux répétitions. Le contraste est utilisé pour attirer l'attention de l'auditeur sur de nouveaux éléments. Les musiciens peuvent créer un contraste grâce à des changements rythmiques, de nouvelles mélodies ou harmonies ou encore par des variations au niveau des instruments ou des sons utilisés. On peut retrouver un bon exemple de contraste vers 0'21 (seconde 21) et 1'01 (minute 1, seconde 1) de la chanson https://www.youtube.com/watch?v=AjjlABP5t1Q[Dream State] de Son Lux.
+La notion de contraste renvoie aux différences entre des parties successives de la musique, ce qui crée un équilibre important par rapport aux répétitions. Le contraste est utilisé pour attirer l'attention de l'auditeur sur de nouveaux éléments. Les musiciens peuvent créer un contraste grâce à des changements rythmiques, de nouvelles mélodies ou harmonies ou encore par des variations au niveau des instruments ou des sons utilisés.
.ENTRAÎNEZ-VOUS
****
@@ -314,7 +329,7 @@ Créez une chanson complète comprenant :
Rappelez-vous que vous pouvez essayer plusieurs choses différentes et ne garder que les sons/idées qui vous plaisent le plus. Aussi, n'hésitez pas à partager votre musique !
****
-
+{nbsp} +
[[chapter4summary]]
=== Résumé du chapitre 4
@@ -333,19 +348,19 @@ Rappelez-vous que vous pouvez essayer plusieurs choses différentes et ne garder
* Une *boucle `for`* indique à l'ordinateur d'exécuter une section de code de façon répétée, créant ainsi un code plus efficace. Les boucles `for` sont constituées d'un corps de boucle, d'une initialisation des variables, d'une instruction d'itération et d'une condition de boucle. En outre, le code dans le corps de la boucle doit être indenté.
* Le *flux de commande* représente l'ordre dans lequel les instructions sont exécutées par l'ordinateur.
* La fonction `println()` évalue son argument et affiche le résultat dans la console. Il s'agit d'un outil utile pour le débogage, car il permet au programmeur d'en apprendre davantage sur l'état du programme.
-* La fonction « print », la mise en commentaire de code et la console sont toutes des méthodes utilisées pour déboguer du code. Demander de l'aide à quelqu'un peut aussi considérablement accélérer le processus de débogage.
+* La fonction « print », la mise en commentaire de code et la console sont des méthodes utilisées pour déboguer du code. Demander de l'aide à quelqu'un peut aussi considérablement accélérer le processus de débogage.
* Revisit the expanded list of common programming errors: <>.
* La *hauteur* d'un son détermine à quel point il est aiguë ou grave.
* La *tonalité* d'une chanson indique la gamme ou le groupe de notes dans lequel la musique est composée. Les tonalités peuvent être majeures ou mineures, ce qui crée une impression différente chez l'auditeur.
* Vous pouvez utiliser trois pistes de base pour créer la structure de vos chansons : une mélodie aiguë, une basse grave et des percussions.
-
[[chapter-questions]]
=== Questions
[question]
--
Parmi les éléments suivants, lequel n'est PAS un composant d'une boucle `for` ?
+
[answers]
* L'interpréteur de boucle
* Le compteur de boucle
@@ -356,6 +371,7 @@ Parmi les éléments suivants, lequel n'est PAS un composant d'une boucle `for`
[question]
--
Parmi les propositions suivantes, laquelle n'est PAS une bonne utilisation de boucles dans une composition musicale ?
+
[answers]
* Créer un motif de rythmes ou « beats » qui ne se répète jamais
* Placer des clips musicaux sur chaque troisième mesure
@@ -366,6 +382,7 @@ Parmi les propositions suivantes, laquelle n'est PAS une bonne utilisation de bo
[question]
--
Parmi les techniques suivantes, laquelle n'est PAS une technique recommandée pour le débogage ?
+
[answers]
* Copier et coller du code dans Google
* Afficher les valeurs des variables dans la console
@@ -376,6 +393,7 @@ Parmi les techniques suivantes, laquelle n'est PAS une technique recommandée po
[question]
--
Parmi les éléments suivants, lequel n'est PAS un élément qui peut être imprimé dans la console ?
+
[answers]
* Les commentaires du code
* Les chaînes de caractères
@@ -386,10 +404,10 @@ Parmi les éléments suivants, lequel n'est PAS un élément qui peut être impr
[question]
--
____ est une qualité du son qui détermine à quel point un son est aiguë ou grave
+
[answers]
* La hauteur
* Le tempo
* Le rythme
* Le volume
---
-
+--
\ No newline at end of file
diff --git a/src/locales/fr/v2/mixing-with-conditionals.adoc b/src/locales/fr/v2/mixing-with-conditionals.adoc
index a6c9c3be9..0fab1f0ca 100644
--- a/src/locales/fr/v2/mixing-with-conditionals.adoc
+++ b/src/locales/fr/v2/mixing-with-conditionals.adoc
@@ -1,9 +1,9 @@
[[mixingwithconditionnals]]
-== Mixer à l'aide d'instructions conditionnelles
-:nofooter:
+== Mix with Conditionals!
-Il est possible d'automatiser beaucoup d'opérations grâce au codage. Un exemple d’automatisation consisterait à programmer un robot pour qu’il s’arrête à la détection d'un obstacle : le robot n’aura donc pas besoin d’un être humain pour le faire arrêter manuellement. Au lieu de cela, le robot aura un capteur pour détecter les obstacles, et s'il y en rencontre, il s'arrêtera. Il est possible de faire des automatisations musicales dans EarSketch, en utilisant des instructions conditionnelles (« if »). Nous allons maintenant voir comment automatiser le mixage des pistes. Le mixage signifie que si une piste est trop forte, nous réduirons son volume et si elle est trop faible, nous augmenterons son volume.
+:nofooter:
+Il est possible d'automatiser beaucoup d'opérations grâce au codage. Un exemple d’automatisation consisterait à programmer un robot pour qu’il s’arrête à la détection d'un obstacle : le robot n’aura donc pas besoin d’un être humain pour le faire arrêter manuellement. Mixer à l'aide d'instructions conditionnelles Au lieu de cela, le robot aura un capteur pour détecter les obstacles, et s'il y en rencontre, il s'arrêtera. Il est possible de faire des automatisations musicales dans EarSketch, en utilisant des instructions conditionnelles (« if »). Nous allons maintenant voir comment automatiser le mixage des pistes. Le mixage signifie que si une piste est trop forte, nous réduirons son volume et si elle est trop faible, nous augmenterons son volume.
[[analyzetrack]]
=== Utilisation de la fonction `analyzeTrack()`
@@ -22,16 +22,18 @@ include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
----
-
Vous pouvez lire dans votre console que l'intensité sonore affichée est de 0.0967737948641.
-* L'intensité sonore peut aller de 0 (silence) à 1 (intensité sonore maximale).
-* Parfois, vous verrez un nombre comme ceci : 1.74630733714e-05. C'est ce qu'on appelle la notation scientifique. Vous voyez le e-05 à la fin ? Cela signifie écrire cinq zéros avant le nombre 17... Ceci correspond à 0,0000174630733714.
-* La plupart des sons auront une intensité sonore inférieure à 0.4.
+* L'intensité sonore peut aller de 0 (silence) à 1 (intensité sonore maximale).
+* Parfois, vous verrez un nombre comme ceci : 1.74630733714e-05. C'est ce qu'on appelle la notation scientifique. It means move the decimal to the left 5 places (replacing with 0 if needed). Ceci correspond à 0,0000174630733714.
+* La plupart des sons auront une intensité sonore inférieure à 0.4.
La fonction `analyzeTrack()` prend 2 arguments :
* le numéro de piste,
-* le paramètre que nous voulons analyser. Pour le volume, il s'agit de : `RMS_AMPLITUDE`.
+* le paramètre que nous voulons analyser.
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
.ENTRAÎNEZ-VOUS
****
@@ -55,71 +57,82 @@ Les *booléens* sont un type de données. Le type de données booléen peut pren
[role="curriculum-python"]
--
Pour créer un booléen, vous pouvez soit initialiser une variable (`variable1 = True`), soit utiliser une comparaison. Pour faire une comparaison, nous utilisons un *opérateur de comparaison*. Voici les opérateurs de comparaison :
+
[cols="^h,1"]
|===
|==
-| est identique à
+|est identique à
+
|!=
-| n'est pas identique à
+|n'est pas identique à
+
|>
-| est supérieur à
+|supérieur à
+
|>=
-| est supérieur ou égal à
+|supérieur ou égal à
+
|<
-| est inférieur à
+|inférieur à
+
|\<=
-| est inférieur ou égal à
+|inférieur ou égal à
|===
Notez la différence entre :
1. comparer deux valeurs pour voir si elles sont identiques : `==`
-2. l'affectation d'une valeur à une variable `=`
+1. l'affectation d'une valeur à une variable `=`
--
[role="curriculum-javascript"]
--
Pour créer un booléen, vous pouvez soit initialiser une variable (`variable1 = true;`), soit utiliser une comparaison. Pour faire une comparaison, nous utilisons un *opérateur de comparaison*. Voici les opérateurs de comparaison :
+
[cols="^h,1"]
|===
-| ===
-| est identique à
+|===
+|est identique à
+
|!==
-| n'est pas identique à
+|n'est pas identique à
+
|>
-| supérieur à
+|supérieur à
+
|>=
-| supérieur ou égal à
+|supérieur ou égal à
+
|<
-| inférieur à
+|inférieur à
+
|\<=
-| inférieur ou égal à
+|inférieur ou égal à
|===
Notez la différence entre :
1. comparer deux valeurs pour voir si elles sont identiques : `===`
-2. l'affectation d'une valeur à une variable `=`
+1. l'affectation d'une valeur à une variable `=`
--
[role="curriculum-python curriculum-mp4"]
[[video17apy]]
-video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
[role="curriculum-javascript curriculum-mp4"]
[[video17ajs]]
-video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
// this video will be cut at 2' to delete the section about boolean operators//
-
[role="curriculum-python"]
.ENTRAÎNEZ-VOUS
****
* Créez un nouveau script et ajouter des sons sur deux pistes.
* Imprimez dans la console `True` si la première piste est plus forte que la seconde piste et `False` sinon.
* Utilisez une boucle « for » avec le compteur `track` pour vérifier si l'intensité sonore est strictement supérieure à 0.01 pour chaque piste. Si c'est le cas, affichez `True`, sinon, imprimez dans la console `False`.
-* Vous pouvez utiliser des instructions d'affichage supplémentaires avant d'afficher `True` ou `False`, afin que vous puissiez savoir ce qui est `True` ou `False` lorsque vous lirez la console.
+* Vous pouvez utiliser des instructions d'affichage supplémentaires avant d'afficher `True` ou `False`, afin que vous puissiez savoir ce qui est `True` ou `False` lorsque vous lirez la console. For example, you can first print the track number and then 'True' or 'False'.
****
[role="curriculum-javascript"]
@@ -128,7 +141,7 @@ video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
* Créez un nouveau script et ajouter des sons sur deux pistes.
* Imprimez dans la console `true` si la première piste est plus forte que la seconde piste et `false` sinon.
* Utilisez une boucle « for » avec le compteur `track` pour vérifier si l'intensité sonore est strictement supérieure à 0.01 pour chaque piste. Si c'est le cas, affichez `true`, sinon, imprimez `false` dans la console.
-* Vous pouvez utiliser des instructions d'affichage supplémentaires avant d'afficher `true` ou `false`, afin que vous puissiez savoir ce qui est `true` ou `false` lorsque vous lirez la console.
+* Vous pouvez utiliser des instructions d'affichage supplémentaires avant d'afficher `true` ou `false`, afin que vous puissiez savoir ce qui est `true` ou `false` lorsque vous lirez la console. For example, you can first print the track number and then 'true' or 'false'.
****
Voici un exemple :
@@ -156,7 +169,7 @@ Remarque : dans cet exemple, nous avons utilisé des instructions d'affichage av
Qu'est-ce qu'une instruction conditionnelle ? Une *instruction* correspond à une commande pour l'ordinateur. Une *instruction conditionnelle* est une instruction qui ne doit être exécutée que si une certaine *condition* est remplie (vraie). Par exemple, si vous programmez un robot pour qu'il s'arrête devant un obstacle, la condition sera "Y a-t-il un obstacle ?". Si oui, il doit s'arrêter. Si non, ne faites rien (continuez).
-Voyez ci-dessous un exemple d'instruction conditionnelle. Notez la similitude avec une boucle « for » :
+Voyez ci-dessous un exemple d'instruction conditionnelle.
[role="curriculum-python"]
[source,python]
@@ -174,10 +187,11 @@ include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
****
* Créez un nouveau script avec deux pistes.
* Si la première piste est plus forte que la deuxième, réduisez alors son volume. Vous aurez besoin des fonctions `analyzeTrack()` et `setEffect()`, en plus d'une instruction « if ».
-* Vous aurez besoin d'un gain négatif (entre -1 et -60dB) pour réduire le volume.
+* Vous aurez besoin d'un gain négatif (entre -1 et -60dB) pour réduire le volume.
****
Voici un exemple :
+
[role="curriculum-python"]
[source,python]
----
@@ -189,7 +203,8 @@ include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
----
include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
----
-Il est possible de vérifier plusieurs conditions et d'exécuter des instructions différente selon chaque condition. Vous pouvez ajouter autant de conditions que vous le souhaitez. Nous utiliserons la syntaxe suivante :
+
+Il est possible de vérifier plusieurs conditions et d'exécuter des instructions différente selon chaque condition. You can chain multiple conditions together. Nous utiliserons la syntaxe suivante :
[role="curriculum-python"]
[source,python]
@@ -206,7 +221,7 @@ include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
[[mixingyourtracks]]
=== Mixer vos pistes
-Utilisons maintenant tous ces outils pour mixer votre chanson. Le mixage modifie le volume des pistes pour qu'elles soient bien équilibrées.
+Utilisons maintenant tous ces outils pour mixer votre chanson. Le mixage modifie le volume des pistes pour qu'elles soient bien équilibrées.
[role="curriculum-python"]
.ENTRAÎNEZ-VOUS
@@ -216,7 +231,7 @@ Utilisons maintenant tous ces outils pour mixer votre chanson. Le mixage modifie
* Vous pouvez utiliser la fonction `makeBeat()` et une boucle « for » pour ajouter des percussions.
* Choisissez votre piste « principale ». Il peut s'agir de votre mélodie ou d'une piste que vous souhaitez mettre en évidence.
* Si votre piste principale n'est pas plus forte que les autres pistes, assurez-vous d'augmenter son volume à l'aide de la fonction `setEffect()`. Ne prenez pas en compte la piste percussive, car la fonction `analyzeTrack()` n'est pas pertinente pour les percussions. `analyzeTrack()` renvoie une moyenne alors que les percussions sont des rafales de son, donc une moyenne n'évalue pas vraiment l'intensité sonore.
-* Utilisez des impressions dans la console pour montrer votre processus dans la console. Voici un exemple d'instruction d'impression : `print('Est-ce que le numéro de piste' + str(track) + 'est plus élevé que 0.01 ?')`, si le compteur `track` est égal à `1`, cela affichera 'Est-ce que le numéro de piste 1 est plus élevé que 0.01 ?". La fonction `str()` permet de convertir un nombre (p. ex. : 1) en une chaîne de caractères (p. ex. : '1').
+* Utilisez des impressions dans la console pour montrer votre processus dans la console. Voici un exemple d'instruction d'impression : `print('Est-ce que le numéro de piste' + str(track) + 'est plus élevé que 0.01 ?')`, si le compteur `track` est égal à `1`, cela affichera 'Est-ce que le numéro de piste 1 est plus élevé que 0.01 ?". La fonction `str()` permet de convertir un nombre (p. ex.
****
[role="curriculum-javascript"]
@@ -226,18 +241,18 @@ Utilisons maintenant tous ces outils pour mixer votre chanson. Le mixage modifie
* Ajoutez des sons, au moins trois pistes, pour un minimum de 16 mesures.
* Vous pouvez utiliser la fonction `makeBeat()` et une boucle « for » pour ajouter des percussions.
* Choisissez votre piste « principale ». Il peut s'agir de votre mélodie ou de la piste que vous souhaitez mettre en évidence.
-* Si votre piste principale n'est pas plus forte que les autres pistes, assurez-vous d'augmenter son volume à l'aide de la fonction `setEffect()`. Ne prenez pas en compte la piste percussive, car la fonction `analyzeTrack()` n'est pas pertinente pour les percussions.
+* Si votre piste principale n'est pas plus forte que les autres pistes, assurez-vous d'augmenter son volume à l'aide de la fonction `setEffect()`. Ne prenez pas en compte la piste percussive, car la fonction `analyzeTrack()` n'est pas pertinente pour les percussions. `analyzeTrack()` renvoie une moyenne alors que les percussions sont des rafales de son, donc une moyenne n'évalue pas vraiment l'intensité sonore.
* Utilisez des impressions dans la console pour montrer votre processus dans la console. Voici un exemple d'instruction d'impression : `println('Est-ce que le numéro de piste' + track + 'est plus élevé que 0.01 ?')`, si le compteur `track` est égal à `1`, cela affichera 'Est-ce que le numéro de piste 1 est plus élevé que 0.01 ?".
****
-
Let's review some vocabulary:
-1. *Operator*: a character that represents an action. We have seen arithmetic operators (`+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `==`, `!=`).
-2. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1+2` (evaluated to 3) or `1<2` (evaluated to True) or `analyzeTrack(1,RMS_AMPLITUDE)` (evaluated to the loudness of track 1, a float between 0 and 1).
-3. *Statements*: instructions for the computer to execute.
+1.
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `==`, `!=`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. L'ordinateur évalue les expressions pour produire un résultat, généralement une valeur numérique ou booléenne unique. For example: `1+2` (evaluated to 3) or `1<2` (evaluated to True) or `analyzeTrack(1,RMS_AMPLITUDE)` (evaluated to the loudness of track 1, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
-Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
+Voici un exemple de mixage automatisé. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
[role="curriculum-python"]
[source,python]
@@ -251,28 +266,29 @@ include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
----
+{nbsp} +
[[chapter6summary]]
=== Résumé du chapitre 6
[role="curriculum-python"]
* La fonction `analyzeTrack()` nécessite deux arguments :
-le numéro de piste et un paramètre. Lorsque le paramètre est `RMS_AMPLITUDE`, la fonction renvoie le volume de la piste (un nombre compris entre 0 et 1). Lorsque le paramètre est `SPECTRAL_CENTROID`, la fonction renvoie la brillance de la piste.
+le numéro de piste et un paramètre. Lorsque le paramètre est `RMS_AMPLITUDE`, la fonction renvoie l'intensité sonore de la piste (un nombre compris entre 0 et 1). Lorsque le paramètre est `SPECTRAL_CENTROID`, la fonction renvoie la brillance de la piste.
* Le type de données *booléen* peut seulement prendre deux valeurs : `True` ou `False`.
* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
* `==` évalue si deux valeurs sont égales, alors que `=` affecte une valeur à une variable.
* Un *opérateur * est un caractère qui représente une action.
* Les *expressions* sont évaluées par l'ordinateur pour produire une valeur.
* Une *instruction* correspond à une commande pour l'ordinateur.
-* Une *condition* est une expression qui peut être évaluée `True` (vraie) ou `False` (fausse).
-* L'instruction _if_ n'exécute son bloc de code que lorsque sa condition est `True` (vraie).
+* Une *condition* est une expression qui peut être évaluée `True` (vraie) ou `False` (fausse).
+* L'instruction _if_ n'exécute son bloc de code que lorsque sa condition est `True` (vraie).
* Dans le cas où une condition _if_ est `False`, une instruction facultative _else_ permet l'exécution d'un bloc de code alternatif.
[role="curriculum-javascript"]
-* La fonction `analyzeTrack()` prend deux arguments :
-le numéro de piste et un paramètre. Lorsque le paramètre est `RMS_AMPLITUDE`, la fonction renvoie l'intensité sonore de la piste (un nombre compris entre 0 et 1). Lorsque le paramètre est `SPECTRAL_CENTROID`, la fonction renvoie la hauteur de la piste.
+* La fonction `analyzeTrack()` nécessite deux arguments :
+le numéro de piste et un paramètre. Lorsque le paramètre est `RMS_AMPLITUDE`, la fonction renvoie l'intensité sonore de la piste (un nombre compris entre 0 et 1). Lorsque le paramètre est `SPECTRAL_CENTROID`, la fonction renvoie la brillance de la piste.
* Le type de données *booléen* peut valoir seulement deux valeurs : `true` ou `false`.
-* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* Notez la similitude avec une boucle « for » :
* `==` évalue si deux valeurs sont égales, alors que `=` affecte une valeur à une variable.
* Un *opérateur * est un caractère qui représente une action.
* Les *expressions* sont évaluées par l'ordinateur pour produire une valeur.
@@ -281,13 +297,13 @@ le numéro de piste et un paramètre. Lorsque le paramètre est `RMS_AMPLITUDE`,
* L'instruction _if_ n'exécute son bloc de code que lorsque sa condition est `true` (vraie).
* Dans le cas où une condition _if_ est `false`, une instruction facultative _else_ permet l'exécution d'un bloc de code alternatif.
-
[[chapter-questions]]
=== Questions
[question]
--
Parmi les éléments suivants, lesquels sont des booléens ?
+
[answers]
* `5+4 == 5`
* `measure = 1`
@@ -299,10 +315,12 @@ Parmi les éléments suivants, lesquels sont des booléens ?
[question]
--
Quelle serait la valeur de retour du bloc de code suivant (qu'est-ce qui s'afficherait dans la console) ?
+
[source,python]
----
include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
----
+
[answers]
* 10
* 5
@@ -314,10 +332,12 @@ include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
[question]
--
Quelle serait la valeur de retour du bloc de code suivant (qu'est-ce qui s'afficherait dans la console) ?
+
[source,javascript]
----
include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
----
+
[answers]
* 10
* 5
@@ -328,6 +348,7 @@ include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
[question]
--
Qu'est-ce que le mixage ?
+
[answers]
* Adapter le volume de chaque piste pour qu'elles paraissent bien équilibrées
* Adapter la hauteur de chaque piste pour qu'elles paraissent bien équilibrées
@@ -338,9 +359,10 @@ Qu'est-ce que le mixage ?
[question]
--
Combien de conditions pouvez-vous vérifier avec une instruction conditionnelle ?
+
[answers]
* n'importe quel nombre
* 1 condition
* 2 conditions
* 3 conditions
---
+--
\ No newline at end of file
diff --git a/src/locales/fr/v2/optional.adoc b/src/locales/fr/v2/optional.adoc
new file mode 100644
index 000000000..ab9f3ddea
--- /dev/null
+++ b/src/locales/fr/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+Dans cette unité, vous en apprendrez davantage sur les boucles « for », qui vous permettent de répéter des instructions de code de manière efficace. Nous allons également passer en revue les effets sonores et les enveloppes, soit l'évolution des effets au fil du temps. Enfin, vous apprendrez à mixer vos pistes et à utiliser des instructions conditionnelles.
\ No newline at end of file
diff --git a/src/locales/fr/v2/reference.adoc b/src/locales/fr/v2/reference.adoc
new file mode 100644
index 000000000..d08f7ea27
--- /dev/null
+++ b/src/locales/fr/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effects, Errors, and EarSketch Functions
+
+:nofooter:
+
+In this unit you will find references to all effects, errors and EarSketch API functions.
\ No newline at end of file
diff --git a/src/locales/fr/v2/welcome.adoc b/src/locales/fr/v2/welcome.adoc
index d669b8ea5..56541ac1a 100644
--- a/src/locales/fr/v2/welcome.adoc
+++ b/src/locales/fr/v2/welcome.adoc
@@ -1,10 +1,15 @@
[[welcome]]
-== Bienvenue
+== Welcome Students and Teachers!
+
:nofooter:
-Bienvenue sur EarSketch !
+Bienvenue sur EarSketch !
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
-Dans le cadre de ce programme, vous apprendrez à la fois l'informatique et la technologie musicale. Vous utiliserez soit Python soit JavaScript pour créer votre propre musique.
+*Students*: Continue below to learn more about EarSketch
+
+Dans le cadre de ce programme, vous apprendrez à la fois l'informatique et la technologie musicale. Vous utiliserez soit Python soit JavaScript pour créer votre propre musique.
Les musicien.ne.s et les programmeur.se.s écrivent du code informatique pour créer de nouveaux sons, effets sonores et chansons.
@@ -12,8 +17,10 @@ Les musicien.ne.s et les programmeur.se.s écrivent du code informatique pour cr
[[video0]]
video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
-Apprendre à écrire du code informatique est une compétence qui vous sera utile dans de nombreux parcours professionnels.
+Apprendre à écrire du code informatique est une compétence qui vous sera utile dans de nombreux parcours professionnels.
Vous deviendrez peut-être un.e producteur.rice de musique légendaire ou l'ingénieur.e du son le.a plus convoité.e du secteur ! Nous vous souhaitons beaucoup de succès dans vos projets EarSketch.
-Cliquez sur la flèche à droite au-dessus de ce texte pour commencer.
\ No newline at end of file
+Cliquez sur la flèche à droite au-dessus de ce texte pour commencer.
+
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/fr/v2/your-first-song.adoc b/src/locales/fr/v2/your-first-song.adoc
index d4881c95c..9f33b673f 100644
--- a/src/locales/fr/v2/your-first-song.adoc
+++ b/src/locales/fr/v2/your-first-song.adoc
@@ -1,5 +1,6 @@
[[customizeyourfirstsong]]
== Personnaliser votre première chanson
+
:nofooter:
Dans ce chapitre, vous apprendrez à modifier le tempo de votre chanson, à ajouter des commentaires à votre code et à charger vos propres sons pour appuyer le message de votre chanson.
@@ -28,39 +29,47 @@ La fonction `setTempo()` déterminera la vitesse de votre chanson. Le *tempo* co
.ENTRAÎNEZ-VOUS
****
-. Créez un nouveau script.
+. Créez un nouveau script.
. Placez des sons sur deux pistes différentes.
. Modifiez votre tempo et écoutez la chanson.
-. Jouez votre chanson selon trois tempos différents pour un.e ami.e. Demandez-lui ensuite de classer les morceaux du tempo le plus lent au plus rapide.
+. Jouez votre chanson selon trois tempos différents pour un.e ami.e. Demandez-lui ensuite de classer les morceaux du tempo le plus lent au plus rapide. Demandez-lui ensuite de classer les morceaux du tempo le plus lent au plus rapide.
****
Un genre musical est un type de composition artistique (par exemple, la musique ou la peinture), caractérisée par des similitudes dans la forme, le style ou le thème. Chaque genre possède des gammes de tempo différentes. Par exemple :
[cols="^3*"]
|===
-|GENRE|BPM|EXEMPLE
+|GENRE |BPM |EXEMPLE
-|Hip Hop
-|85-95
-|Coolio - Gangsta’s Paradise (feat. L.V.)
|Pop
-|110-330
-|Lizzo - Juice
-|Techno
|120-125
-|Boris Brejcha - Schleierwolken
-|Electro
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip Hop
|100-130
-|Apashe - Behind My Eyes (feat. LIA)
-|House
-|115-130
-|DJ Breezy - Kimpinstik (feat. Dahlin Gage & Medikal)
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|110-330
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|120-125
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
|Dubstep et trap
|140-150
-|Jessica Audiffred & Walshy Fire - Stupid Love (feat. Nia V)
-|Caisse et basse
-|160-180
-|Mollie Collins - Lost & Found
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
|===
.ENTRAÎNEZ-VOUS
@@ -70,28 +79,27 @@ Un genre musical est un type de composition artistique (par exemple, la musique
. Tentez de trouver des similitudes entre les chansons.
. Vous pouvez également faire une recherche par genre sur Wikipedia afin d'obtenir plus d'informations sur le sujet.
****
-
-Notez qu'un clip de son peut parfois sonner très différemment lorsque vous le pré-écoutez et lorsqu'il est joué dans votre chanson. Cela peut être dû au fait que le tempo du clip est différent de celui de votre chanson. Pour connaître le tempo exact de l'extrait, survolez le nom du clip dans le navigateur de sons. Ensuite, vous pouvez modifier le tempo de votre chanson en conséquence ou choisir un clip audio qui corresponde mieux au tempo de votre chanson.
+Sounds are automatically stretched to fit your song's tempo. Notez qu'un clip de son peut parfois sonner très différemment lorsque vous le pré-écoutez et lorsqu'il est joué dans votre chanson. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
[[comments]]
=== Ajouter des commentaires à votre code
+Les *commentaires* sont des lignes de code qui ne sont pas exécutées par l'ordinateur. Nous les utilisons uniquement pour rendre le code plus facile à comprendre, pour mieux l'organiser ou afin d'inscrire des notes pour un usage ultérieur. Les *commentaires* sont des lignes de code qui ne sont pas exécutées par l'ordinateur. Nous les utilisons uniquement pour rendre le code plus facile à comprendre, pour mieux l'organiser ou afin d'inscrire des notes pour un usage ultérieur. Vous devrez remplir ces informations pour chaque nouveau script. Dans votre script actuel, remplissez les informations suivantes dans les commentaires au début de votre code : auteur : votre nom
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. Cela permet aux autres programmeur.se.s de comprendre plus facilement en quoi consiste votre code.
+
[role="curriculum-python"]
-Les *commentaires* sont des lignes de code qui ne sont pas exécutées par l'ordinateur. Nous les utilisons uniquement pour rendre le code plus facile à comprendre, pour mieux l'organiser ou afin d'inscrire des notes pour un usage ultérieur. En Python, les commentaires sont indiqués par une ligne commençant par le symbole `#`.
+En Python, les commentaires sont indiqués par une ligne commençant par le symbole `#`.
[role="curriculum-javascript"]
-Les *commentaires* sont des lignes de code qui ne sont pas exécutées par l'ordinateur. Nous les utilisons uniquement pour rendre le code plus facile à comprendre, pour mieux l'organiser ou afin d'inscrire des notes pour un usage ultérieur. En JavaScript, les commentaires sont indiqués par une ligne commençant par deux barres obliques `//`.
-
-Notez que les premières lignes de chaque script sont des commentaires qui décrivent votre script. Vous devrez remplir ces informations pour chaque nouveau script. Cela permet aux autres programmeur.se.s de comprendre plus facilement en quoi consiste votre code.
+En JavaScript, les commentaires sont indiqués par une ligne commençant par deux barres obliques `//`.
.ENTRAÎNEZ-VOUS
****
-Dans votre script actuel, remplissez les informations suivantes dans les commentaires au début de votre code :
-
-. script_name : le nom de votre chanson
-. auteur : votre nom
-. description : écrivez ici une courte description de votre projet
+Notez que les premières lignes de chaque script sont des commentaires qui décrivent votre script.
****
Vous pouvez également utiliser des commentaires pour décrire ce que différentes sections de votre code feront. Voyez l'exemple ci-dessous. Vous pouvez coller le code, puis l'exécuter. Notez comment les commentaires offrent une description pour chaque section :
@@ -108,17 +116,20 @@ include::code-examples/your-first-song-comments.py.txt[]
include::code-examples/your-first-song-comments.js.txt[]
----
+{nbsp} +
[[uploadingsounds]]
=== Charger vos propres sons
-Vous pouvez charger vos propres clips audio dans la bibliothèque de sons. Ouvrez votre navigateur de sons et cliquez sur le bouton « ajouter un son » sous les filtres (si le bouton ne s'affiche pas, assurez-vous que vous êtes connecté). Une fenêtre s'ouvrira ensuite. Explorons les trois premières options :
+You can upload your own sounds through the Sound Browser on the left side of your screen. Ouvrez votre navigateur de sons et cliquez sur le bouton « ajouter un son » sous les filtres (si le bouton ne s'affiche pas, assurez-vous que vous êtes connecté).
+
+You must be logged in to upload sounds.
-. *Charger un nouveau son* vous permet de choisir parmi des fichiers audio (.mp3, .aiff, etc.) déjà sur votre ordinateur. Modifiez le nom du fichier au besoin ("constant value(required)"), puis cliquez sur « CHARGER ».
-. *Enregistrement rapide* vous permet d'enregistrer de courts clips directement dans la bibliothèque EarSketch. Visualisez la vidéo ci-dessous pour en savoir plus.
-. *Freesound* vous permet d'importer directement des sons à partir de Freesound.org, une base de données audio open-source. Dans la barre de recherche, vous pouvez rechercher un type de son (p. ex. : des sons d'oiseaux, de pluie, de rue bondée, etc.). Sous la rubrique « Résultats », vous verrez une liste de sons apparaître. Vous pouvez écouter les sons en cliquant sur le bouton de lecture. S'il vous convient, sélectionnez le bouton devant le nom du fichier, puis cliquez sur « CHARGER » au bas de la page.
+Explorons les trois premières options :
-Pour trouver le son que vous venez de charger ou d'enregistrer, tapez son nom dans la barre de recherche de la bibliothèque de sons.
+. *Charger un nouveau son* vous permet de choisir parmi des fichiers audio (.mp3, .aiff, etc.)
+. *Enregistrement rapide* vous permet d'enregistrer de courts clips directement dans la bibliothèque EarSketch.
+. *Freesound* vous permet d'importer directement des sons à partir de Freesound.org, une base de données audio open-source. Dans la barre de recherche, vous pouvez rechercher un type de son (p. ex. Then select the toggle button in front of the file name to select.
[role="curriculum-mp4"]
[[video101rec]]
@@ -128,21 +139,21 @@ video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
****
La plupart du temps, la musique et l'art en général, est une manière de transmettre un message. Cela peut se faire par le biais des paroles ou du style de la chanson. Nous aimerions que vous créiez une chanson courte qui exprime quelque chose. Il peut s'agir d'un sentiment que vous souhaitez partager ou d'une histoire.
-. Pensez à ce que vous souhaitez exprimer.
-. Ensuite, vous pouvez soit a) écrire quelques paroles et vous enregistrer en train de les chanter ou de les lire, soit b) enregistrer ou télécharger quelques sons qui se rapportent au message que vous voulez communiquer.
+. Pensez à ce que vous souhaitez exprimer.
+. Then either:
+.. Ensuite, vous pouvez soit a) écrire quelques paroles et vous enregistrer en train de les chanter ou de les lire, soit b) enregistrer ou télécharger quelques sons qui se rapportent au message que vous voulez communiquer.
+.. Record or download some sounds that are related to your message
. Ajoutez ces enregistrements à votre chanson à l'aide de la fonction `fitMedia()`.
. Ajoutez ensuite quelques clips de EarSketch supplémentaires à l'aide de la fonction `fitMedia()`.
. Faites écouter votre chanson à un.e ami.e.
. Vous pouvez discuter de vos chansons et des éléments que vous essayez d'exprimer.
****
-////
-OPTIONAL
-////
+Les *processus* ou tâches sont des programmes qui s'exécutent sur votre ordinateur.
-Les *processus* ou tâches sont des programmes qui s'exécutent sur votre ordinateur. Le CPU de l'ordinateur ou *l'unité centrale* les exécute.
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. La *mémoire* d'un ordinateur contient des données et des instructions de traitement que l'unité centrale doit utiliser. The CPU is often considered the "brain" of the computer.
-La *mémoire* d'un ordinateur contient des données et des instructions de traitement que l'unité centrale doit utiliser. La mémoire, également appelée mémoire de stockage primaire ou RAM (mémoire à accès aléatoire), stocke temporairement ses données. Seules les informations relatives aux processus qui sont en cours d'exécution sont stockées dans la mémoire vive (RAM). Cela permet un accès rapide aux instructions et aux données du CPU.
+La mémoire, également appelée mémoire de stockage primaire ou RAM (mémoire à accès aléatoire), stocke temporairement ses données. It is designed to be fast and temporary, for active processes only.
Il y a une différence entre la mémoire (ou stockage à court terme) et le stockage à long terme. Le stockage à long terme, tout comme un disque dur ou un infonuage, est appelé stockage secondaire. Le *stockage secondaire* stocke de grands volumes de données pour de longues périodes de temps, même après l'arrêt de l'ordinateur. Le CPU n'interagit pas directement avec le stockage secondaire. Lorsque le CPU exécute un processus, les données du stockage secondaire doivent d'abord être mises en mémoire pour que le CPU puisse y accéder rapidement.
@@ -165,26 +176,19 @@ END OF OPTIONAL
Le *droit d'auteur ou Copyright* est la partie de la loi qui couvre la *propriété intellectuelle* ou la propriété de l'œuvre créative, comme la musique. Lorsque vous utilisez des échantillons (petits extraits musicaux) ou remixez de la musique existante, vous devez absolument créditer les auteurs et vous pouvez le faire dans les commentaires de votre code. Avant d’utiliser les sons créés par d’autres musiciens et de partager votre propre musique, apprenez-en davantage sur le droit d’auteur !
-Le *droit d'auteur ou Copyright* est la partie de la loi qui couvre la *propriété intellectuelle* ou la propriété de l'œuvre créative, comme la musique.
-
Lorsque vous créez une œuvre originale et assez substantielle, vous obtenez automatiquement un droit d'auteur ! Aux États-Unis, cela signifie que vous pouvez les reproduire, apporter des modifications et partager ce que vous créez.
-Il y a deux droits d'auteur liés à une chanson : les droits de la chanson (par l'auteur ou le compositeur) et les droits d'enregistrement sonore (souvent par la maison de disques). Les redevances provenant des représentations publiques vont à l’auteur-compositeur tandis que la plupart des redevances provenant des ventes de disques vont à la maison de disques.
+Il y a deux droits d'auteur liés à une chanson : les droits de la chanson (par l'auteur ou le compositeur) et les droits d'enregistrement sonore (souvent par la maison de disques). Les redevances provenant des représentations publiques vont à l’auteur-compositeur tandis que la plupart des redevances provenant des ventes de disques vont à la maison de disques.
La *violation du droit d'auteur* est une appropriation illégale des avantages liés au droit d'auteur, comme le téléchargement illégal de la musique. Aux États-Unis, *l'utilisation équitable ou « fair use » * permet l'utilisation de contenu protégé par un droit d'auteur sous certaines conditions, comme des fins éducatives ou essentielles, ne réutilisant que de petits extraits de l'œuvre. L'utilisation équitable est déterminée par un juge au cas par cas.
-Outre l'utilisation équitable, il y a un moyen d'utiliser et de partager de la musique de manière ouverte. Le droit d'auteur devrait nous aider à créer et à partager davantage d'art, et non moins. En effet, EarSketch fonctionne parce que les artistes ont partagé leurs œuvres ou travail avec vous par le biais d'*échantillons* (un court extrait de l'enregistrement sonore) dans la bibliothèque de sons. Ces artistes ont partagé leurs échantillons sous une licence *Creative Commons* qui donne la permission aux autres personnes d'utiliser leur travail. Vous avez donc un accès ouvert à ces échantillons dans EarSketch et toute la musique que vous y créez est partageable, mais vous ne pouvez pas la vendre. Le fait de partager votre musique ou de permettre à d'autres étudiants de remixer votre code est une façon de payer au suivant et d'aider à diffuser de nouvelles œuvres dans le monde.
+Outre l'utilisation équitable, il y a un moyen d'utiliser et de partager de la musique de manière ouverte. En effet, EarSketch fonctionne parce que les artistes ont partagé leurs œuvres ou travail avec vous par le biais d'*échantillons* (un court extrait de l'enregistrement sonore) dans la bibliothèque de sons.
-Les licences *Creative Commons* (ou CC) permettent aux créateur.rice.s de préciser les droits qu'ils.elles désirent conserver et les droits qu'ils.elles libèrent. Voici les différentes clauses possibles d'une licence CC : « Vous pouvez utiliser cette œuvre comme vous le souhaitez, SAUF QUE... ; »
-
-* « ...vous devez y apposer mon nom. » - Attribution (BY)
-* « ...vous ne pouvez en aucun cas la modifier. » - Pas de modification (ND)
-* « ... vous ne pouvez pas en tirer de l'argent. » - Pas d'utilisation commerciale (NC)
-* « ...vous devez partager toute nouvelle création sous la même licence. » - Partage dans les mêmes conditions (SA)
-
-Pour désigner une licence Creative Commons, il vous suffit de sélectionner un type et de l'appliquer à votre travail. Lorsque vous partagez un script dans EarSketch, il vous sera demandé de choisir une licence pour votre chanson.
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Le droit d'auteur devrait nous aider à créer et à partager davantage d'art, et non moins. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. Vous avez donc un accès ouvert à ces échantillons dans EarSketch et toute la musique que vous y créez est partageable, mais vous ne pouvez pas la vendre. Le fait de partager votre musique ou de permettre à d'autres étudiants de remixer votre code est une façon de payer au suivant et d'aider à diffuser de nouvelles œuvres dans le monde.
+Lorsque vous partagez un script dans EarSketch, il vous sera demandé de choisir une licence pour votre chanson.
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
[[chapter2summary]]
=== Résumé du chapitre 2
@@ -193,7 +197,7 @@ Pour désigner une licence Creative Commons, il vous suffit de sélectionner un
* Le *tempo* est la vitesse à laquelle un morceau de musique est joué, exprimé en battements ou beats par minute (bpm). Le tempo est lié au genre musical.
* Les clips de la bibliothèque de sons EarSketch sont regroupés dans des dossiers de sons apparentés. Pour connaître le tempo exact de l'extrait, survolez le nom du clip dans la bibliothèque de sons.
* Les commentaires sont des lignes de code qui ne sont pas exécutées par l'ordinateur. Elles sont cependant utiles pour créer des notes dans un script.
-* La fonction `from earsketch import *` permet d'ajouter l'API de EarSketch à votre projet. Elle doit être incluse au début de chaque script.
+* La fonction `from earsketch import *` permet d'ajouter l'API de EarSketch à votre projet.
* La fonction `setTempo()` vous permet de spécifier le tempo de votre chanson. Elle doit être incluse dans chaque script EarSketch.
* Vous pouvez charger vos propres clips audio dans EarSketch à travers la bibliothèque de sons. Cliquez simplement sur « Ajouter un son ».
* Un *processus* est une tâche exécutée sur un ordinateur. Le traitement est effectué par le *CPU* d'un ordinateur, qui est responsable de l'exécution des instructions du programme.
@@ -201,7 +205,7 @@ Pour désigner une licence Creative Commons, il vous suffit de sélectionner un
* Le *stockage secondaire* fait référence à un stockage de données à long terme, souvent en grands volumes. Les données du stockage secondaire doivent être mises en mémoire avant que le CPU puisse y accéder.
* Le *droit d’auteur* est une partie de la loi qui couvre la propriété d'une œuvre créative, comme la musique. C'est très important pour les musiciens, car cela définit comment l'œuvre d'une autre personne peut être utilisée et partagée.
* Si vous créez une nouvelle œuvre musicale, vous disposez automatiquement d’un droit d’auteur. En d'autres termes, vous avez des droits sur le travail que vous avez créé.
-* La *concession de licence* pour un morceau de musique accorde la permission à d'autres personnes de l'utiliser. Parfois, certains droits sur une œuvre sont conservés avec les licences *Creative Commons*. EarSketch vous permet d'ajouter des licences Creative Commons à votre musique par le biais de la fenêtre de partage.
+* La *concession de licence* pour un morceau de musique accorde la permission à d'autres personnes de l'utiliser.
[role="curriculum-javascript"]
* Le *tempo* est la vitesse à laquelle un morceau de musique est joué, exprimé en battements ou beats par minute (bpm). Le tempo est lié au genre musical.
@@ -214,10 +218,7 @@ Pour désigner une licence Creative Commons, il vous suffit de sélectionner un
* Le *stockage secondaire* fait référence à un stockage de données à long terme, souvent en grands volumes. Les données du stockage secondaire doivent être mises en mémoire avant que le CPU puisse y accéder.
* Le *droit d’auteur* est une partie de la loi qui couvre la propriété d'une œuvre créative, comme la musique. C'est très important pour les musiciens, car cela définit comment l'œuvre d'une autre personne peut être utilisée et partagée.
* Si vous créez une nouvelle œuvre musicale, vous disposez automatiquement d’un droit d’auteur. En d'autres termes, vous avez des droits sur le travail que vous avez créé.
-* La *concession de licence* pour un morceau de musique accorde la permission à d'autres personnes de l'utiliser. Parfois, certains droits sur une œuvre sont conservés avec les licences *Creative Commons*. EarSketch vous permet d'ajouter des licences Creative Commons à votre musique par le biais de la fenêtre de partage.
-
-
-
+* La *concession de licence* pour un morceau de musique accorde la permission à d'autres personnes de l'utiliser.
[[chapter-questions]]
=== Questions
@@ -225,6 +226,7 @@ Pour désigner une licence Creative Commons, il vous suffit de sélectionner un
[question]
--
Qu'est-ce que la fonction `setTempo()` vous permet de faire dans EarSketch ?
+
[answers]
* Préciser le tempo d'une chanson
* Ajouter un son à une piste
@@ -235,6 +237,7 @@ Qu'est-ce que la fonction `setTempo()` vous permet de faire dans EarSketch ?
[question]
--
Quelle est l'unité du tempo ?
+
[answers]
* Beats par minute (BPM)
* Mesures
@@ -245,6 +248,7 @@ Quelle est l'unité du tempo ?
[question]
--
À quoi servent les commentaires ?
+
[answers]
* Toutes ces réponses
* Organiser votre code
@@ -255,6 +259,7 @@ Quelle est l'unité du tempo ?
[question]
--
Parmi les affirmations suivantes, laquelle est vraie ?
+
[answers]
* Un disque dur est un exemple de stockage secondaire
* Les données audio sont enregistrées dans le CPU d'un ordinateur
@@ -265,6 +270,7 @@ Parmi les affirmations suivantes, laquelle est vraie ?
[question]
--
Que faut-il faire pour obtenir un droit d'auteur ?
+
[answers]
* Créer et publier toute nouvelle œuvre
* Acheter un brevet
@@ -274,10 +280,11 @@ Que faut-il faire pour obtenir un droit d'auteur ?
[question]
--
-Qu'est-ce que Creative Commons ?
+What is a music license?
+
[answers]
-* Une licence pour partager ouvertement votre travail sous certaines restrictions
-* Un processus de composition
* Le droit de poursuivre toute personne qui utilise votre musique
-* Une licence qui vous permet de percevoir des redevances
---
+* Un processus de composition
+* Techno
+* script_name : le nom de votre chanson
+--
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/haw/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/haw/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/haw/v1/every-effect-explained-in-detail.adoc b/src/locales/haw/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..f52da48f9
--- /dev/null
+++ b/src/locales/haw/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTER
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/haw/v1/every-error-explained-in-detail.adoc b/src/locales/haw/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..9b0dfc157
--- /dev/null
+++ b/src/locales/haw/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*.
+
+The process of finding and fixing bugs is called *debugging*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/haw/v1/the-earSketch-api.adoc b/src/locales/haw/v1/the-earSketch-api.adoc
new file mode 100644
index 000000000..90e09c349
--- /dev/null
+++ b/src/locales/haw/v1/the-earSketch-api.adoc
@@ -0,0 +1,6 @@
+[[ch_27]]
+== The EarSketch API
+
+:nofooter:
+
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/haw/v2/add-beats.adoc b/src/locales/haw/v2/add-beats.adoc
new file mode 100644
index 000000000..3757cb508
--- /dev/null
+++ b/src/locales/haw/v2/add-beats.adoc
@@ -0,0 +1,339 @@
+[[addsomebeats]]
+== Add some Beats!
+
+:nofooter:
+
+In this chapter you will learn how to make your own beats! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
+
+[[variables]]
+=== Variables
+
+[role="curriculum-python curriculum-mp4"]
+[[video2py]]
+video::./videoMedia/002-05-Variables-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video2js]]
+video::./videoMedia/002-05-Variables-JS.mp4[]
+
+What is a variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
+
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
+
+To use a variable,
+
+[role="curriculum-python"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. You can only use the variable after it has been assigned, not before. For example, write `fitMedia(synth1, 1, 1, 3)`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-javascript"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. We also use the command `var` at the beginning of the line. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. For example, write `fitMedia(synth1, 1, 1, 3);`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-instead-of-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-instead-of-this.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+In your previous scripts, use variables to store your sound constants. Look at the examples below for help. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-variables.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-variables.js.txt[]
+----
+
+Note that it's important to name your variable in an understandable and descriptive way. For example, specify `synth1` instead of `music1` or `test`, which don't provide any information. This way, when you or someone else reads your code, they can see what you are referring to.
+
+A *constant* is similar to a variable because it stores values. However, the value of a constant never changes. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. By convention, constant names are capitalized and use underscores instead of spaces.
+
+[[drumbeatstrings]]
+=== Beat Strings
+
+Let's first learn some basic concepts about rhythm:
+
+* *Rhythm* is a pattern of sound, often repeated.
+* The *tempo* is the speed of the music in BPM (beats per minute).
+* A *beat* is like the "steady pulse" of a song. When members of an audience clap their hands in a concert, they're clapping on the beat.
+* A *measure* is a musical time unit with a predetermined number of beats. In EarSketch, 1 *measure* is 4 beats long. Since there are 4 beats in 1 measure, beats are also called *quarter (1/4) notes*.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. When you are counting 1/4 notes, you say "1, 2, 3, 4...." When counting 1/8 notes, you can use "ands": "1 and 2 and 3 and 4 and...."
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Note that the sum of all notes in one measure must be equal to 1. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* A *metronome* helps the musician set the rhythm of his or her piece by making a clicking noise on the beat. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
+
+[[imediameasurepng]]
+.A measure
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
+
+[[imediabeatpng]]
+.A beat
+[caption="Figure 3.2.2: "]
+image::../media/U1P1/beat.png[A beat]
+
+[[imediasixteenthnotepng]]
+.A sixteenth note
+[caption="Figure 3.2.3: "]
+image::../media/U1P1/sixteenthnote.png[A sixteenth note]
+
+.PRACTICE
+****
+Listen to your favorite song, and try to clap on the beat. You can do this exercise with your neighbor.
+****
+
+We'll compose each of our rhythms in a *beat* string.
+
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
+
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` starts playing the percussive sound clip (one hit of the drum, for example).
+* `+` extends the audio clip into the next sub-beat. It always follows a `0` or `+`.
+* `-` is a rest, meaning silence.
+
+.PRACTICE
+****
+For each of the following drumbeat strings, try clapping on the zeros. Then listen to the corresponding audio and verify if you were right. This exercise will help you understand how the drumbeat strings work.
+****
+
+Here are some examples of 1-measure beat strings:
+
+Quarter notes: `"0\+++0+++0\+++0+++"`
+(read: "1, 2, 3, 4")
+
+++++
+audioMedia/beatString1.mp3
+++++
+
+Eighth notes: `"0+0+0+0+0+0+0+0+"`
+(read: "1 and 2 and 3 and 4")
+
+++++
+audioMedia/beatString11.mp3
+++++
+
+Sixteenth notes: `"0000000000000000"`
+(that's very fast, depending on the tempo)
+
+++++
+audioMedia/beatString12.mp3
+++++
+
+`"0-0-0---0-0-0---"`
+(read: "1 and 2, 3 and 4")
+
+++++
+audioMedia/beatString2.mp3
+++++
+
+`"0---0---0-0-0---"`
+(read: "1, 2, 3 and 4")
+
+++++
+audioMedia/beatString3.mp3
+++++
+
+`"0---0---0---0000"`
+(read: "1, 2, 3, 4 e and a")
+
+++++
+audioMedia/beatString4.mp3
+++++
+
+{nbsp} +
+
+////
+ADDITIONAL VIDEO TO BE ADDED
+See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+video revamping tab
+////
+
+[[makebeat]]
+=== The `makeBeat()` function
+
+Now let's see how you can make your own beat. Here we use the term "beat" as a shorthand for drumbeat: a repeated rhythmic pattern of percussive sounds. We will use the `makeBeat()` function, with 4 arguments:
+
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
+
+Let's see more details with this video:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12py]]
+video::./videoMedia/3_3_makebeat_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12js]]
+video::./videoMedia/3_3_makebeat_js.mp4[]
+
+Here is the example shown in the video:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-multi-beat.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-multi-beat.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new `beatString1` variable, a 16-character string with the characters `"0"`, `"+"`, and `"-"`.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
+Please note that:
+
+. You should assign your variables with the `=` symbol before using them.
+. Just like `fitMedia()`, the `makeBeat()` function starts with a lowercase letter (`m`) and has an uppercase letter in the middle (`B`).
+. Just like `fitMedia()`, the `makeBeat()` function has 4 parameters separated by commas.
+
+When you hear your music, if you don't like your first version, tweak your beat to make it sound better and better, until you like what you have.
+****
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. You can either play them simultaneously, on two different tracks, or one after the other on one single track.
+****
+
+[[beatsandgenres]]
+=== Create a beat based on your musical genre
+
+Now that you've started working with `makeBeat()` and beat strings, let's explore some basic beat patterns that you can use.
+You've learned that a musical genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Similarly, some genres have signature beat patterns. Below are some examples:
+
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
+
+Here is the corresponding code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-examples-of-beats.js.txt[]
+----
+
+[[chapter3summary]]
+=== Chapter 3 Summary
+
+* In EarSketch, 1 measure is divided into 4 beats, or 4 quarter notes. 1 beat is divided into 4 sixteenth notes.
+* *Variables* create a space in computer memory to store data.
+* You first need to assign the value (data) to the variable name using the sign `=`. Then you can use the variable by writing its name in the code.
+* A *string* is a data type that consists of a series of characters encapsulated by single or double quotes.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Strings are used with the `makeBeat()` function to create rhythmic patterns in EarSketch. `makeBeat()` takes a beat string to define each sixteenth note of its pattern. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` takes four arguments:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these options is a string?
+
+[answers]
+* "Five"
+* 5
+* FIVE
+* Five
+--
+
+[question]
+--
+What does "0" represent in a beat pattern string?
+
+[answers]
+* Start playing the clip
+* Rest
+* Extend the clip
+* End the clip
+--
+
+[question]
+--
+In EarSketch, one measure is...
+
+[answers]
+* 4 beats long
+* 4 sub-beats long
+* 16 beats long
+* 1 quarter note
+--
+
+[question]
+--
+One sixteenth note is...
+
+[answers]
+* a quarter of a quarter note
+* half a beat
+* a quarter of a measure
+* 1 measure
+--
+
+[question]
+--
+To use the `makeBeat()` function, what is the order of parameters you need to provide?
+
+[answers]
+* clip name, track, start measure, beat string
+* tempo, track, start measure, end measure
+* clip name, start measure, end measure, beat string
+* beat string, track, start measure, clip name
+--
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/haw/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..6788ccea1
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // This is the "boom" sound.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/haw/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..39b8de864
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # This is the "boom" sound.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # This is the "ts" sound.
+
+# Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/haw/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/haw/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/haw/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..2bbded58b
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Setup
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/haw/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..02f305a40
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-variables.js.txt b/src/locales/haw/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..892e9ee9e
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Setup
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/add-beats-variables.py.txt b/src/locales/haw/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..615531008
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..b47ffdbce
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..8bfd9ef2b
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..f17f7606e
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..2bb8b3f8e
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/haw/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/haw/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..fe86e34c5
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Setup
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..5e0318ee0
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..b193b59d7
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Setup
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..7c13d7605
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Setup
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..fc4ac0026
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Setup
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..02b9bf3fd
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/haw/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/haw/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/haw/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..5393649b3
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Setup
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/haw/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..e7bcaac25
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-arrays.js.txt b/src/locales/haw/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..6f979e08f
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/haw/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..fc1a83742
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/haw/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..35d2a3f43
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/haw/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/haw/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/haw/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..c3be55257
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/haw/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..ddb76404f
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-list.py.txt b/src/locales/haw/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c6cfcd632
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/haw/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..0ccfffc88
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Setup
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/haw/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..9747b5b4a
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/haw/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..81e2dbe01
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Setup
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/haw/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dae36a455
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/haw/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..5fbe4a7ac
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Setup
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/haw/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..91f9bf807
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..1aaddaf46
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..3c2ae73a2
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..cd446e98c
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Setup
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..ca104ee90
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..a639ba4f0
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..0da37e8be
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..d123caa9a
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Setup
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..b0902254f
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..7221572eb
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..1b2cc9748
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..f5b833522
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Setup
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/haw/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..00ff28b70
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/haw/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..013470826
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Setup
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/haw/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/haw/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..8979b5185
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Setup
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/haw/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/haw/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..02ab97eb8
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/haw/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..ce6ff834d
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/haw/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..998a9d803
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/haw/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..c735d5b8f
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/haw/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..687c5da0f
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Setup
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/haw/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..d1fb96a5c
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/haw/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/haw/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/haw/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..93ca1ae9d
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Setup
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/haw/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..ef85ce675
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Setup
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/haw/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..67ba71708
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Setup
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/haw/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..d7cf9db54
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/haw/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/haw/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/haw/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/haw/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..1f9f0fea3
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..64a5b22b0
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/haw/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/haw/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/haw/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/haw/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..91f3bdf73
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/haw/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..95b76a723
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/haw/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..355a11de2
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/haw/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..f15821b9e
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/haw/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..dfe4c8900
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/haw/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..903928096
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Setup
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/haw/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..c5595e80f
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..79b65068e
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Setup
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..9d1438f4b
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..a0f162eeb
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..14b374cc9
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..9d8960e5c
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Setup
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..b2ac152d1
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..479e0e3fd
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..98ff5f56b
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/your-first-song-comments.js.txt b/src/locales/haw/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..d25a49cec
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Setup
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/haw/v2/code-examples/your-first-song-comments.py.txt b/src/locales/haw/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..a077c3b76
--- /dev/null
+++ b/src/locales/haw/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/haw/v2/custom-functions.adoc b/src/locales/haw/v2/custom-functions.adoc
new file mode 100644
index 000000000..748232c60
--- /dev/null
+++ b/src/locales/haw/v2/custom-functions.adoc
@@ -0,0 +1,285 @@
+[[customfunctionssongstructure]]
+== Custom Functions and Song Structure
+
+:nofooter:
+
+The song structure is the song's organization over time. The goal is to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own function, custom functions, to structure your songs!
+
+[[asongsstructure]]
+=== A song's structure
+
+:nofooter:
+
+A song can be divided into *sections*. A section is made up of several measures (musical time units), and it expresses an idea or feeling. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
+
+A common and simple *form*, or song structure, is ABA. A and B are two different sections, for example chorus and verse. The B section adds variety, while returning to the A section invokes familiarity. The code below creates an ABA form. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
+
+[[imediau2sections_052016png]]
+.An ABA form within the EarSketch DAW
+[caption="Figure 9.2: "]
+image::../media/U2/sections_052016.png[Alt Text]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Select a song that you like. Listen to it and try to notice the different sections. Can you tell when the musicians change sections? How many times do you hear the chorus and verse? What kind of contrasts can you observe? Share your example with your neighbor.
+****
+
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
+
+[[creatingyourcustomfunctions]]
+=== Create your custom functions
+
+In the previous example with the ABA song, the code is large, and the code is repeated for the second A section. There is a way to be more concise, thanks to *custom functions*! We will define a function that will represent section A, then call the function twice.
+
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. Here is how you would define section A:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-untitled1.js.txt[]
+----
+
+. `sectionA()` is the name we chose for our function. You can choose any name you like. Try to name your function in a descriptive way so your code is easier to read.
+. The instructions are the *body* of the function. They are indented.
+
+.PRACTICE
+****
+Paste this code in a new script, and run it. You should see that your DAW remains empty.
+That's because you need to *call* a function to use it.
+To call your function, add the line `sectionA()`, unindented, after your function definition. When running the code, you should see section A in your DAW
+****
+
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. To remedy this issue, we will create *parameters* for our function.
+
+.PRACTICE
+****
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. When you call your function, add the parameters `1` and `5` between the parentheses. Run the code to make sure there is no error.
+1. Add a second function call, this time with the parameters `9` and `13`. Run the code to make sure there is no error.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
+****
+
+Here is what your code could look like:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+----
+
+//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
+
+[role="curriculum-python curriculum-mp4"]
+[[video93py]]
+video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video93js]]
+video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
+
+[[transitionstrategies]]
+=== Transition Strategies
+
+Now that you know how to create custom functions to structure your song, let's look at transitions. *Transitions* help one section smoothly go into the next. They can connect verse and chorus, build up to a drop, mix between tracks (DJing), or change keys. The goal of a transition is to grab the listener's attention and let them know a change is about to occur.
+
+Following are some popular strategies for creating musical transitions:
+
+. *Crash Cymbal*: Placing a crash cymbal on the first beat of a new section.
+. *Drum Fill*: A rhythmic variation to fill the gap before a new section.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Melody Variation*: Introducing a variation of the chords, bass line, or melody before the new section. Often, a folder within the EarSketch sound library contains variations of a similar riff.
+. *Riser*: A note or noise that increases in pitch. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. You can use the search term "riser" in the Sound Browser. A reversed crash cymbal can be used as a riser, like YG_EDM_REVERSE_CRASH_1.
+. *Snare Roll*: A sequence of repeated snare hits, with increasing density, pitch, or amplitude. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping*: Repeating a short segment of melody before a new section.
+. *Crossfading*: Decreasing the volume of one section while increasing the volume of a new section.
+. *Anacrusis*: When the melody of the new section starts a couple beats early.
+
+.PRACTICE
+****
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. You can work in pairs. Once you've thought about it, you can have a look at the examples below.
+
+The transition should be placed one or two measures before the new section. You can use several transition techniques at the same time.
+****
+
+Drum fills:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+----
+
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. An example is shown below.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+----
+
+The next example uses multiple risers and a crash cymbal during the transition.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
+----
+
+{nbsp} +
+
+[[yourfullsong]]
+=== Your full song
+
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. Functions are one kind of abstraction used in computer science. They pack multiple statements into one tool so they can be easily referred to. Abstractions can make the form of a program clearer.
+
+.PRACTICE
+****
+Let's create a full song using all the tools you've discovered in EarSketch! Here is a suggestion of how to work, but you can adapt it as you like:
+
+. Choose a theme for your song. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. Then select a simple structure.
+. And finally, start coding! Start with some `fitMedia()` functions to select sounds.
+. Use `makeBeat()` to add some percussion.
+. You can upload your own sounds.
+. Use `for` loops to reduce repetition in your code.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
+. Add one or several conditional statements.
+. Make sure you use variables to store some information such as sound constants.
+. Make sure you use comments to explain what you are doing.
+. Don't forget to regularly run your code and listen to your song. This will help you modify it until you like the sound of it.
+. Choose a name for your song.
+****
+
+Here is an example of a full song:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+----
+
+In this example, we have used a `for` loop inside a custom function! We have used parameters of the function (`start` and `end`) inside the for loop.
+
+[[chapter7summary]]
+=== Chapter 7 Summary
+
+* *Sections* are related musical units consisting of multiple measures. Each expresses an idea or feeling.
+* *Transitions* are passages of music used to connect consecutive musical sections.
+* The structure and variety found within a song is known as its *form*. A common musical form is A-B-A.
+* *Custom functions* are unique functions written by the programmer to accomplish a specific task. You have to create a custom function to be able to call it. You can create as many parameters as you want.
+* An *abstraction* is the bundling of ideas to form a single, often less complex, concept. Functions are an example of abstraction.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these is NOT an example of a musical section?
+
+[answers]
+* Drums
+* Intro
+* Verse
+* Chorus
+--
+
+[question]
+--
+What is an abstraction?
+
+[answers]
+* A bundling of ideas to form a single concept
+* A variety of sounds throughout sections
+* Parts of a song that are related, but also are distinct from each other
+* A statement that returns a value to the function call
+--
+
+[role="curriculum-python"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
+* `myFunction(2, 5)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
+* `myFunction(2, 5)`
+--
+
+[question]
+--
+Which of these is NOT an example of a transition?
+
+[answers]
+* Melody Consistency
+* Crash Cymbal
+* Riser
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/haw/v2/data-structures.adoc b/src/locales/haw/v2/data-structures.adoc
new file mode 100644
index 000000000..392a3b3e5
--- /dev/null
+++ b/src/locales/haw/v2/data-structures.adoc
@@ -0,0 +1,497 @@
+[[getorganizedwithdatastructures]]
+== Data Structures
+
+:nofooter:
+
+[role="curriculum-python"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called lists, and a new functionality of `makeBeat()`.
+
+[role="curriculum-javascript"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called arrays, and a new functionality of `makeBeat()`.
+
+[[datastructures]]
+=== What is a Data Structure
+
+[role="curriculum-python"]
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-javascript"]
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
+----
+
+[role="curriculum-python"]
+If you have replaced variables with a list, how will you reference the content of the list? We use indices. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+[role="curriculum-javascript"]
+If you have replaced variables with an array, how will you reference the content of the array? We use indices. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+.PRACTICE
+****
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-list.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-arrays.js.txt[]
+----
+
+//.The EarSketch Share window for collaboration (Let Others Edit)
+
+//[caption="Figure 21.4.2: "]
+
+image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
+
+[role="curriculum-python"]
+We've seen that `list[index]` will reference an element of the list. This can also be used to modify an element of the list. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+[role="curriculum-javascript"]
+We've seen that `array[index]` will reference an element of the array. This can also be used to modify an element of the array. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+.PRACTICE
+****
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. You can use the track number as the counter.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
+****
+
+Below is an example. You can have a look in the console to see what is printed when you run the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
+----
+
+[role="curriculum-python"]
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-javascript"]
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-additive-introduction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-additive-introduction.js.txt[]
+----
+
+{nbsp} +
+
+[[usingdatastructureswithmakebeat]]
+=== Use Data Structures with `makeBeat()`
+
+[role="curriculum-python"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
+
+[role="curriculum-javascript"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
+
+[role="curriculum-python"]
+* Like lists, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[role="curriculum-javascript"]
+* Like arrays, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[cols="h,^,^,^,^,^,^,^,^,^"]
+|===
+|Character
+|E
+|a
+|r
+|S
+|k
+|e
+|t
+|c
+|h
+
+|Index
+|0
+|1
+|2
+|3
+|4
+|5
+|6
+|7
+|8
+|===
+
+[role="curriculum-python"]
+* You can concatenate lists together like you do with strings. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
+
+[role="curriculum-javascript"]
+* You can concatenate arrays together like you do with strings. We use the `concat` *method*. A method is similar to a function as it has parentheses which contain parameters. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
+
+[role="curriculum-python"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
+
+[role="curriculum-javascript"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your lists.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your arrays.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+Here is an example of a solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
+----
+
+This is an example of how you can use string operations with `makeBeat()`:
+
+[role="curriculum-python curriculum-mp4"]
+[[video13py]]
+video::./videoMedia/013-03-Substrings-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video13js]]
+video::./videoMedia/013-03-Substrings-JS.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-operations.js.txt[]
+----
+
+[role="curriculum-python"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-javascript"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Copy the code example in chapter 3.4 for beats by genre. Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
+****
+
+Here is the solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-examples-of-beats.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. You can refer to the video in chapter 3.4 for beats by genre. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
+****
+
+{nbsp} +
+
+[[evaluatingcorrectness]]
+=== Evaluate Correctness
+
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Here are some elements that you can check:
+
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Here are some questions that can help you make your code more concise:
+** Did I copy/paste function calls several times in a row? If so, simplify with a loop!
+** Am I reusing any blocks of code? If so, put them in a function!
+** Are there sound constants or mathematical expressions that I use repeatedly throughout my code? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. If your peers are getting lost or confused by your code, it is probably unclear. Here are some questions to help you make your code clear:
+** Are the names of my variables and functions descriptive? If not, rename them.
+** Have I used comments to explain each block of code and any potentially confusing lines of code?
+** Have I used computational structures like custom functions and loops to help organize my code?
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
+
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. When giving feedback:
+
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
+
+Likewise, when receiving feedback:
+
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. This will allow your peers to provide feedback that is most helpful to you.
+* *Listen* - Wait to respond until your peer has finished speaking. Be attentive to the information your peer is conveying. Comment your code based on their feedback. These comments can be useful when revising.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in a list.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in an array.
+****
+
+[[chapter9summary]]
+=== Chapter 9 Summary
+
+[role="curriculum-python"]
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Items stored within a list, or elements, can be any data type.
+* Like strings, list elements get assigned an index. List indices start at 0.
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[role="curriculum-javascript"]
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
+* Like strings, array elements get assigned an index. Array indices start at 0.
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following operations is used to join lists/arrays?
+
+[answers]
+* Concatenation
+* Slicing
+* Combination
+* Addition
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the index number of the first element of a list in Python?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What does `len(myList)` return?
+
+[answers]
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
+[answers]
+* `listA + listB`
+* `listA ++ listB`
+* `listA and listB`
+* `listB + listA`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How can you get a list from oldList without the first and last elements?
+
+[answers]
+* `oldList[1:len(oldList) - 1]`
+* `oldList[1:len(oldList)]`
+* `oldList[0:len(oldList)]`
+* `oldList[2:len(oldList - 1)]`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the index number of the first element of an array in Javascript?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What does `myArray.length` return?
+
+[answers]
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
+[answers]
+* `arrayA.concat(arrayB)`
+* `arrayA.concatenate(arrayB)`
+* `arrayB.concat(arrayA)`
+* `arrayB.concatenate(arrayB)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How can you get an array from `oldArray` without the first and last elements?
+
+[answers]
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
+--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/haw/v2/effects-and-envelopes.adoc b/src/locales/haw/v2/effects-and-envelopes.adoc
new file mode 100644
index 000000000..92b9ab79b
--- /dev/null
+++ b/src/locales/haw/v2/effects-and-envelopes.adoc
@@ -0,0 +1,321 @@
+[[effectsandenvelopes]]
+== Effects and Envelopes
+
+:nofooter:
+
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
+
+[[effectsinearsketch]]
+=== Use Effects in EarSketch
+
+:nofooter:
+
+*Effects* allow us to change qualities of sounds. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
+
+[role="curriculum-python curriculum-mp4"]
+[[video4py]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video4js]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
+
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
+
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+
+.PRACTICE
+****
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
+****
+
+Here is an example below:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
+----
+
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
+
+No effect:
+
+++++
+audioMedia/reference.mp3
+++++
+
+Delay effect:
+
+++++
+audioMedia/delay2.mp3
+++++
+
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
+
+.PRACTICE
+****
+. Read about the delay effect in the list of effects chapter here: <>
+. Then run the code below and listen to the music without effects
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
+----
+
+{nbsp} +
+
+[[functionsandmoreeffects]]
+=== Functions and more effects
+
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Note that the function names always start with a lower-case letter, and are often a verb. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
+
+[role="curriculum-python"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+[role="curriculum-javascript"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
+
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
+
+Now, let's play more with the `setEffect()` function. The following video shows how to use some effects:
+
+////
+VIDEO IS BEEING MADE
+more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+("videos revamping" tab)
+////
+
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
+
+Listen to the clips below to hear the result of adding reverb to a track:
+
+No effect:
+
+++++
+audioMedia/reverbReference.mp3
+++++
+
+Reverb effect:
+
+++++
+audioMedia/reverbEffect.mp3
+++++
+
+{nbsp} +
+
+.PRACTICE
+****
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
+****
+
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
+
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
+
+*Envelopes* allow us to define how an effect changes over time.
+
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
+
+[[envelopepoints]]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
+image::../media/U2/NewEnvelope.png[Alt Text]
+
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
+
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
+
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
+
+Here is an example of fade in:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
+----
+
+Now watch this video for other envelope examples
+
+[role="curriculum-python curriculum-mp4"]
+[[video5b]]
+video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript curriculum-mp4"]
+video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new song. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
+****
+
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+----
+
+And here is an example of fade in and fade out on all the tracks:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter5summary]]
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does an effect allow you to do in EarSketch?
+
+[answers]
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
+--
+
+[question]
+--
+Which of these is NOT a `setEffect()` argument?
+
+[answers]
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
+--
+
+[question]
+--
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
+[answers]
+* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
+* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
+* `fitMedia(DELAY, 3, DELAY_TIME, 50.0)`
+* `setEffect(50, DELAY_FEEDBACK, 1)`
+--
+
+[question]
+--
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
+[answers]
+* Clip Length
+* Start Value
+* Track Number
+* Effect
+--
+
+[question]
+--
+What would the following `setEffect()` function do?
+
+[source,python]
+----
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
+----
+
+[answers]
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/haw/v2/get-user-input.adoc b/src/locales/haw/v2/get-user-input.adoc
new file mode 100644
index 000000000..27edbca84
--- /dev/null
+++ b/src/locales/haw/v2/get-user-input.adoc
@@ -0,0 +1,391 @@
+[[getuserinput]]
+== Get User Input
+
+:nofooter:
+
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. For that, we'll look at return statements and the `readInput()` function.
+
+[[returnstatement]]
+=== Return Statement
+
+Watch this video first:
+
+[role="curriculum-python curriculum-mp4"]
+[[video131py]]
+video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video131js]]
+video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
+
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. B. signals the function to stop. If you have any statements after the `return` keyword, they will be ignored.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
+
+Here is a code example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements.js.txt[]
+----
+
+With the return statement, the complete control flow for a function looks like this:
+
+[[return]]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
+image::../media/U2/Return.png[Alt Text]
+
+.PRACTICE
+****
+Create a function that will implement a musical section with:
+
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
+
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
+
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
+
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
+
+Then call the function at different measures with different variations.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-conditional-statement.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-conditional-statement.js.txt[]
+----
+
+{nbsp} +
+
+[[userinput]]
+=== Get User Input
+
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. The `readInput()` function returns what the user types there.
+
+For example, copy the following code in a new script, and run it:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-untitled1.js.txt[]
+----
+
+We might need to convert the returned user input into a different data type. Here are useful functions:
+
+[role="curriculum-python"]
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
+
+[role="curriculum-javascript"]
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
+
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-1.js.txt[]
+----
+
+Here is another example of what you can do with user input.
+
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ask for a user input to modify something in your song.
+
+Here are ideas of tools you can use:
+
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
+****
+
+{nbsp} +
+
+[[booleanlogic]]
+=== Boolean Logic
+
+We will now combine boolean logic and user input for another example of user interaction.
+
+[role="curriculum-python"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
+
+[role="curriculum-javascript"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
+
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
+
+[role="curriculum-python"]
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
+
+[role="curriculum-javascript"]
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
+
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `True` or `False`?
+
+* `not True`
+* `True and False`
+* `True or False`
+* `True and True`
+* `(True and False) or True`
+* `True and not False`
+* `not (False or False)`
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `true` or `false`?
+
+* `!true`
+* `true && false`
+* `true || false`
+* `true && true`
+* `(true && false) || true`
+* `true && !false`
+* `!(false || false)`
+****
+
+Use the following code to print the answers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
+----
+
+Here is a reminder of boolean creation, and some examples of boolean operations:
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+
+.PRACTICE
+****
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-operations.js.txt[]
+----
+
+{nbsp} +
+
+.CHALLENGE
+****
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
+****
+
+{nbsp} +
+
+[[chapter8summary]]
+=== Chapter 8 Summary
+
+[role="curriculum-python"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[role="curriculum-javascript"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following would be considered an example of data type conversion?
+
+[answers]
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Using `readInput()` to ask a user for a genre.
+* Producing a Boolean through a comparison operator.
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+not (True and (4 > 5))
+----
+
+[answers]
+* `True`
+* `5`
+* `4`
+* `False`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+!(true && (4 > 5));
+----
+
+[answers]
+* `true`
+* `4`
+* `false`
+* `5`
+--
+
+[question]
+--
+Which of the following is an example of concatenation?
+
+[answers]
+* `x = beatstring1 + beatstring2`
+* `x = beatstring1.beatstring2`
+* `x = (beatstring1, beatstring2)`
+* `x = beatstring1[beatstring2]`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How would you obtain the boolean True with the booleans True and False?
+
+[answers]
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How would you obtain the boolean true with the booleans true and false?
+
+[answers]
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/haw/v2/getting-started.adoc b/src/locales/haw/v2/getting-started.adoc
new file mode 100644
index 000000000..c90f659c1
--- /dev/null
+++ b/src/locales/haw/v2/getting-started.adoc
@@ -0,0 +1,386 @@
+[[getstartedwithearsketch]]
+== Getting Started with EarSketch
+
+:nofooter:
+
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
+
+[[discoverearsketch]]
+=== Discover EarSketch
+
+:nofooter:
+
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
+
+////
+TODO: upload video
+////
+
+As you become familiar with EarSketch these are the main panels.
+
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
+
+{nbsp} +
+
+_What is a DAW?_
+
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
+
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
+
+EarSketch is DAW that allows you to create music by writing code.
+
+Here is how to make full use of the DAW:
+
+[role="curriculum-mp4"]
+[[video1b]]
+video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-intro-script.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-intro-script.js.txt[]
+----
+
+{nbsp} +
+
+[[createanewscript]]
+=== Create your first script!
+
+Let's see how to create a script from scratch.
+
+. *Create.* In the editor tabs, click the white "+" icon.
++
+If this is your first script, click the large blue text "Click here to create a new script!"
++
+[[newscriptplus]]
+.Create a new script, open scripts
+[caption="Figure 1.2.1: "]
+image::../media/U1P1/NewScriptPlus.png[Alt Text]
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
++
+[[newscriptpromptpy]]
+.The create a new script dialog box
+[role="curriculum-python"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
+[[newscriptpromptjs]]
+.The create a new script dialog box
+[role="curriculum-javascript"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+
+*_What is a programming language?_*
+
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
+
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
+
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
+
+[[fitmedia]]
+=== The `fitMedia()` function
+
+Now that you have created your first script, let's start working on your music!
+
+Watch this video to see how to add an audio clip to your song:
+
+[role="curriculum-python curriculum-mp4"]
+[[video110py]]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video110js]]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
+
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
+
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
+
+////
+OPTIONAL
+////
+
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
+
+////
+END OF OPTIONAL
+////
+
+////
+OPTIONAL
+////
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia.js.txt[]
+----
+
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using sounds that you like:
+
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
+
+For each exercise, you can have your neighbour listen to your song.
+
+If you have errors when running your code, check out the next chapter about debugging.
+****
+
+[[debugging]]
+=== Debug your code
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. You can use debugging strategies, using the console.
+
+[role="curriculum-python curriculum-mp4"]
+[[video3py]]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video3js]]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+////
+OPTIONAL
+////
+
+What are the different types of errors?
+
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
+
+////
+END OF OPTIONAL
+////
+
+Here are some common errors:
+
+[role="curriculum-python"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
+
+[role="curriculum-javascript"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
+
+Time to practice!
+Find the five errors in the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-finding-errors.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-finding-errors.js.txt[]
+----
+
+////
+OPTIONAL
+////
+
+Here is the answer
+
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
+
+////
+END OF OPTIONAL
+////
+
+Take a look at <> for a description of different error types and what you can do to prevent them.
+
+////
+TODO: when options are ready, modify the link
+////
+
+[[chapter1summary]]
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a panel in the EarSketch workspace?
+
+[answers]
+* The effects browser
+* The code editor
+* The DAW
+* The console
+--
+
+[question]
+--
+How many parameters do you need for your `fitMedia()` function?
+
+[answers]
+* 4
+* 6
+* 2
+* 3
+--
+
+[question]
+--
+One script corresponds to...
+
+[answers]
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
+--
+
+[question]
+--
+What is a measure?
+
+[answers]
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
+--
+
+[question]
+--
+Which of the following is NOT a common type of error found in code?
+
+[answers]
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
+--
+
+[question]
+--
+Where in the EarSketch workspace can you get information about your bugs?
+
+[answers]
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/haw/v2/legacy.adoc b/src/locales/haw/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/haw/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/haw/v2/loops-and-layers.adoc b/src/locales/haw/v2/loops-and-layers.adoc
new file mode 100644
index 000000000..52974c50d
--- /dev/null
+++ b/src/locales/haw/v2/loops-and-layers.adoc
@@ -0,0 +1,414 @@
+[[loopandlayers]]
+== Loops and Layers
+
+:nofooter:
+
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. We will also cover musical layers and textures as well as some debugging tips.
+
+[[forloops]]
+=== `for` loops
+
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
+
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
+
+////
+add new video
+more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=0
+in the "revamping videos" tab (includes link to script)
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
+----
+
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
+
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+
+[[loop-components-PY]]
+.The basic components of a for loop
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.The basic components of a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
+.PRACTICE
+****
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
+[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `print()` call.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-printing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-printing.js.txt[]
+----
+
+Here, you will see in your console the following lines:
+
+----
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
+3
+ok
+4
+ok
+----
+
+and it ends there since measure has to be lower than 5, so 4 is your limit.
+
+[[controlflow]]
+=== Control Flow
+
+Here is another example of how you can use `for` loops:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12bpy]]
+video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12bjs]]
+video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
+
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-no-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-no-loops.js.txt[]
+----
+
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-loops.js.txt[]
+----
+
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
+
+A loop is a *control flow statement*, which changes the order. At the end of a loop body, it jumps back to the top of the loop.
+
+This animation shows how the control flow moves in a `for` loop, and how the value of the loop counter changes on each *iteration*, or repetition of the loop body:
+
+[[loop-py]]
+.Stepping through a for loop
+[role="curriculum-python"]
+[caption="Figure 4.2.1: "]
+image::../media/U1P2/LoopPy_updated.gif[Alt Text]
+
+.Stepping through a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.2.1: "]
+[[loop-js]]
+image::../media/U1P2/LoopJS_updated.gif[Alt Text]
+
+////
+Although it is valid syntax, a `*monospace bold phrase*` causes a build error in AsciidocFX. Might be something to do with DocBook conversion. No bold for now. May see how ES handles it in the future.
+
+BMW
+////
+
+One last interesting thing about `for` loops is incrementation.
+
+[role="curriculum-python"]
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
+
+[role="curriculum-javascript"]
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-incrementing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-incrementing.js.txt[]
+----
+
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. This means measure is now equal to its former value plus one. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
+
+[role="curriculum-python"]
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[role="curriculum-javascript"]
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). The following is a shorthand method for incrementing (or decrementing) a counter:
+
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[[debuggingtips]]
+=== Debugging Tips
+
+Programming is not only writing code. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
+
+[role="curriculum-python"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+[role="curriculum-javascript"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+Below, we walk through an example of printing variables to help debug a script:
+
+[role="curriculum-python curriculum-mp4"]
+[[video15py]]
+video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video15js]]
+video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
+
+You've seen a list of potential errors in Chapter 1. Here are some other errors that you might encounter:
+
+[role="curriculum-python"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+[role="curriculum-javascript"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+Take a look at <> for a full description of different error types and what you can do to prevent them.
+
+[[musicaltips]]
+=== Musical tips
+
+Now that you have many tools to create your music, like `fitMedia()`, `makeBeat()` and `for` loops, we will look at musical ideas.
+
+Let's start with the *key* of your song:
+
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
+
+++++
+audioMedia/MajorMinor.mp3
+++++
+
+Now let's talk about the different types of tracks you can have. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
+
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
+
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
+
+.PRACTICE
+****
+Create a complete song with:
+
+* A theme (please mention your chosen theme in your commented intro in the code)
+* The `fitMedia()` and `makeBeat()` functions
+* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
+* At least four tracks
+* At least sixteen measures
+* At least one uploaded sound
+* Comments and variables to organize your code
+
+Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
+****
+
+{nbsp} +
+
+[[chapter4summary]]
+=== Chapter 4 Summary
+
+[role="curriculum-python"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[role="curriculum-javascript"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a component of a `for` loop?
+
+[answers]
+* Loop interpreter
+* Loop Counter
+* Loop Body
+* Loop Range
+--
+
+[question]
+--
+Which of the following is NOT a good use of loops in a musical composition?
+
+[answers]
+* Creating a beat pattern than never repeats
+* Placing musical clips on every third measure
+* Repeating a beat on several consecutive measures
+* Placing musical clips on odd measures
+--
+
+[question]
+--
+Which of the following is NOT a recommended technique for debugging?
+
+[answers]
+* Copying and pasting code into Google
+* Printing variable values to the console
+* Looking at error lines identified in the console
+* Asking others for help
+--
+
+[question]
+--
+Which of the following is NOT something that can be printed to the console?
+
+[answers]
+* Code Comments
+* Strings
+* Mathematical Expressions
+* Variables
+--
+
+[question]
+--
+____ is a quality of sound that determines how high or low it sounds.
+
+[answers]
+* Pitch
+* Tempo
+* Rhythm
+* Loudness
+--
\ No newline at end of file
diff --git a/src/locales/haw/v2/mixing-with-conditionals.adoc b/src/locales/haw/v2/mixing-with-conditionals.adoc
new file mode 100644
index 000000000..d41a2af7c
--- /dev/null
+++ b/src/locales/haw/v2/mixing-with-conditionals.adoc
@@ -0,0 +1,363 @@
+[[mixingwithconditionnals]]
+== Mix with Conditionals!
+
+:nofooter:
+
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
+
+[[analyzetrack]]
+=== Use `analyzeTrack()`
+
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Import and run the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+----
+
+You can read in your console that the printed loudness is 0.10306035109110138.
+
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
+
+The `analyzeTrack()` function takes 2 arguments:
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
+
+.PRACTICE
+****
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
+. Add a second track and use the `analyzeTrack()` function to print its loudness in the console. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
+****
+
+The parameter for `analyzeTrack()` can either be `RMS_AMPLITUDE`, to evaluate the loudness, or `SPECTRAL_CENTROID` to analyze the brightness of the sound. We'll focus on analyzing loudness in this chapter.
+
+[[booleansandcomparisons]]
+=== Booleans and comparisons
+
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
+
+[role="curriculum-python"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `True` and `False`. `True` and `False` start with a capital letter and do not have quotes.
+
+[role="curriculum-javascript"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `true` and `false`. `true` and `false` start with a lower-case letter and do not have quotes.
+
+[role="curriculum-python"]
+--
+To create a boolean, you can either initialize a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|==
+|is equal to
+
+|!=
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-javascript"]
+--
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|===
+|is equal to
+
+|!==
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
+
+// this video will be cut at 2' to delete the section about boolean operators//
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `true` if the first track is louder than the second track, and `false` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+----
+
+[role="curriculum-python"]
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
+
+[role="curriculum-javascript"]
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
+
+[[conditionalstatements]]
+=== Conditional Statements
+
+What is a conditional statement? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
+
+Below is an example of conditional statement, note the similarity with a for loop:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
+----
+
+.PRACTICE
+****
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+----
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
+----
+
+[[mixingyourtracks]]
+=== Mix your tracks
+
+Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
+****
+
+Let's review some vocabulary:
+
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
+
+Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter6summary]]
+=== Chapter 6 Summary
+
+[role="curriculum-python"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `True` and `False`.
+* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
+
+[role="curriculum-javascript"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `true` and `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `true` or `false`.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following elements is a boolean?
+
+[answers]
+* `5+4 === 5`
+* `measure = 1`
+* `2<3<4`
+* `False()`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[question]
+--
+What is mixing?
+
+[answers]
+* adapting the volume of each track so they sound well balanced
+* adapting the pitch of each track so they sound well balanced
+* adding a fade in
+* adding a fade out
+--
+
+[question]
+--
+How many conditions can you check in a conditional statement?
+
+[answers]
+* any number of conditions
+* 1 condition
+* 2 conditions
+* 3 conditions
+--
\ No newline at end of file
diff --git a/src/locales/haw/v2/optional.adoc b/src/locales/haw/v2/optional.adoc
new file mode 100644
index 000000000..1d412d2ad
--- /dev/null
+++ b/src/locales/haw/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/haw/v2/reference.adoc b/src/locales/haw/v2/reference.adoc
new file mode 100644
index 000000000..d08f7ea27
--- /dev/null
+++ b/src/locales/haw/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effects, Errors, and EarSketch Functions
+
+:nofooter:
+
+In this unit you will find references to all effects, errors and EarSketch API functions.
\ No newline at end of file
diff --git a/src/locales/haw/v2/unit-1.adoc b/src/locales/haw/v2/unit-1.adoc
new file mode 100644
index 000000000..7f48189fe
--- /dev/null
+++ b/src/locales/haw/v2/unit-1.adoc
@@ -0,0 +1,18 @@
+[[unit1]]
+== Unit 1: Compose and Add Beats
+
+:nofooter:
+
+In this unit you will learn how EarSketch works, you will place sounds (clips) into your music, debug your code, customize your song, and add beats based on your musical genre.
+
+Anyone (especially you) can learn to program! Like learning a musical instrument, it takes consistent practice to make progress. Don't get discouraged if you get stuck, this is part of the process. Ask for help in your class or look online if needed.
+
+We wish you the best of luck, and before you start here's an example of what you can do with EarSketch:
+
+[role="curriculum-python curriculum-mp4"]
+[[video1livepy]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video1livejs]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-JS.mp4[]
\ No newline at end of file
diff --git a/src/locales/haw/v2/unit-2.adoc b/src/locales/haw/v2/unit-2.adoc
new file mode 100644
index 000000000..d4fd5122b
--- /dev/null
+++ b/src/locales/haw/v2/unit-2.adoc
@@ -0,0 +1,6 @@
+[[unit2]]
+== Unit 2: Loops, Effects, Mixing
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/haw/v2/unit-3.adoc b/src/locales/haw/v2/unit-3.adoc
new file mode 100644
index 000000000..9f3f26d37
--- /dev/null
+++ b/src/locales/haw/v2/unit-3.adoc
@@ -0,0 +1,8 @@
+[[unit3]]
+== Unit 3: Structure your Songs
+
+:nofooter:
+
+Now that you have many tools to create your song, add effects and mix your tracks, we will be looking at the song's structure. We'll be using custom functions for that: these are functions that you will create yourself!
+
+We will also look at user inputs and how they can be embedded in your code to create personalize songs. Finally, we'll see how you can use data structures to simplify your code.
\ No newline at end of file
diff --git a/src/locales/haw/v2/welcome.adoc b/src/locales/haw/v2/welcome.adoc
new file mode 100644
index 000000000..f89bcfba2
--- /dev/null
+++ b/src/locales/haw/v2/welcome.adoc
@@ -0,0 +1,26 @@
+[[welcome]]
+== Welcome Students and Teachers!
+
+:nofooter:
+
+Welcome to EarSketch!
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
+
+*Students*: Continue below to learn more about EarSketch
+
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
+
+[role="curriculum-mp4"]
+[[video0]]
+video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
+
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+Maybe you'll become a legendary music producer or the industry's most sought-after recording engineer! We wish you good luck on your EarSketch journey.
+
+Click on the right arrow at the top of this text to get started.
+
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/haw/v2/your-first-song.adoc b/src/locales/haw/v2/your-first-song.adoc
new file mode 100644
index 000000000..4e9f6aa2f
--- /dev/null
+++ b/src/locales/haw/v2/your-first-song.adoc
@@ -0,0 +1,290 @@
+[[customizeyourfirstsong]]
+== Customize your first song
+
+:nofooter:
+
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
+
+[[settempo]]
+=== The `setTempo()` function
+
+[role="curriculum-python"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+[role="curriculum-javascript"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. To change the tempo, just change the number between the parentheses of the `setTempo()` function. The higher the tempo, the faster your music. You can select a tempo between _45bpm and 220bpm_.
+
+.PRACTICE
+****
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
+****
+
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
+
+[cols="^3*"]
+|===
+|GENRE |BPM |EXAMPLE
+
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
+|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
+|===
+
+.PRACTICE
+****
+. Select one artist you really like and find out what genre they belong to.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
+****
+
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
+
+[[comments]]
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
+
+[role="curriculum-python"]
+In Python, comments are indicated by a line starting with a pound `#` symbol.
+
+[role="curriculum-javascript"]
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
+
+.PRACTICE
+****
+In your current script, write a comment with a description of your song on the first line.
+****
+
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/your-first-song-comments.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/your-first-song-comments.js.txt[]
+----
+
+{nbsp} +
+
+[[uploadingsounds]]
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
+
+You must be logged in to upload sounds.
+
+Let's explore the first three options.
+
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
+
+[role="curriculum-mp4"]
+[[video101rec]]
+video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
+
+.PRACTICE
+****
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
+****
+
+An active computer program is called a *process*.
+
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
+
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
+
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
+
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
+
+Let's examine recording a sound into EarSketch as an example process. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
+
+Check out the following supplementary video:
+
+[role="curriculum-mp4"]
+[[video11cpu]]
+video::./videoMedia/010-02-ProcessesandMemory-PY-JS.mp4[]
+
+////
+END OF OPTIONAL
+////
+
+[[copyright]]
+=== Use Copyright Wisely
+
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
+
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
+
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
+
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
+
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
+
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
+
+[[chapter2summary]]
+=== Chapter 2 Summary
+
+[role="curriculum-python"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[role="curriculum-javascript"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does `setTempo()` allow you to do in EarSketch?
+
+[answers]
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
+--
+
+[question]
+--
+What is the unit for tempo?
+
+[answers]
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
+--
+
+[question]
+--
+What can you use comments for?
+
+[answers]
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
+--
+
+[question]
+--
+Which of the following statements is true?
+
+[answers]
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
+--
+
+[question]
+--
+How do you get a copyright?
+
+[answers]
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
+--
+
+[question]
+--
+What is a music license?
+
+[answers]
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/he/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/he/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/he/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/he/v1/every-effect-explained-in-detail.adoc b/src/locales/he/v1/every-effect-explained-in-detail.adoc
index 460b04b18..3c180f24f 100644
--- a/src/locales/he/v1/every-effect-explained-in-detail.adoc
+++ b/src/locales/he/v1/every-effect-explained-in-detail.adoc
@@ -1,5 +1,6 @@
[[ch_28]]
== הסבר מפורט לכל אפקט
+
:nofooter:
[[bandpass]]
@@ -7,349 +8,713 @@
++++
- עם אפקט:
+ With Effect:
audioMedia/bandpass_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/bandpass_dry.mp3
++++
-`BANDPASS` הוא מסנן שמעביר רק פס של תדרים שניתן לכיוונון. שאר התדרים מונחתים. באמצעות הגבלה של טווח התדרים של הצליל המקורי (הצבת ערך נמוך, יחסית, ב-BANDPASS_WIDTH), מסנן יכול ליצור אפקט מיוחד, כמו צליל "המגאפון" הפופולרי בחלק ממוסיקת הרוק המודרני, או צליל הטלפון או הרמקול הקטן. באמצעות הרחבת טווח התדרים (הצבת ערך גבוה ב-BANDPASS_WIDTH), צלילים הנשמעים "גדולים מדי" במיקס יהפכו קטנים יותר, ויתמזגו טוב יותר עם צלילים אחרים במיקס.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. שאר התדרים מונחתים. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|BANDPASS_FREQ |התדר המרכזי (בהרץ) של חלון התדרים המועברים. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| BANDPASS_FREQ | התדר המרכזי (בהרץ) של חלון התדרים המועברים. | 800.0 | 20.0 | 20000.0
-| BANDPASS_WIDTH | הרוחב (בהרץ) של חלון התדרים המועברים. | 0.5 | 0.0 | 1.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 0.1 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[chorus]]
=== CHORUS
++++
- עם אפקט:
+ With Effect:
audioMedia/chorus_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/chorus_dry.mp3
++++
-`CHORUS` יוצר מספר עותקים של הצליל המקורי השונים מעט בגובה ובזמן, ומעורבלים חזרה לתוך הצליל, ויוצרים אפקט של הרבה קולות המנגנים יחד. בהצבת ערכים קיצוניים לפרמטר, יכולים להישמע צלילים מלאכותיים "דמויי רובוט".
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|CHORUS_LENGTH |משך הזמן (במילישניות) מהצליל המקורי בו הופעל אפקט ה-chorus. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |מספר העותקים של הצליל המקורי. ערכים גבוהים יוצרים אפקט דמוי אנסמבל. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. ערכים נמוכים יוצרים צלילים במחזורים חלקים, בעוד ערכים גבוהים יוצרים אפקט של צלילים רוטטים. |0.5 |0.1 |16.0
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| CHORUS_LENGTH | משך הזמן (במילישניות) מהצליל המקורי בו הופעל אפקט ה-chorus. | 15.0 | 1.0 | 250.0
-| CHORUS_NUMVOICES | מספר העותקים של הצליל המקורי. ערכים גבוהים יוצרים אפקט דמוי אנסמבל. | 1.0 | 1.0 | 8.0
-| CHORUS_RATE | הקצב (בהרץ) בו מחזורי גובה הצליל "רוטטים". ערכים נמוכים יוצרים צלילים במחזורים חלקים, בעוד ערכים גבוהים יוצרים אפקט של צלילים רוטטים. | 0.5 | 0.1 | 16.0
-| CHORUS_MOD | עומק הרטט של גובה הצליל (כלומר, כמה מחזוריות של גובה הצליל בשימוש). ערכים נמוכים יוצרים צליל טבעי יותר, בעוד שערכים גבוהים יוצרים צליל מלאכותי יותר. | 0.7 | 0.0 | 1.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|CHORUS_MOD |עומק הרטט של גובה הצליל (כלומר, כמה מחזוריות של גובה הצליל בשימוש). ערכים נמוכים יוצרים צליל טבעי יותר, בעוד שערכים גבוהים יוצרים צליל מלאכותי יותר. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[compressor]]
=== COMPRESSOR
++++
- עם אפקט:
+ With Effect:
audioMedia/compressor_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/compressor_dry.mp3
++++
-`COMPRESSOR` הוא קומפרסור בסיסי עם שני פרמטרים, המנחית את העוצמה של הצלילים החזקים, ומגביר את העוצמה של הצלילים החלשים. כך נוצר טווח דינמי צר יותר מאשר בצליל המקורי, אשר משמש, לעיתים קרובות, כדי למקסם את הפאנץ' של הצליל המקורי, ולהפחית את הפוטנציאל לתוספת רעש מאוחר יותר.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |רמת העוצמה (ב-dB) מעליה הקומפרסור יתחיל להנחית. |-18.0 |-30.0 |0.0
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| COMPRESSOR_THRESHOLD | רמת העוצמה (ב-dB) מעליה הקומפרסור יתחיל להנחית. | -18.0 | -30.0 | 0.0
-| COMPRESSOR_RATIO | רמת ההנחתה. יחס של 3:1 משמעותו שאם עוצמת הצליל המקורי היא 3dB מעל הסף, אז הצליל אחרי האפקט יהיה 1dB מעל הסף. | 10.0 | 1.0 | 100.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|COMPRESSOR_RATIO |רמת ההנחתה. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[delay]]
=== DELAY
++++
- עם אפקט:
+ With Effect:
audioMedia/delay_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/delay_dry.mp3
++++
-`DELAY` יוצר חזרה דמוית הד של הצליל המקורי. אפקט ה-delay מצרף לצליל המקורי גרסה שקטה יותר ו"מעוכבת" של הצליל המקורי, הנשמעת כמו הד. אחרי ההד הראשון , הוא מצרף הד של ההד (אפילו שקט יותר) והד של ההד של ההד (שקט עוד יותר), וכך הלאה עד שההד דועך. באפקט ה-delay, אנחנו יכולים לשלוט בזמן העובר בין הד להד (זמן העיכוב). אם נקבע את זמן העיכוב בהתאמה לאורך הביט, נוכל ליצור אפקטים ריתמיים.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|DELAY_TIME |אורך הזמן במילישניות (ms) שהערוץ המקורי מעוכב, והזמן בין חזרות עוקבות של העיכוב. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |מספר החזרות היחסי שיוצר האפקט. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| DELAY_TIME | אורך הזמן במילישניות (ms) שהערוץ המקורי מעוכב, והזמן בין חזרות עוקבות של העיכוב. | 300.0 | 0.0 | 4000.0
-| DELAY_FEEDBACK | מספר החזרות היחסי שיוצר האפקט. ערכים גבוהים יותר יוצרים יותר הדים. היזהרו מיותר מדי פידבק! | 0.3- | -120.0 | -1.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 0.5 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[distortion]]
=== DISTORTION
++++
- עם אפקט:
+ With Effect:
audioMedia/distortion_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/distortion_dry.mp3
++++
-`DISTORTION` יוצר צליל "מלוכלך" על ידי הגברת יתר (overdrive) של הצליל המקורי. האפקט קוטם את הגל, ומוסיף טונים עליים (תדרים גבוהים יותר הקשורים לתדרי הצליל המקורי). מקובל לעוות צליל של גיטרה חשמלית על-ידי הגברת יתר (overdrive) של מגבר הגיטרה. מוזיקה מודרנית משתמשת ב-distirtion כדי להוסיף אפקט "מלוכלך" או "מחוספס" ליצירה.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|DISTO_GAIN |כמות הגברת-היתר של הצליל המקורי. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| DISTO_GAIN | כמות הגברת-היתר של הצליל המקורי. | 20.0 | 0.0 | 50.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[eq3band]]
=== EQ3BAND
++++
- עם אפקט:
+ With Effect:
audioMedia/eq3band_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/eq3band_dry.mp3
++++
-`EQ3BAND` הוא אקולייזר של שלושה פסים המשמש למשימות EQ פשוטות. איקוולייזר משמש לכיוון העוצמה של טווחי תדרים נפרדים בערוץ שמע. אפקט זה משמש לכיוון העוצמה של שלושה טווחים ("פסים") של תדרים: בס, אמצע, טרבל (נמוך, אמצעי, גבוה). הגבול העליון (`EQ3BAND_LOWFREQ`) של הפס הנמוך והתדר המרכזי של הטווח האמצעי (`EQ3BAND_MIDFREQ`) יכולים להיקבע על-ידי המשתמש.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |ההגבר (dB) של טווח התדרים הנמוכים. ערכים שליליים מקטינים את העוצמה של התדרים הנמוכים. ערכים חיוביים מגבירים אותה. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |קובע את התדר הגבוה (Hz) של פס התדרים הנמוך. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |ההגבר (dB) של פס התדרים האמצעי. ערכים שליליים מקטינים את העוצמה של התדרים האמצעיים. ערכים חיוביים מגבירים אותה. |0.0 |-24.0 |18.0
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| EQ3BAND_LOWGAIN | ההגבר (dB) של טווח התדרים הנמוכים. ערכים שליליים מקטינים את העוצמה של התדרים הנמוכים. ערכים חיוביים מגבירים אותה. | 0.0 | -24.0 | 18.0
-| EQ3BAND_LOWFREQ | קובע את התדר הגבוה (Hz) של פס התדרים הנמוך. | 200.0 | 20.0 | 20000.0
-| EQ3BAND_MIDGAIN | ההגבר (dB) של פס התדרים האמצעי. ערכים שליליים מקטינים את העוצמה של התדרים האמצעיים. ערכים חיוביים מגבירים אותה. | 0.0 | -24.0 | 18.0
-| EQ3BAND_MIDFREQ | קובע את התדר המרכזי (Hz) של פס התדרים האמצעי. | 2000.0 | 20.0 | 20000.0
-| EQ3BAND_HIGHGAIN | ההגבר (dB) של טווח התדרים הגבוהים. ערכים שליליים מקטינים את העוצמה של התדרים הגבוהים. ערכים חיוביים מגבירים אותה. | 0.0 | -24.0 | 18.0
-| EQ3BAND_HIGHFREQ | קובע את תדר הקטעון (Hz) של הפס הגבוה. | 2000.0 | 20.0 | 20000.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|EQ3BAND_MIDFREQ |קובע את התדר המרכזי (Hz) של פס התדרים האמצעי. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |ההגבר (dB) של טווח התדרים הגבוהים. ערכים שליליים מקטינים את העוצמה של התדרים הגבוהים. ערכים חיוביים מגבירים אותה. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |קובע את תדר הקטעון (Hz) של הפס הגבוה. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[filter]]
=== FILTER
++++
- עם אפקט:
+ With Effect:
audioMedia/filter_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/filter_dry.mp3
++++
-`FILTER` הוא מסנן מביר נמוכים סטנדרטי עם תהודה. אפקט מסנן מעביר נמוכים מעביר תדרי שמע נמוכים ללא שינוי, ומנחית את עוצמת הצלילי בעלי התדרים הגבוהים מתדר הקיטעון (הפרמטר `FILTER_FREQ` ). זה נותן לצליל גוון "כהה" או "חשוך".
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| FILTER_FREQ | תדר הקיטעון (Hz), שכל התדרים הגבוהים ממנו יונחתו. ככל שהתדר גבוה יותר, הוא יונחת יותר. | 1000.0 | 20.0 | 20000.0
-| FILTER_RESONANCE | ההגבר של פס צר של תדרים מסביב ל-`FILTER_FREQ`. זה גורם לתדרים מסביב ל-`FILTER_FREQ` לצלצל יותר, להישמע יותר “מהדהדים”. הוא יוצר צליל יותר מצלצל מסביב לתדר הקיטעון (`FILTER_FREQ`). ערכים גבוהים יותר של תהודה תהפוך את הפילטר ל"חד" יותר סביב `FILTER_FREQ`, which מה שמדגיש יותר את התדרים הקרובים ביותר לתדר הקיטעון. זהו פרמטר שמסייע לכוונון עדין של צליל הפילטר. | 0.8 | 0.0 | 1.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|FILTER_FREQ |תדר הקיטעון (Hz), שכל התדרים הגבוהים ממנו יונחתו. ככל שהתדר גבוה יותר, הוא יונחת יותר. |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[flanger]]
=== FLANGER
++++
- עם אפקט:
+ With Effect:
audioMedia/flanger_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/flanger_dry.mp3
++++
-`FLANGER` דומה לאפקט chorus, בו נוצרים עותקים של הצליל המקורי השונים ממנו בזמן ובגובה. עותקים אלה מעורבלים לתוך הצליל המקורי. בניגוד לכך, פלנג'ר משמש בטווח הרבה יותר "עדין" של ערכי זמן, דבר שיוצר צליל מתפתח דמוי "וווש". בהצבת ערכים קיצוניים לפרמטר, יכולים להישמע צלילים מלאכותיים "דמויי רובוט".
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| FLANGER_LENGTH | משך הזמן (במילישניות) מהצליל המקורי בו הופעל אפקט הפלנג'ר. | 6.0 | 0.0 | 200.0
-| FLANGER_FEEDBACK | הכמות (dB) של הצליל אחרי האפקט ש"מוחזר" לתוך האפקט. ערכים גבוהים יותר יוצרים צלילים "מלאכותיים" יותר. | -50.0 | -80.0 | -1.0
-| FLANGER_RATE | הקצב (Hz) בו גובה הצליל חוזר על עצמו. ערכים נמוכים יותר יוצרים צלילים שחוזרים בצורה חלקה, בעוד ערכים גבוהים יותר יוצרים צלילים בעלי אפקט "וווש". | 0.6 | 0.001 | 100.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|FLANGER_LENGTH |משך הזמן (במילישניות) מהצליל המקורי בו הופעל אפקט הפלנג'ר. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. ערכים גבוהים יותר יוצרים צלילים "מלאכותיים" יותר. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. ערכים נמוכים יותר יוצרים צלילים שחוזרים בצורה חלקה, בעוד ערכים גבוהים יותר יוצרים צלילים בעלי אפקט "וווש". |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[pan]]
=== PAN
++++
- עם אפקט:
+ With Effect:
audioMedia/pan_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/pan_dry.mp3
++++
-`PAN` משפיע על המיקס בין הערוץ השמאלי והערוץ הימני. לדוגמה, אם תחבשו אוזניות, שינוי באפקט יקבע אם תשמעו משהו באוזן ימין או באוזן שמאל.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| LEFT_RIGHT | מציין את המיקום (ימין או שמאל) של הצליל המקורי בשדה הסטראופוני (0.0 זה המרכז, -100.0 זה לחלוטין בשמאל, 100.0 זה לחלוטין בימין). | 0.0 | -100.0 | 100.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|LEFT_RIGHT |מציין את המיקום (ימין או שמאל) של הצליל המקורי בשדה הסטראופוני (0.0 זה המרכז, -100.0 זה לחלוטין בשמאל, 100.0 זה לחלוטין בימין). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[phaser]]
=== PHASER
++++
- עם אפקט:
+ With Effect:
audioMedia/phaser_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/phaser_dry.mp3
++++
-`PHASER` הוא אפקט שיוצר עותק של הצליל המקורי בטווח נתון של תדרים. עותק הצליל לאחר האפקט מעוכב לזמן קצרצר ומושמע כנגד הצליל המקורי, תוך כדי תוך הגדלה והקטנה (עדינות) של זמן העיכוב הקצרצר. זה גורם לחלק מהתדרים המועתקים לבטל, זמנית, זה את זה על-ידי "יצאה מפאזה" ו"כניסה לפאזה" לסירוגין, ובכך ליצור את האפקט.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| PHASER_RATE | הקצב (Hz) בו זמן העיכוב הקצרצר משתנה. ערכים נמוכים יותר יוצרים צלילים שחוזרים בצורה חלקה, בעוד ערכים גבוהים יותר יוצרים צלילים "רובוטיים". | 0.5 | 0.0 | 10.0
-| PHASER_RANGEMIN | ערך התדר הנמוך ביותר (Hz) בטווח התדרים המושפע. | 440.0 | 40.0 | 20000.0
-| PHASER_RANGEMAX | ערך התדר הגבוה ביותר (Hz) בטווח התדרים המושפע. | 1600.0 | 40.0 | 20000.0
-| PHASER_FEEDBACK | הכמות (dB) של הצליל אחרי האפקט ש"מוחזר" לתוך האפקט. ערכים גבוהים יותר יוצרים צלילים "מלאכותיים" יותר. | -3.0 | -120.0 | -1.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|PHASER_RATE |הקצב (Hz) בו זמן העיכוב הקצרצר משתנה. ערכים נמוכים יותר יוצרים צלילים שחוזרים בצורה חלקה, בעוד ערכים גבוהים יותר יוצרים צלילים "רובוטיים". |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |ערך התדר הנמוך ביותר (Hz) בטווח התדרים המושפע. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |ערך התדר הגבוה ביותר (Hz) בטווח התדרים המושפע. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. ערכים גבוהים יותר יוצרים צלילים "מלאכותיים" יותר. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[pitchshift]]
=== PITCHSHIFT
++++
- עם אפקט:
+ With Effect:
audioMedia/pitchshift_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/pitchshift_dry.mp3
++++
-`PITCHSHIFT` מגביה או מנמיך את הצליל בטווח גבהים ספציפי (`PITCHSHIFT_SHIFT`). הוא יכול לגרום למספר קבצי צליל להישמע טוב יותר ביחד, או להיפך, להוסיף מעט דיסוננטיות.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| PITCHSHIFT_SHIFT | מציין את מספר חצאי הטונים (ושבריהם, המצוינים כספרות אחרי הנקודה העשרונית) בו יש לשנות את הצליל המקורי. 12 חצאי טונים הם אוקטבה אחת. | 0.0 | -12.0 | 12.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |מציין את מספר חצאי הטונים (ושבריהם, המצוינים כספרות אחרי הנקודה העשרונית) בו יש לשנות את הצליל המקורי. 12 חצאי טונים הם אוקטבה אחת. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[reverb]]
=== REVERB
++++
- עם אפקט:
+ With Effect:
audioMedia/reverb_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/reverb_dry.mp3
++++
-`REVERB` מוסיף אווירה הדועכת לאיטה, לצליל. אפשט זה דומה ל-`DELAY` אבל, לעיתים קרובות, הוא עשיר יותר ודחוס. הוא משמש למיקס ולמיקום הצליל במרחב.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| REVERB_TIME | זמן הדעיכה של צליל האווירה במילישניות (ms). כאשר REVERB_TIME מאופנן בעזרת עקומת אוטומציה, בגלל הטבע של reverb מבוסס קונבולוציה, הערך מעודכן כל רבע (time=0/25) במדרגות מנקודת ההתחלה של האוטומציה. (אתם, בכל מקרה, בקושי תבחינו בכך). | 1500.0 | 100.0 | 4000.0
-| REVERB_DAMPFREQ | תדר הקיטעון (Hz) של המסנן מעביר נמוכים המופעל של צליל האווירה. ככל שהערך נמוך יותר, האפקט ישמע כהה יותר. | 10000.0 | 200.0 | 18000.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 0.3 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|REVERB_TIME |זמן הדעיכה של צליל האווירה במילישניות (ms). כאשר REVERB_TIME מאופנן בעזרת עקומת אוטומציה, בגלל הטבע של reverb מבוסס קונבולוציה, הערך מעודכן כל רבע (time=0/25) במדרגות מנקודת ההתחלה של האוטומציה. (אתם, בכל מקרה, בקושי תבחינו בכך). |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |תדר הקיטעון (Hz) של המסנן מעביר נמוכים המופעל של צליל האווירה. ככל שהערך נמוך יותר, האפקט ישמע כהה יותר. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[ringmod]]
=== RINGMOD
++++
- עם אפקט:
+ With Effect:
audioMedia/ringmod_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/ringmod_dry.mp3
++++
-`RINGMOD` מכפיל שני אותו משני צלילים זה בזה: הצליל המקורי וסינוס טהור. האפקט של הכפלה זו נשמע אחרת לכל תדר של הצליל המקורי. כך נוצר צליל מלאכותי לגמרי, שלא יכול להיווצר בצורה טבעית. מספר ערכים של הפרמטרים לאפקט, ייצרו צלילים דומים לצלילים ששימשו בסרטי מד"ב ישנים. מועיל להתנסות בכך, כי יש טווח רחב של צלילים היכולים להיווצר מהצליל המקורי.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| RINGMOD_MODFREQ | התדר (Hz) של מתנד גל הסינוס אשר מוכפל בצליל המקורי. | 40.0 | 0.0 | 100.0
-| RINGMOD_FEEDBACK | הכמות (dB) של הצליל אחרי האפקט ש"מוחזר" לתוך האפקט. ערכים גבוהים יוצרים צלילים "רובוטיים". | 0.0 | 0.0 | 100.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|RINGMOD_MODFREQ |התדר (Hz) של מתנד גל הסינוס אשר מוכפל בצליל המקורי. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. ערכים גבוהים יוצרים צלילים "רובוטיים". |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[tremolo]]
=== TREMOLO
++++
- עם אפקט:
+ With Effect:
audioMedia/tremolo_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/tremolo_dry.mp3
++++
-`TREMOLO` משנה במהירות את העוצמה של הצליל המקורי, הלוך וחזור, מהערך המקורי לשקט. התוצאה היא אפקט של רטט.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| TREMOLO_FREQ | הקצב (Hz) בו העוצמה משתנה, הלוך וחזור. | 4.0 | 0.0 | 100.0
-| TREMOLO_AMOUNT | הכמות (dB) בה העוצמה משתנה בכל מחזור. | -6.0 | -60.0 | 0.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|TREMOLO_FREQ |הקצב (Hz) בו העוצמה משתנה, הלוך וחזור. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |הכמות (dB) בה העוצמה משתנה בכל מחזור. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[volume]]
=== VOLUME
++++
- עם אפקט:
+ With Effect:
audioMedia/volume_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/volume_dry.mp3
++++
-`VOLUME` מאפשר לכם לשנות את העוצמה של הצליל.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| GAIN | מציין את עוצמת הצליל ביציאה של הצליל המקורי. | 0.0 | -60.0 | 12.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|GAIN |מציין את עוצמת הצליל ביציאה של הצליל המקורי. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
[[wah]]
=== WAH
++++
- עם אפקט:
+ With Effect:
audioMedia/wah_wet.mp3
- ללא השפעה:
+ Without Effect:
audioMedia/wah_dry.mp3
++++
-`WAH` מסנן מעביר פס תהודתי (ראה אפקט `BANDPASS`) שיוצר צליל של פדאל "וואה-וואה", כאשר הוא משתנה בזמן, באמצעות מעטפות, בפונקציה ()setEffect.
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|פרמטר |תיאור |ערך ברירת-מחדל |minValue |maxValue
+
+|WAH_POSITION |התדר המרכזי של טווח התדרים, בעל הרוחב הקבוע, המוגבר. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
-|========================================================================
-| פרמטר | תיאור | ערך ברירת-מחדל | minValue | maxValue
-| WAH_POSITION | התדר המרכזי של טווח התדרים, בעל הרוחב הקבוע, המוגבר. | 0.0 | 0.0 | 1.0
-| MIX | אחוז הצליל, אחרי האפקט (רטוב), שיעורבל עם הצליל המקורי (יבש). בערכו המינימלי (0.0), אף אפקט לא נשמע. בערכו המקסימלי (1.0), הצליל המקורי לא נשמע - רק האפקט נשמע. | 1.0 | 0.0 | 1.0
-| BYPASS | האם האפקט פועל (1.0) או כבוי (0.0). אם עקיפת האפקט פועלת (1.0), אז השמע הנכנס לאפקט עובר כמו שהוא, ללא שינוי. שימו לב, שלא כמו צמדי שם/פרמטר אחרים, הערכים החוקיים ל-BYPASS הם 0.0 ו-1.0 בלבד. | 0.0 | 0.0 | 1.0
-|========================================================================
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/he/v1/every-error-explained-in-detail.adoc b/src/locales/he/v1/every-error-explained-in-detail.adoc
index 4be030f4c..f4ff0ac16 100644
--- a/src/locales/he/v1/every-error-explained-in-detail.adoc
+++ b/src/locales/he/v1/every-error-explained-in-detail.adoc
@@ -1,20 +1,38 @@
[[ch_29]]
== הסבר מפורט לכל שגיאה
+
:nofooter:
-[[importerror]]
-=== Import Error שגיאת ייבוא
+[[othererrors]]
+=== Overview
+
+לפעמים, מתכנתות ומתכנתים עושים שגיאות שגורמות לקוד לרוץ באופן שגוי, או לא לרוץ בכלל. In programming, coding faults are called *errors*, or *bugs*.
+
+The process of finding and fixing bugs is called *debugging*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
//Python only
[role="curriculum-python"]
-*ההודעה בקונסול:* ImportError: The appropriate packages cannot be found or imported.
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
[role="curriculum-python"]
-*תיאור:* השגיאה קורית כאשר תכנית לא מצליחה לטעון מודול שנתון בהוראת `from...import`. לדוגמה: ` * from module import`. השגיאה יכולה לנבוע מטעות בהקלדת שם המודול או מקריאה למודול שלא קיים.
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. השגיאה יכולה לנבוע מטעות בהקלדת שם המודול או מקריאה למודול שלא קיים.
[role="curriculum-python"]
-*לדוגמה:* בקטע הקוד הבא, המילה "EarSketch" מופיעה באיות הרגיל שלה. אבל, בפייתון שמות מודולים מורכבים רק מאותיות קטנות.
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
////
Can't turn off pasted without this appearing in JS mode.
@@ -23,7 +41,7 @@ Can't turn off pasted without this appearing in JS mode.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-import-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
----
[role="curriculum-python"]
@@ -32,14 +50,14 @@ include::../../en/v1/code-examples/every-error-explained-in-detail-import-error.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
----
[role="curriculum-python"]
-*פתרון:* בדקו את הוראות `from...import` בקוד, וודאו ששמות המודולים כתובים ללא שגיאות ובאותיות קטנות.
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
[role="curriculum-javascript"]
-שגיאות ייבוא לא קורות ב-JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
[[indentationerror]]
=== Indentation Error שגיאת הזחה
@@ -47,13 +65,13 @@ include::../../en/v1/code-examples/every-error-explained-in-detail-import-error-
//Python only
[role="curriculum-python"]
-*ההודעה בקונסול:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
[role="curriculum-python"]
-*תיאור:* זכרו שיש לבצע הזחה ימינה (אינדנטציה), בפייתון, כשמשתמשים בלולאות והוראות תנאי וכשמגדירים פונקציות. יש לבצע הזה אחרי כל הוראה שמסתיימת ב- (`:`). שגיאת הזחה קורית, כאשר לא מזיחים מספיק או מזיחים יותר מדי, את הקוד.
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). שגיאת הזחה קורית, כאשר לא מזיחים מספיק או מזיחים יותר מדי, את הקוד.
[role="curriculum-python"]
-*דוגמה:* עורך הקוד של EarSketch מזיח, אוטומטית, את שורות הקוד אחרי נקודתיים, אבל המתכנת/ת עלול/ה לשנות בטעות את ההזחה, כשמבוצעים שינויים בקוד, למשל. בקטע הקוד הבא, לא ברור אלו שורות נכללות בלולאה.
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. בקטע הקוד הבא, לא ברור אלו שורות נכללות בלולאה.
////
Can't turn off pasting without this appearing in JS mode
@@ -62,113 +80,114 @@ Can't turn off pasting without this appearing in JS mode
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
----
[role="curriculum-python"]
-קוד מוזח היטב יראה כמו הקטע הבא. גוף הלולאה מוזח בטאב אחד. ברור שהקריאה האחרונה ל-`()fitMedia` היא מחוץ ללולאה.
+קוד מוזח היטב יראה כמו הקטע הבא. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
----
[role="curriculum-python"]
-*פתרון:* מחקו את כל הרווחים בתחילת השורות, כל שכל השורות יתחילו בצמוד לקצה השמאלי של העורך. הזיחו כל שורה, והקפידו שההזחה בכל השורות תהיה זהה.
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. הזיחו כל שורה, והקפידו שההזחה בכל השורות תהיה זהה.
[role="curriculum-javascript"]
-שגיאות הזחה לא קורות ב-JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+שגיאות הזחה לא קורות ב-JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
[[indexerror]]
=== Index Error שגיאת אינדוקס
[role="curriculum-python"]
-*ההודעה בקונסול:* IndexError: There is an error using an out of range index.
+*Console message:* IndexError: There is an error using an out of range index.
[role="curriculum-javascript"]
-*ההודעה בקונסול:* TypeError: There is an error using an out of range index.
+*Console message:* TypeError: There is an error using an out of range index.
[role="curriculum-python"]
-*תיאור:* שגיאת אינדוקס קורית כשהקוד מנסה לגשת לאינדקס לא קיים (גדול מדי או שלילי) ברשימה או במחרוזת.
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
[role="curriculum-javascript"]
-*תיאור:* שגיאת אינדוקס קורית כשהקוד מנסה לגשת לאינדקס לא קיים (גדול מדי או שלילי) במערך או במחרוזת. השגיאה היא שגיאת טיפוס (typק error) ב-JavaScript. For an explanation of more general type errors, see the section on <>.
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. השגיאה היא שגיאת טיפוס (typק error) ב-JavaScript. For an explanation of more general type errors, see the section on <>.
[role="curriculum-python"]
-*לדוגמא:* קטע הקוד הבא, מנסה לגשת לאברי רשימה המכילה שמות קליפים.
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
[role="curriculum-javascript"]
-*לדוגמא:* קטע הקוד הבא, מנסה לגשת לאברי מערך המכיל שמות קליפים.
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-index-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-index-error.js.txt[]
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
----
[role="curriculum-python"]
נזרקת שגיאת אינדוקס ובקונסול מודפסת הודעה שאומרת שבשורה 39 האינדקס מחוץ לתחום. הקוד ממקם שלושה קליפים מהרשימה, אבל אינדקסים ברשימה מתחילים מאפס, והאינדקס האחרון ברשימה orch הוא שתיים (ולא שלוש):
[role="curriculum-javascript"]
-נזרקת שגיאת טיפוס ומודפסת, בקונסול, הודעה שאומרת שבשורה 17 היה צריך להשתמש בטיפוס אחר. הקריאה האחרונה לפונקציה `()fitMedia`קיבלה ערך מחוץ לתחום. ישנם שלושה קליפים, אבל מערך מתחיל מאינדקס אפס, כך שהאינדקס האחרון ב-orch הוא שתיים (ולא שלוש):
+נזרקת שגיאת טיפוס ומודפסת, בקונסול, הודעה שאומרת שבשורה 17 היה צריך להשתמש בטיפוס אחר. An out of range value was provided to the last `fitMedia()` call. ישנם שלושה קליפים, אבל מערך מתחיל מאינדקס אפס, כך שהאינדקס האחרון ב-orch הוא שתיים (ולא שלוש):
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
----
[role="curriculum-python"]
-*פתרון:* יש לכתוב את השם של כל קליפ ברשימה, כל קליפ והאינדקס שלו, ולהתחיל באינדקס אפס. זה מאפשר להבין את מבנה הרשימה ולמצוא מה יכול לגרום לשגיאה.
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. זה מאפשר להבין את מבנה הרשימה ולמצוא מה יכול לגרום לשגיאה.
[role="curriculum-javascript"]
-*פתרון:* יש לכתוב את השם של כל קליפ במערך, כל קליפ והאינדקס שלו, ולהתחיל באינדקס אפס. זה מאפשר להבין את מבנה המערךולמצוא מה יכול לגרום לשגיאה.
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. זה מאפשר להבין את מבנה המערךולמצוא מה יכול לגרום לשגיאה.
[[nameerror]]
=== Name Error שגיאת שם
[role="curriculum-python"]
-*ההודעה בקונסול:* NameError: There is an error with a variable or function name that is not defined.
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
[role="curriculum-javascript"]
-*ההודעה בקונסול:* Reference Error: There is an error with a variable or function name that is not defined.
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
[role="curriculum-python"]
-*תיאור:* שגיאת שם קורית כשתכנית מנסה להשתמש במשתנה או לקרוא לפונקציה שלא הוגדרו, בדרך כלל בגלל טעות הקלדה.
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
[role="curriculum-javascript"]
-*תיאור:* שגיאת שם קורית כשתכנית מנסה להשתמש במשתנה או לקרוא לפונקציה שלא הוגדרו, בדרך כלל בגלל טעות הקלדה. JavaScript מתייחסת לשגיאות כאלה כשגיאות הפנייה (reference errors).
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript מתייחסת לשגיאות כאלה כשגיאות הפנייה (reference errors).
[role="curriculum-python"]
-*דוגמה:* להלן קטע קוד המדפיס את המחרוזת שמאוחסנת במשתנה`today`. אבל, טעות בהוראה print מונעת מהסקריפט לרוץ.
+*Example:* Below is a simple script to print the string assigned to the `today` variable. אבל, טעות בהוראה print מונעת מהסקריפט לרוץ.
[role="curriculum-javascript"]
-*דוגמה:* להלן קטע קוד המדפיס את המחרוזת שמאוחסנת במשתנה`today`. אבל, טעות בפונקציה ()println מונעת מהסקריפט לרוץ.
-
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-name-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
----
במקרה זה, שם המשתנה שמכיל את המחרוזת לשרשור, לא מאוית נכון. שמו צריך להיות מאוית עם t קטנה.
@@ -176,33 +195,33 @@ include::../../en/v1/code-examples/every-error-explained-in-detail-reference-err
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
----
-*פתרון:* יש לבדוק את האיות של כל שמות המשתנים והפונקציות. יש לשים לב להבדל בין אותיות קטנות וגדולות. כשמשתמשים במשתנה או פונקציה, יש לוודא שהם הוגדרו. יש לוודא שפונקציה מודרת לפני שקוראים לה. למרות שאפשר להשתמש בהעתק/הדבק, יש לוודא ששמות הקבועים זהם לשמות הקליפים בדפדפן הצלילים.
+*Solution:* Check the spelling and case of your variables and functions. כשמשתמשים במשתנה או פונקציה, יש לוודא שהם הוגדרו. יש לוודא שפונקציה מודרת לפני שקוראים לה. למרות שאפשר להשתמש בהעתק/הדבק, יש לוודא ששמות הקבועים זהם לשמות הקליפים בדפדפן הצלילים.
[[parseerror]]
=== Parse Error שגיאות פריסה
[role="curriculum-python"]
-*ההודעה בקונסול:* ParseError: There is an error when reading the code.
+*Console message:* ParseError: There is an error when reading the code.
[role="curriculum-python"]
-*תיאור:* *פריסה (parsing)* היא המרה צורה של ידע לצורה אחרת. שגיאת פריסה קורית כאשר המפרש (interpreter) לא מצליח להמיר את הקוד למידע, שהמחשב יכול ליצור ממנו מוסיקה. שגיאות פריסה נגרמות, בדרך כלל, מטעויות בכתיבת סוגריים למיניהם.
+*Description:* *Parsing* means converting one form of information into another. שגיאת פריסה קורית כאשר המפרש (interpreter) לא מצליח להמיר את הקוד למידע, שהמחשב יכול ליצור ממנו מוסיקה. שגיאות פריסה נגרמות, בדרך כלל, מטעויות בכתיבת סוגריים למיניהם.
[role="curriculum-python"]
-*דוגמה:* בקטע הקוד הבא נבחרים קליפים לנגינה בצורה אקראית. אבל משהו מונע מהקוד לרוץ.
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
----
////
@@ -210,114 +229,114 @@ The parse error included in the example above breaks AsciiDoc syntax highlightin
////
[role="curriculum-python"]
-ההודעה בקונסול מצביעה על בעיה בשורה 26. שורה 26 נראית בסדר גמור, אבל לפונקציה `()selectRandomFile` בשורה הקודמת חסר הסוגר הימני. במקרים רבים, קל לתקן שגיאות פריסה.
+ההודעה בקונסול מצביעה על בעיה בשורה 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. במקרים רבים, קל לתקן שגיאות פריסה.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
----
[role="curriculum-python"]
-*פתרון:* יש לבדוק את ההודעה בקונסול כדי לדעת מי השורה השגויה. יש לוודא שכל הגדרות הפונקציות, הקריאות לפונקציות וביטויים אחרים מכילים גם סוגר שמאלי וגם סוגר ימני. יש לבדוק האם יש סימן פיסוק חסר בכל רחבי הקוד. באותה הזדמנות, כדאי לבדוק האם חסרות הגדרות של פונקציות, והאם בכל קריאה לפונקציה מועברים הפרמטרים הנדרשים. לסיום, יש לבדוק את האיות של שמות הפרמטרים שמועברים לפונקציה.
+*Solution:* Check the console for an indication of where the offending line may be. יש לוודא שכל הגדרות הפונקציות, הקריאות לפונקציות וביטויים אחרים מכילים גם סוגר שמאלי וגם סוגר ימני. יש לבדוק האם יש סימן פיסוק חסר בכל רחבי הקוד. באותה הזדמנות, כדאי לבדוק האם חסרות הגדרות של פונקציות, והאם בכל קריאה לפונקציה מועברים הפרמטרים הנדרשים. לסיום, יש לבדוק את האיות של שמות הפרמטרים שמועברים לפונקציה.
[role="curriculum-javascript"]
-Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
[[syntaxerror]]
=== Syntax Error שגיאת תחביר
-*ההודעה בקונסול:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
-*תיאור:* שגיאת תחביר קורית כאשר הקוד מפר את כללי התחביר של שפת התכנות.
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
-*דוגמה:* הסקריפט אמור ליצור "ביפים" עתידניים שמשתנים בצורה דינמית. אבל הוא מכיל שני באגים שגורמים לשגיאות תחביריות.
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. אבל הוא מכיל שני באגים שגורמים לשגיאות תחביריות.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
----
[role="curriculum-python"]
-בסקריפט זה, עורך הקוד מצביע על השורה השגויה. חסרות נקודתיים בסוף הוראת ה-_if_. באותה שורה, צריך היה להשתמש באופרטור ההשוואה `==` ולא באופרטור ההשמה `=`.
+בסקריפט זה, עורך הקוד מצביע על השורה השגויה. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
[role="curriculum-javascript"]
-בסקריפט זה, עורך הקוד מצביע על השורה השגויה. בתחילת גוף הוראת ה- _if_ חסר סוגר מסולסל. באותה שורה, צריך היה להשתמש באופרטור ההשוואה `===` ולא באופרטור ההשמה `=`.
+בסקריפט זה, עורך הקוד מצביע על השורה השגויה. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
----
[role="curriculum-python"]
-*פתרון:* צריך לבדוק את עורך הקוד וחלונית הקונסול כדי למצוא את מיקום השגיאה. מעבר לשגיאות הנפוצות שהוזכרו, יש לבדוק פתיחה וסגירה של מירכאות, ויש לוודא שלא נעשה שימוש במילים שמורות של פייתון כשמות של משתנים.
+*Solution:* Always check the console and code editor for clues. מעבר לשגיאות הנפוצות שהוזכרו, יש לבדוק פתיחה וסגירה של מירכאות, ויש לוודא שלא נעשה שימוש במילים שמורות של פייתון כשמות של משתנים.
////
Added solution from parse error to JS version below.
////
[role="curriculum-javascript"]
-*פתרון:* צריך לבדוק את עורך הקוד וחלונית הקונסול כדי למצוא את מיקום השגיאה.
+*Solution:* Always check the console and code editor for clues.
מעבר לשגיאות הנפוצות שהוזכרו, יש לבדוק פתיחה וסגירה של מירכאות, ויש לוודא שבכל ההגדרות של פונקציות, הקריאות לפונקציות והביטויים שיש בהם סוגריים, יש גם סוגר ימני וגם סוגר שמאלי. יש לבדוק האם יש סימן פיסוק חסר בכל רחבי הקוד. באותה הזדמנות, כדאי לבדוק האם חסרות הגדרות של פונקציות, והאם בכל קריאה לפונקציה מועברים הפרמטרים הנדרשים. אסור להשתמש במילים שמורות של JavaScript כשמות של משתנים. לסיום, יש לבדוק את האיות של שמות הפרמטרים שמועברים לפונקציה.
[[typeerror]]
=== Type Error שגיאת טיפוס
-*ההודעה בקונסול:* TypeError: There is an error with the expected data type.
+*Console message:* TypeError: There is an error with the expected data type.
-*תיאור:* שגיאת טיפוס קורית כשפעולה או פונקציה אמורות לקבל ערך מטיפוס מסוים אך מקבלות ערך מטיפוס אחר.
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
[role="curriculum-python"]
-*דוגמה:* נניח שסקריפט עוקב אחרי מספר התיבות בשיר מסוים, בעזרת משתנה שמונה את מספר התיבות. קטע הקוד הבא מנסה להדפיס את מספר התיבות בשיר.
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. קטע הקוד הבא מנסה להדפיס את מספר התיבות בשיר.
[role="curriculum-javascript"]
-*דוגמה:* נניח שסקריפט מקבל מהמשתמש קלט שקובע את אורך השיר. הקלט מועבר כפרמטר ל-`()fitMedia`.
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-type-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-type-error.js.txt[]
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
----
[role="curriculum-python"]
-יש כאן שגיאת טיפוס כי לא ניתן לשרשר מספר למחרוזת. כדי שהשרשור יהיה אפשרי, יש להמיר את הערך של `measureTotal` למחרוזת:
+יש כאן שגיאת טיפוס כי לא ניתן לשרשר מספר למחרוזת. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
[role="curriculum-javascript"]
-נוצרת שגיאת טיפוס, כי פרמטר אחרון מטיפוס מחרוזת הועבר ל-`()fitMedia`. יש להמיר את הערך של `measureTotal` למספר:
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
----
-*פתרון:* הקונסול מצביע על טיפוס הנתונים השגוי ועל השורה בה נמצאת השגיאה. יש לבדוק התאמה בין הטיפוסים בביטויים אריתמטיים, פעולות על מבני נתונים ובהעברת פרמטרים לפונקציה. בנוסף, צריך לוודא שלקריאות לפונקציה מועברים פרמטרים בכמות הנדרשת.
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. יש לבדוק התאמה בין הטיפוסים בביטויים אריתמטיים, פעולות על מבני נתונים ובהעברת פרמטרים לפונקציה. בנוסף, צריך לוודא שלקריאות לפונקציה מועברים פרמטרים בכמות הנדרשת.
////
(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
@@ -327,51 +346,51 @@ include::../../en/v1/code-examples/every-error-explained-in-detail-type-error-co
=== Value Error טעות ערך
[role="curriculum-python"]
-*ההודעה בקונסול:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
[role="curriculum-javascript"]
-*ההודעה בקונסול:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
[role="curriculum-python"]
-*תיאור:* שגיאת ערך קורית כשפונקציה מקבל פרמטר מהטיפוס הנכון אבל בעל ערך לא בתחום הנדרש.
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
[role="curriculum-javascript"]
-*תיאור:* שגיאת ערך קורית כשפונקציה מקבל פרמטר מהטיפוס הנכון אבל בעל ערך לא בתחום הנדרש. JavaScript מתייחסת לשגיאות כאלה כשגיאות טווח (range errors).
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript מתייחסת לשגיאות כאלה כשגיאות טווח (range errors).
[role="curriculum-python"]
-*דוגמה:* קטע הקוד הבא מנסה ליצור ביט מעניין בעזרת`()makeBeat` ורשימות.
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
[role="curriculum-javascript"]
-*דוגמה:* קטע הקוד הבא מנסה ליצור ביט מעניין בעזרת`()makeBeat` ומערכים.
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-value-error.py.txt[]
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-range-error.js.txt[]
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
----
[role="curriculum-python"]
-הפרמטר הרביעי של `makeBeat()` הוא מהטיפוס הנכון, אבל אחד מערכי האינדקס, אליהם הוא ניגש, לא חוקי. סביר להניח, שהמתכנת/ת שכח/ה שאינדקסים ברשימה מתחילים מאפס.
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. סביר להניח, שהמתכנת/ת שכח/ה שאינדקסים ברשימה מתחילים מאפס.
[role="curriculum-javascript"]
-הפרמטר הרביעי של `makeBeat()` הוא מהטיפוס הנכון, אבל אחד מערכי האינדקס, אליהם הוא ניגש, לא חוקי. סביר להניח, שהמתכנת/ת שכח/ה שאינדקסים במערך מתחילים מאפס.
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. סביר להניח, שהמתכנת/ת שכח/ה שאינדקסים במערך מתחילים מאפס.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
----
-*פתרון:* יש לבדוק את מחרוזות התיפוף ולוודא שהערכים בטווח הנכון. כמו כן, יש לוודא שכל הפרמטרים המועברים ל-`()setEffect` הם בטווח הערכים המותר לאפקט.
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/he/v1/the-earSketch-api.adoc b/src/locales/he/v1/the-earSketch-api.adoc
index ca095db28..ff42104d4 100644
--- a/src/locales/he/v1/the-earSketch-api.adoc
+++ b/src/locales/he/v1/the-earSketch-api.adoc
@@ -1,5 +1,6 @@
[[ch_27]]
== ה-API של EarSketch
+
:nofooter:
-link:[לחץ כאן] לפתיחת ה-API של EarSketch.
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/he/v2/add-beats.adoc b/src/locales/he/v2/add-beats.adoc
index b8c95bf1b..b8c7bfcc7 100644
--- a/src/locales/he/v2/add-beats.adoc
+++ b/src/locales/he/v2/add-beats.adoc
@@ -1,9 +1,9 @@
[[addsomebeats]]
== הוסיפו ביטים למוסיקה!
-:nofooter:
-בפרק זה תלמדו איך ליצור ביטים! נלמד על משתנים, על פונקציה חדשה שנקראת ()makeBit ועל דוגמאות לביטים לפי סוגה (ז'אנר).
+:nofooter:
+בפרק זה תלמדו איך ליצור ביטים! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
[[variables]]
=== משתנים
@@ -16,88 +16,95 @@ video::./videoMedia/002-05-Variables-PY.mp4[]
[[video2js]]
video::./videoMedia/002-05-Variables-JS.mp4[]
-מה זה משתנה? זה שם שיעזור למחשב למצוא פיסת מידע או נתונים. הנתונים יכולים להיות מסוגים שונים. משתנה יכול, למשל, להצביע על:
+מה זה משתנה? A *variable* is a name given to a piece of data that we plan to use later in our program.
-* מספר (כמו מספר ערוץ או מספר תיבה),
-* קובץ (כמו קובץ שמע),
-* מחרוזת (string), כמו שם של קליפ או תמליל של שיר. *תו או character* הוא ספרה, אות או סימן כמו `A`, `a`, `2` או `=` (אל תתבלבלו בין תו כזה, לתו מוסיקלי המורה איזה צליל לנגן). מחרוזת היא רצף של תווים עם מרכאות בהתחלה ובסוף, כמו `"Hello World 123!"`.
+In EarSketch, the variables in your scripts may point to:
-נותנים שם לנתונים כדי שיהיה קל יותר להתייחס אליהם ולשנות אותם.
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
-[role="curriculum-python"]
כדי להשתמש במשתנה,
-. צריך, קודם כל, *להציב* בו ערך. הסימן "=" משמש *כאופרטור ההצבה*. משמעות ההוראה `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` היא שיש ליצור משתנה בשם synth1 ולאחסן בתוכו את הנתון HIPHOP_SYNTHPLUCKLEAD_005.
-. HIPHOP_SYNTHPLUCKLEAD_005 הוא *הערך* של`synth1`.
-. כדי להשתמש במשתנה יש לכתוב`synth1`בקוד. אפשר להשתמש במשתנה רק אחרי שהוצב בו ערך. לדוגמה:`fitMedia(synth1, 1, 1, 3)`.
-. בזמן הריצה, המחשב יבין שעליו להשתמש בקליפ HIPHOP_SYNTHPLUCKLEAD_005 כשבקוד כתוב`synth1`.
+[role="curriculum-python"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. אפשר להשתמש במשתנה רק אחרי שהוצב בו ערך. For example, write `fitMedia(synth1, 1, 1, 3)`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
[role="curriculum-javascript"]
-כדי להשתמש במשתנה,
-
-. צריך, קודם כל, *להציב* בו ערך. הסימן "=" משמש *כאופרטור ההצבה*. כמו כן, יש להשתמש ב-`var` בתחילת השורה. משמעות ההוראה `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` היא שיש ליצור משתנה בשם synth1 ולאחסן בתוכו את הנתון HIPHOP_SYNTHPLUCKLEAD_005.
-. HIPHOP_SYNTHPLUCKLEAD_005 הוא *הערך* של`synth1`.
-. כדי להשתמש במשתנה יש לכתוב`synth1`בקוד. לדוגמה: ;`fitMedia(synth1,1,1,3)`
-. בזמן הריצה, המחשב יבין שעליו להשתמש בקליפ HIPHOP_SYNTHPLUCKLEAD_005 כשבקוד כתוב`synth1`.
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. We also use the command `var` at the beginning of the line. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. For example, write `fitMedia(synth1, 1, 1, 3);`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/add-beats-instead-of-this.py.txt[]
+include::code-examples/add-beats-instead-of-this.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/add-beats-instead-of-this.js.txt[]
+include::code-examples/add-beats-instead-of-this.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-בסקריפט הקודם שכתבת, השתמש/י במשתנים לאחסון שמות הקליפים. הדוגמאות שלמטה יכולות לעזור. על שמות המשתנים להיות קצרים (כמו "bass", "voice1" וכו'). על השם לתאר בקצרה את תפקיד הקליפ.
+In your previous scripts, use variables to store your sound constants. הדוגמאות שלמטה יכולות לעזור. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
****
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/add-beats-variables.py.txt[]
+include::code-examples/add-beats-variables.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/add-beats-variables.js.txt[]
+include::code-examples/add-beats-variables.js.txt[]
----
-שימו לב לכך שחשוב לתת למשתנים שמות תיאוריים ובעלי משמעות. לדוגמה, העדיפו את השם `synth1` על `music1` או `test`, שלא מספקים מידע. בדרך זו, מי שקורא/ת את הקוד יכול/ה לדעת מהו צליל זה.
-*קבע או constant* דומה למשתנה בכך שמאוחסן בו ערך. ההבדל הוא שערכו של קבוע לא משתנה. לדוגמה, `TECHNO_SYNTHPLUCK_001`הוא קבוע, שמתייחס לקובץ שמע מסוים. כמוסכמה, שמו של קבוע יהיה תמיד באותיות גדולות, והוא יכיל קווים תחתונים כרווחים בין מילים.
+Note that it's important to name your variable in an understandable and descriptive way. For example, specify `synth1` instead of `music1` or `test`, which don't provide any information. בדרך זו, מי שקורא/ת את הקוד יכול/ה לדעת מהו צליל זה.
+
+A *constant* is similar to a variable because it stores values. ההבדל הוא שערכו של קבוע לא משתנה. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. כמוסכמה, שמו של קבוע יהיה תמיד באותיות גדולות, והוא יכיל קווים תחתונים כרווחים בין מילים.
[[drumbeatstrings]]
=== מחרוזות ביטים
-קודם כל נלמד מושגים בסיסיים על קצב (rhythm):
+Let's first learn some basic concepts about rhythm:
-* *הקצב או rhythm* הוא האופן בו הצלילים מסודרים בזמן.
-* ה-*tempo* הוא מהירות המוסיקה בביטים לדקה (BPM). לביט קוראים, לפעמים, פעימה בעברית. אנחנו נשתמש בשם הלועזי.
-* *הביט* הוא ה"דופק הקבוע" של השיר. כשהקהל מוחא כפיים בקונצרט, הוא מוחא על הביט.
-* *תיבה* היא יחידת זמן מוסיקלית, בעלת מספר קבוע מראש של ביטים. ב-EarSketch *תיבה* אחת היא באורך של ארבעה ביטים. בגלל שיש ארבעה ביטים בתיבה, ביטים נקראים גם *רבעים*.
-* כל ביט יכול להתחלק למספר *תת-ביטים*. לדוגמה, רבע יכול להתחלק לשתי *שמיניות*. כשסופרים רבעים, סופרים: "אחת, שתיים, שלוש, ארבע". כשסופרים שמיניות, סופרים: "אחת, ו.., שתיים, ו.., שלוש, ו.., ארבע, ו..". שמינית יכולה להתחלק לשתי *שש-עשריות*.
-* תיבה אחת מכילה ארבעה רבעים או שמונה שמיניות או שש עשרה שש-עשריות. שימו לב לכך, שסכום כל אורכי התווים בתיבה חייב להיות אחד. אפשר לערבב אורכים בתיבה (כל עוד סכומם שווה לאחד). למשל: 1/4 + 1/4 + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
-* *מטרונום או פעמן* עוזר לקבוע את הקצב, על-ידי השמעת קליק על הביט. ב-DAW אפשר להפעיל ולכבות את המטרונום, על ידי לחיצה על האייקון "toggle metronome", לשמאל הסרגל שקובע את עצמת הצליל.
+* *Rhythm* is a pattern of sound, often repeated.
+* The *tempo* is the speed of the music in BPM (beats per minute).
+* A *beat* is like the "steady pulse" of a song. When members of an audience clap their hands in a concert, they're clapping on the beat.
+* A *measure* is a musical time unit with a predetermined number of beats. In EarSketch, 1 *measure* is 4 beats long. Since there are 4 beats in 1 measure, beats are also called *quarter (1/4) notes*.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. When you are counting 1/4 notes, you say "1, 2, 3, 4...." When counting 1/8 notes, you can use "ands": "1 and 2 and 3 and 4 and...."
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. שימו לב לכך, שסכום כל אורכי התווים בתיבה חייב להיות אחד. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* A *metronome* helps the musician set the rhythm of his or her piece by making a clicking noise on the beat. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
[[imediameasurepng]]
.תיבה
-[caption="Figure 1: "]
-image::../media/U1P1/beat.png[A measure]
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
[[imediabeatpng]]
.ביט (פעמה)
-[caption="Figure 2: "]
+[caption="Figure 3.2.2: "]
image::../media/U1P1/beat.png[A beat]
[[imediasixteenthnotepng]]
.תו באורך שש-עשרית
-[caption="Figure 3: "]
+[caption="Figure 3.2.3: "]
image::../media/U1P1/sixteenthnote.png[A sixteenth note]
.תרגלו
@@ -105,161 +112,173 @@ image::../media/U1P1/sixteenthnote.png[A sixteenth note]
האזינו לשיר שאתם אוהבים, ונסו למחוא כף על הביט. אפשר לתרגל זאת עם חברים וחברות.
****
-ניצור טיפוס חדש של משתנים: *מחרוזות תיפוף*; לתבניות כלי ההקשה.
-מחרוזת תיפוף היא מחרוזת המורכבת מהתווים `"0"`, `"+"` או `"-"`. לדוגמה: `"+0+0+++0-00-00-0"`. בדרך כלל, מחרוזת תיפוף היא באורך של 16 תווים, אבל אורכה יכול להשתנות. כל תו מתייחס לשש-עשרית, כך שמחרוזת של שישה עשר תווים היא תיבה שלמה.
+We'll compose each of our rhythms in a *beat* string.
-* `0` מתחיל לנגן את הקליפ (המכיל הקשה של תוף, למשל).
-* `+` מרחיב את נגינת הקליפ לתת-ביט הבא. הוא תמיד יבוא אחרי `0` או `+`.
-* `-` מהווה הפסקה, כלומר שקט.
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
-נזכיר שמחרוזת היא טיפוס נתונים. היא מכילה סדרה של תווים (כמו `0` או `+`) בתוך מרכאות.
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` starts playing the percussive sound clip (one hit of the drum, for example).
+* `+` extends the audio clip into the next sub-beat. It always follows a `0` or `+`.
+* `-` is a rest, meaning silence.
.תרגלו
****
-לכל אחת ממחרוזות התיפוף הבאות, נסו למחוא כפיים על האפסים. אחר-כך, האזינו לקובץ השמע ובדקו אם מחאתם במקום הנכון. תרגיל זה עוזר להבין כיצד מחרוזות תיפוף פועלות.
+לכל אחת ממחרוזות התיפוף הבאות, נסו למחוא כפיים על האפסים. אחר-כך, האזינו לקובץ השמע ובדקו אם מחאתם במקום הנכון. תרגיל זה עוזר להבין כיצד מחרוזות תיפוף פועלות.
****
הנה מספר דוגמאות למחרוזות תיפוף באורך של תיבה אחת:
Quarter notes: `"0\+++0+++0\+++0+++"`
-(read: "1,2,3,4")
+(read: "1, 2, 3, 4")
+
++++
audioMedia/beatString1.mp3
++++
-שמיניות: `"+0+0+0+0+0+0+0+0"`
-(קראו: "אחד ושתיים ושלוש וארבע")
+Eighth notes: `"0+0+0+0+0+0+0+0+"`
+(read: "1 and 2 and 3 and 4")
+
++++
audioMedia/beatString11.mp3
++++
-שש-עשריות: `"0000000000000000"`
-(זה עלול להיות מאוד מהיר, תלוי בטמפו.)
+Sixteenth notes: `"0000000000000000"`
+(that's very fast, depending on the tempo)
+
++++
audioMedia/beatString12.mp3
++++
-`"---0-0-0---0-0-0"`
-(קראו: "אחד ושתיים, שלוש וארבע")
+`"0-0-0---0-0-0---"`
+(read: "1 and 2, 3 and 4")
+
++++
audioMedia/beatString2.mp3
++++
-`"---0-0-0---0---0"`
-(קראו: "אחד, שתיים, שלוש וארבע")
+`"0---0---0-0-0---"`
+(read: "1, 2, 3 and 4")
+
++++
audioMedia/beatString3.mp3
++++
-`"0000---0---0---0"`
-(קראו: "אחד, שתיים, שלוש, ארבע e ו-a")
+`"0---0---0---0000"`
+(read: "1, 2, 3, 4 e and a")
+
++++
audioMedia/beatString4.mp3
++++
+{nbsp} +
+
////
ADDITIONAL VIDEO TO BE ADDED
See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
video revamping tab
////
-
[[makebeat]]
-=== הפונקציה `()makeBeat`
+=== The `makeBeat()` function
-בואו נראה איך אפשר ליצור ביטים. המונח "ביט" ישמש אותנו כשם קצר יותר למחרוזת תיפוף: תבנית ריתמית חוזרת של צלילי הקשה. נשתמש בפונקציה `()makeBeat` עם ארבעה פרמטרים:
+Now let's see how you can make your own beat. המונח "ביט" ישמש אותנו כשם קצר יותר למחרוזת תיפוף: תבנית ריתמית חוזרת של צלילי הקשה. We will use the `makeBeat()` function, with 4 arguments:
-. *Clip Name*: הקליפ הנבחר. בדפדפן הצלילים, אפשר לבחור באמן "MAKEBEAT". אלה צלילים קצרים המתאימים למחרוזות תיפוף.
-. *Track Number*: הערוץ בו ינוגן הביט.
-. *Measure Number*: התיבה בה יתחיל הביט.
-. *Beat String*: מחרוזת המורכבת מהתווים `"0"`, `"+"`, ו-`"-"`.
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
-לדוגמה: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` ימקם את הביט `0--0--000--00-0-` בערוץ אחד, בתיבה הראשונה וישתמש בקליפ `DUBSTEP_FILTERCHORD_002`.
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
-פרטים נוספים בקטע הווידאו הבא:
+Let's see more details with this video:
[role="curriculum-python curriculum-mp4"]
[[video12py]]
-video::./videoMedia/011-03-makeBeat()-PY.mp4[]
+video::./videoMedia/3_3_makebeat_py.mp4[]
[role="curriculum-javascript curriculum-mp4"]
[[video12js]]
-video::./videoMedia/011-03-makeBeat()-JS.mp4[]
+video::./videoMedia/3_3_makebeat_js.mp4[]
הנה הדוגמה המוצגת בקטע:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/add-beats-multi-beat.py.txt[]
+include::code-examples/add-beats-multi-beat.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/add-beats-multi-beat.js.txt[]
+include::code-examples/add-beats-multi-beat.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-צרו משתנה חדש בשם `beatString1`, המכיל מחרוזת של 16 תווים. התווים יהיו מתוך: `"0"`, `"+"`, ו-`"-"`.
-השתמשו בפונקציה `()makeBeat` כדי להוסיף את מחרוזת התיפוף לערוץ אחד.
+Create a new `beatString1` variable, a 16-character string with the characters `"0"`, `"+"`, and `"-"`.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
שימו לכך ש:
-. יש להציב ערך במשתנה, לפני שמשתמשים בו. הצבת ערך נעשית בעזרת הסימן `=`.
-. כמו `()fitMedia`, גם הפונקציה `()makeBeat` מתחילה באות קטנה (`m`) ויש לה אות גדולה באמצע (`B`).
-. כמו `()fitMedia`, גם לפונקציה `()makeBeat` יש ארבעה פרמטרים המופרדים בפסיקים.
+. You should assign your variables with the `=` symbol before using them.
+. Just like `fitMedia()`, the `makeBeat()` function starts with a lowercase letter (`m`) and has an uppercase letter in the middle (`B`).
+. Just like `fitMedia()`, the `makeBeat()` function has 4 parameters separated by commas.
-אם בשמיעה ראשונה, השיר לא נשמע טוב מספיק, זה בסדר גמור. שחקו עם הביט עד שהשיר יישמע מצוין.
+When you hear your music, if you don't like your first version, tweak your beat to make it sound better and better, until you like what you have.
****
+{nbsp} +
+
.תרגלו
****
-צרו סקריפט חדש והוסיפו לו שניים או שלושה קליפים בעזרת `()fitMedia`. השתמשו במשתנים כדי לאחסן את שמות הקליפים.
-השתמשו בפונקציה `()makeBeat` כדי להוסיף לפחות שני ביטים שונים. תוכלו לנגן אותם בו-זמנית, בשני ערוצים שונים, או אחד אחרי השני באותו ערוץ.
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. תוכלו לנגן אותם בו-זמנית, בשני ערוצים שונים, או אחד אחרי השני באותו ערוץ.
****
[[beatsandgenres]]
=== צרו ביטים המבוססים על ז'אנר (סוגה) מסוים
-עכשיו, אחרי שהתחלנו לעבוד עם `()makeBeat` ומחרוזות תיפוף (ביטים), נוכל להכיר מספר תבניות ביטים בסיסיות.
-למדנו שסוגה מוסיקלית היא קטגוריה של יצירה אמנותית (כמו מוסיקה), המאופיינת בדמיון בצורה, בסגנון או בנושא. לסוגות מוסיקליות מסוימות יש תבניות ביטים אופייניות. הנה מספר דוגמאות:
+Now that you've started working with `makeBeat()` and beat strings, let's explore some basic beat patterns that you can use.
+You've learned that a musical genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. לסוגות מוסיקליות מסוימות יש תבניות ביטים אופייניות. הנה מספר דוגמאות:
-נשתמש בשלושה סוגי צלילים: קיק (kick) בערוץ הראשון, סנר (snare) בערוץ השני והייהאט (hihat) בערוץ השלישי. נשתמש בפונקציה`()makeBeat` לכל אחד מהצלילים הללו, בשלושה ערוצים.
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
-////
-video is currently being edited
-////
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
הנה הקוד:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/add-beats-examples-of-beats.py.txt[]
+include::code-examples/add-beats-examples-of-beats.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/add-beats-examples-of-beats.js.txt[]
+include::code-examples/add-beats-examples-of-beats.js.txt[]
----
[[chapter3summary]]
=== סיכום פרק שלישי
-* ב-EarSketch תיבה אחת מתחלקת לארבע פעימות (ביטים) או ארבעה רבעים. ביט אחד מתחלק לארבע שש-עשריות.
-* *משתנים* יוצרים מקום בזיכרון המחשב לאחסון נתונים.
-* לפני שימוש במשתנה יש להציב בשם המשתנה ערך (נתון) באמצעות הסימן `=`. רק אחרי ההצבה הראשונית ניתן להשתמש במשתנה בקוד על-ידי כתיבת שמו.
-* *מחרוזת* היא טיפוס נתונים שמכיל סדרה של תווים בין מירכאות.
-* ניתן למצוא קליפים שמכילים צלילים של כלי הקשה, בדפדפן הצלילים, על-ידי סינון בעזרת הפילטר ARTIST. יש לבחור את האמן MAKEBEAT.
-* נשתמש במחרוזות ובפונקציה `()makeBeat`כדי ליצור תבניות ריתמיות. `()makeBeat` מגדירה כל שש-עשרית בתבנית הריתמית בעזרת מחרוזת התיפוף. `0` מתחיל לנגן את הקליפ, `+` מרחיב את הקליפ לשש-עשרית הבאה, ו-`-` יוצר הפסקה.
-* לפונקציה`()makeBeat` ארבעה פרמטרים:
-** *clipName:* הקליפ שיוצר את הביט.
-** *trackNumber:* הערוץ בו תמוקם המוסיקה.
-** *Measure Number*: התיבה בה יתחיל הביט. מחרוזת התיפוף עצמה תקבע את האורך הכולל.
-** *beatString:* המחרוזת שקובעת את הקצב שיווצר.
-* תבניות קצב שונות מתאימות לז'אנרים (סוגות) מוסיקליים שונים.
+* ב-EarSketch תיבה אחת מתחלקת לארבעה פעימות (ביטים) או ארבעה רבעים. ביט אחד מתחלק לארבע שש-עשריות.
+* *Variables* create a space in computer memory to store data.
+* You first need to assign the value (data) to the variable name using the sign `=`. רק אחרי ההצבה הראשונית ניתן להשתמש במשתנה בקוד על-ידי כתיבת שמו.
+* A *string* is a data type that consists of a series of characters encapsulated by single or double quotes.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Strings are used with the `makeBeat()` function to create rhythmic patterns in EarSketch. `makeBeat()` takes a beat string to define each sixteenth note of its pattern. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` takes four arguments:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
[[chapter-questions]]
=== שאלות
@@ -267,6 +286,7 @@ include::../../en/v2/code-examples/add-beats-examples-of-beats.js.txt[]
[question]
--
מי מבין השורות הבאות היא מחרוזת?
+
[answers]
* "Five"
* 5
@@ -277,6 +297,7 @@ include::../../en/v2/code-examples/add-beats-examples-of-beats.js.txt[]
[question]
--
מה מייצג "0" במחרוזת תיפוף?
+
[answers]
* התחלת נגינת הקליפ
* הפסקה
@@ -286,7 +307,8 @@ include::../../en/v2/code-examples/add-beats-examples-of-beats.js.txt[]
[question]
--
-ב-EarSketch, תיבה אחת היא:
+In EarSketch, one measure is...
+
[answers]
* באורך ארבעה ביטים
* באורך ארבעה תת-ביטים
@@ -296,7 +318,8 @@ include::../../en/v2/code-examples/add-beats-examples-of-beats.js.txt[]
[question]
--
-תו באורך שש-עשרית הוא...
+One sixteenth note is...
+
[answers]
* רבע של תו באורך רבע
* חצי ביט
@@ -306,10 +329,11 @@ include::../../en/v2/code-examples/add-beats-examples-of-beats.js.txt[]
[question]
--
-כדי להשתמש בפונקציה `()makeBeat`, אילו פרמטרים צריך?
+To use the `makeBeat()` function, what is the order of parameters you need to provide?
+
[answers]
* שם הקליפ, ערוץ, תיבת התחלה, מחרוזת תיפוף
* טמפו, ערוץ, תיבת התחלה, תיבת סיום
* שם הקליפ, תיבת התחלה, תיבת סיום, מחרוזת תיפוף
* מחרוזת תיפוף, ערוץ. תיבת התחלה, שם הקליפ
---
+--
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/he/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..6788ccea1
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // This is the "boom" sound.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/he/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..39b8de864
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # This is the "boom" sound.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # This is the "ts" sound.
+
+# Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/he/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/he/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/he/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..2bbded58b
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Setup
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/he/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..02f305a40
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-variables.js.txt b/src/locales/he/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..892e9ee9e
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Setup
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/add-beats-variables.py.txt b/src/locales/he/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..615531008
--- /dev/null
+++ b/src/locales/he/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/he/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..b47ffdbce
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/he/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..8bfd9ef2b
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/he/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..f17f7606e
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/he/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..2bb8b3f8e
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/he/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/he/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..fe86e34c5
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Setup
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..5e0318ee0
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..b193b59d7
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Setup
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..7c13d7605
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Setup
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..fc4ac0026
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Setup
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..02b9bf3fd
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/he/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/he/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/he/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/he/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..5393649b3
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Setup
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/he/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..e7bcaac25
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-arrays.js.txt b/src/locales/he/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..6f979e08f
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/he/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..fc1a83742
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/he/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..35d2a3f43
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/he/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/he/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/he/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..c3be55257
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/he/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..ddb76404f
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-list.py.txt b/src/locales/he/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c6cfcd632
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/he/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..0ccfffc88
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Setup
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/he/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..9747b5b4a
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/he/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..81e2dbe01
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Setup
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/he/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dae36a455
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/he/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..5fbe4a7ac
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Setup
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/he/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..91f9bf807
--- /dev/null
+++ b/src/locales/he/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..1aaddaf46
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..3c2ae73a2
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..cd446e98c
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Setup
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..ca104ee90
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..a639ba4f0
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..0da37e8be
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..d123caa9a
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Setup
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..b0902254f
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..7221572eb
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..1b2cc9748
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..f5b833522
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Setup
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/he/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..00ff28b70
--- /dev/null
+++ b/src/locales/he/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/he/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..013470826
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Setup
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/he/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/he/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..8979b5185
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Setup
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/he/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/he/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..02ab97eb8
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/he/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..ce6ff834d
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/he/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..998a9d803
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/he/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..c735d5b8f
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/he/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..687c5da0f
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Setup
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/he/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..d1fb96a5c
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/he/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/he/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/he/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..93ca1ae9d
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Setup
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/he/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..ef85ce675
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Setup
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/he/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..67ba71708
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Setup
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/he/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..d7cf9db54
--- /dev/null
+++ b/src/locales/he/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/he/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/he/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/he/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/he/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/he/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/he/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/he/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..1f9f0fea3
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/he/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..64a5b22b0
--- /dev/null
+++ b/src/locales/he/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/he/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/he/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/he/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/he/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..91f3bdf73
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/he/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..95b76a723
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/he/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..355a11de2
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/he/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..f15821b9e
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/he/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..dfe4c8900
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/he/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..903928096
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Setup
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/he/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..c5595e80f
--- /dev/null
+++ b/src/locales/he/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..79b65068e
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Setup
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..9d1438f4b
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..a0f162eeb
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..14b374cc9
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..9d8960e5c
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Setup
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..b2ac152d1
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..479e0e3fd
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..98ff5f56b
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/he/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/your-first-song-comments.js.txt b/src/locales/he/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..d25a49cec
--- /dev/null
+++ b/src/locales/he/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Setup
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/he/v2/code-examples/your-first-song-comments.py.txt b/src/locales/he/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..a077c3b76
--- /dev/null
+++ b/src/locales/he/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/he/v2/custom-functions.adoc b/src/locales/he/v2/custom-functions.adoc
index bd5276d39..87521dcf6 100644
--- a/src/locales/he/v2/custom-functions.adoc
+++ b/src/locales/he/v2/custom-functions.adoc
@@ -1,16 +1,18 @@
[[customfunctionssongstructure]]
-== מבנה השיר ופונקציות המוגדרות על-ידי המתכנת/ת
+== Custom Functions and Song Structure
+
:nofooter:
-מבנה השיר הוא ארגון השיר בזמן: האופן בו נחבר קטעים משמעותיים ומעברים ביניהם ונגרום למוסיקה לזרום. בפרק זה תצרו פונקציות: פונקציות המוגדרות על-ידי המתכנת/ת, כדי לקבוע את מבנה השיר!
+The song structure is the song's organization over time. The goal is to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own function, custom functions, to structure your songs!
[[asongsstructure]]
-=== מבנה השיר
+=== A song's structure
+
:nofooter:
-שיר יכול להתחלק *לקטעים*. קטע מורכב ממספר תיבות והוא מבטא רעיון או תחושה. בדרך כלל, מוסיקאים מנסים ליצור קונטרסט (ניגודיות) בין קטעים שונים. פתיחה, בית, פזמון וקטע סיום הם דוגמאות לקטעים.
+A song can be divided into *sections*. קטע מורכב ממספר תיבות והוא מבטא רעיון או תחושה. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
-*צורה*, או מבנה שיר, נפוץ הוא ABA. הקטעים A ו-B הם שני קטעים שונים. למשל, בית ופזמון. קטע B מוסיף גיוון, והחזרה לקטע A שומרת על אחידות ומעוררת תחושה של חזרה למשהו מוכר ובטוח. הקוד בהמשך יוצר שיר במבנה ABA. קטע B מכיל צלילים ניגודיים לצלילים בקטע A: בס איטי יותר ובעצמה גבוהה יותר, ותוספת של "חריקות":
+A common and simple *form*, or song structure, is ABA. הקטעים A ו-B הם שני קטעים שונים. למשל, בית ופזמון. קטע B מוסיף גיוון, והחזרה לקטע A שומרת אחידות ומעוררת תחושה של חזרה למשהו מוכר ובטוח. הקוד בהמשך יוצר שיר במבנה ABA. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
[[imediau2sections_052016png]]
.מבנה ABA ב-DAW
@@ -20,61 +22,64 @@ image::../media/U2/sections_052016.png[Alt Text]
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/custom-functions-a-b-a-form.py.txt[]
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
----
-
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/custom-functions-a-b-a-form.js.txt[]
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-בחרו שיר והאזינו לו. נסו להבחין בקטעים השונים. האם הצלחתן/ם להבחין מתי השיר עובר מקטע לקטע? כמה בתים יש לשיר וכמה פעמים חוזר הפזמון? איזה קונטרסט (ניגודיות) יש בין הקטעים? שתפו את השיר עם חבר/ה.
+בחרו שיר והאזינו לו. נסו להבחין בקטעים השונים. האם הצלחתן/ם להבחין מתי השיר עובר מקטע לקטע? How many times do you hear the chorus and verse? What kind of contrasts can you observe? שתפו את השיר עם חבר/ה.
****
-זכרו שמשפט מוסיקלי נשמע הכי טבעי כשהקליפים מאורגנים בקבוצות של 2,4,8,16 וכו'. כך שגם הקטעים בשיר שבחרתם/ן מכילים, קרוב לוודאי, 2, 4, 8 או 16 תיבות.
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
[[creatingyourcustomfunctions]]
=== הגדירו פונקציות
-בדוגמה הקודמת של שיר במבנה ABA, הקוד ארוך, וחוזר על עצמו בקטע A השני. יש דרך ליעל את כתיבת הקוד ולקצרו, בעזרת *פונקציות המוגדרות על-ידי המתכנת/ת*! נגדיר פונקציה שתיצור את קטע A, ונקרא לה פעמיים.
+בדוגמה הקודמת של שיר במבנה ABA, הקוד ארוך, וחוזר על עצמו בקטע A השני. There is a way to be more concise, thanks to *custom functions*! נגדיר פונקציה שתיצור את קטע A, ונקרא לה פעמיים.
-בשונה מפונקציות בהן השתמשנו בעבר, כמו `()fitMedia`, שהיו מוגדרות מראש, יהיה עלינו להגדיר את הפונקציה שתיצור את קטע A. כך נגדיר את הפונקציה:
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. כך נגדיר את הפונקציה:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/custom-functions-untitled1.py.txt[]
+include::code-examples/custom-functions-untitled1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/custom-functions-untitled1.js.txt[]
+include::code-examples/custom-functions-untitled1.js.txt[]
----
-. ()sectionA הוא השם שבחרנו לפונקציה. אפשר לבחור כל שם שתרצו. הקפידו לבחור בשם תיאורי, כך שהקוד יהיה קריא.
-. ההוראות הן *גוף* הפונקציה. הן מוזחות ימינה.
+. `sectionA()` is the name we chose for our function. You can choose any name you like. הקפידו לבחור בשם תיאורי, כך שהקוד יהיה קריא.
+. The instructions are the *body* of the function. הן מוזחות ימינה.
.תרגלו
****
-העתיקו והדביקו את הקוד בסקריפט חדש. הריצו את הקוד. שימו לב לכך שה-DAW נשאר ריק.
-זה בגלל שצריך *לקרוא* לפונקציה כדי להשתמש בה.
-כדי לקרוא לפונקציה, הוסיפו `()sectionA`, בשורה לא מוזחת, אחרי הגדרת הפונקציה. כשתריצו את הקוד תראו את קטע A ב-DAW.
+העתיקו והדביקו את הקוד בסקריפט חדש. הריצו את הקוד. שימו לב לכך שה-DAW נשאר ריק.
+That's because you need to *call* a function to use it.
+To call your function, add the line `sectionA()`, unindented, after your function definition. כשתריצו את הקוד תראו את קטע A ב-DAW.
****
-עכשיו, נרצה להוסיף את קטע A מתיבה תשע עד תיבה שלוש-עשרה. אבל, כשנקרא לפונקציה ()sectionA, הצלילים ימוקמו בתיבות אחת עד חמש. כדי לתקן זאת, נעביר *פרמטרים* לפונקציה.
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. To remedy this issue, we will create *parameters* for our function.
.תרגלו
****
-בסקריפט הנוכחי, 1. הוסיפו את הפרמטרים `startMeasure` ו- `endMeasure`, מופרדים על-ידי פסיקים, בתוך הסוגריים בהגדרת הפונקציה. (`sectionA(startMeasure,endMeasure)`).
-2. בגוף הפונקציה, החליפו את תיבת ההתחלה (1) ואת תיבת הסיום (5) בפרמטרים `startMeasure` ו-`endMeasure` בהתאמה.
-3. בקריאה לפונקציה, הוסיפו את הפרמטרים`1` ו-`5` בתוך הסוגריים. הריצו את הקוד וודאו שאין בו שגיאות.
-4. הוסיפו קריאה שנייה לפונקציה, הפעם עם הפרמטרים `9`ו-`13`. הריצו את הקוד וודאו שאין בו שגיאות.
-5. באופן דומה, הגדירו פונקציה לקטע B. קראו לפונקציה כדי למקם את קטע B מתיבה חמש עד תיבה תשע ומתיבה שלוש-עשרה עד תיבה שבע-עשרה.
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. When you call your function, add the parameters `1` and `5` between the parentheses. הריצו את הקוד וודאו שאין בו שגיאות.
+1. Add a second function call, this time with the parameters `9` and `13`. הריצו את הקוד וודאו שאין בו שגיאות.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
****
כך אמור להראות הקוד:
@@ -82,19 +87,17 @@ include::../../en/v2/code-examples/custom-functions-untitled1.js.txt[]
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
----
-
//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
-
[role="curriculum-python curriculum-mp4"]
[[video93py]]
video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
@@ -103,56 +106,56 @@ video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
[[video93js]]
video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
-
[[transitionstrategies]]
=== אסטרטגיות מעבר
-אחרי שלמדנו איך להגדיר פונקציות כדי לקבוע את מבנה השיר, נדון במעברים. *מעברים* מסייעים למעבר חלק מקטע לקטע. מעברים יכולים לחבר בית ופזמון, לטפס עד לנפילה, לערבל ערוצים או להחליף סולם (key). מטרת המעבר היא להפנות את תשומת הלב של המאזין/ה לכך ששינוי עומד להתרחש.
+Now that you know how to create custom functions to structure your song, let's look at transitions. *Transitions* help one section smoothly go into the next. מעברים יכולים לחבר בית ופזמון, לטפס עד לנפילה, לערבל ערוצים או להחליף סולם (key). The goal of a transition is to grab the listener's attention and let them know a change is about to occur.
להלן מספר דרכים ליצירת מעברים מוסיקליים:
-. *מצילה (Crash Cymbal)*: מיקום קול מצילה בביט הראשון של הקטע החדש. הקשיבו https://www.youtube.com/watch?v=RssWT0Wem2w&t=0m55s[לדוגמה^].
-. *מעבר תופים*: שינוי ריתמי למילוי המרווח לפני הקטע החדש. הקשיבו https://www.youtube.com/watch?v=YMskGG39Y0Y[לדוגמאות^] האלה.
-. *השמטת ערוצים*: השתקה זמנית של ערוצים מסוימים ליצירת הפסקות. הקשיבו ל-https://www.youtube.com/watch?v=PxIgHSOLO_Q[Imagine Dragon's Love], ב-16'1 כדוגמה.
-. *שינוי במלודיה*: הצגת שינויים באקורדים, קו הבס או המלודיה לפני הקטע החדש. לעיתים קרובות, תיקייה בתוך ספריית הצלילים של EarSketch מכילה וריאציות לריף.
-. *"מרים" (riser)*: תו או רעש שגובהו עולה בהדרגה. הוא מאוד נפוץ ב-EDM (קיצור של Electronic Dance Music), ויוצר ציפייה לירידה (drop). אפשר לחפש "riser" בדפדפן הצלילים. קול מצילה הפוך יכול לשמש כ-riser. לדוגמה: YG_EDM_REVERSE_CRASH_1. הקשיבו לדוגמה ל-riser https://www.youtube.com/watch?v=1KGsAozrCnA&t=31m30s[בסט טכנו של Carl Cox^].
-. *דרדור של סנר (snare roll)*: רצף מהיר של מכות בסנר, עם עלייה במהירות, בעצמה או בגובה הצליל. ליצירת דרדור סנר אפשר להשתמש בקליפים כמו RD_FUTURE_DUBSTEP_FILL_1 או HOUSE_BREAK_FILL_003, או להשתמש ב-`()makeBeat`. הקשיבו https://www.youtube.com/watch?v=c3HLuTAsbFE[לדוגמה^].
-. *Looping*: חזרה על מקטע של מלודיה לפני הקטע החדש. הקשיבו https://www.youtube.com/watch?v=AQg4wnbBjiQ[לדוגמה^] של looping שמבצע DJ.
-. *דעיכה צולבת (crossfading)*: הורדה הדרגתית של הווליום של הקטע תוך הגברת הווליום של הקטע החדש.
-. *אקדם (anacrusis)*: כשהמלודיה של הקטע החדש מקדימה במספר ביטים.
+. *Crash Cymbal*: Placing a crash cymbal on the first beat of a new section.
+. *Drum Fill*: A rhythmic variation to fill the gap before a new section.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Melody Variation*: Introducing a variation of the chords, bass line, or melody before the new section. לעיתים קרובות, תיקייה בתוך ספריית הצלילים של EarSketch מכילה וריאציות לריף.
+. *Riser*: A note or noise that increases in pitch. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. אפשר לחפש "riser" בדפדפן הצלילים. קול מצילה הפוך יכול לשמש כ-riser. לדוגמה: YG_EDM_REVERSE_CRASH_1.
+. *Snare Roll*: A sequence of repeated snare hits, with increasing density, pitch, or amplitude. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping*: Repeating a short segment of melody before a new section.
+. *Crossfading*: Decreasing the volume of one section while increasing the volume of a new section.
+. *Anacrusis*: When the melody of the new section starts a couple beats early.
.תרגלו
****
-עברו על רשימת המעברים האפשריים, בחרו שניים מתוכם ונסו לממש אותם בקוד. עבדו בזוגות, זה יכול לעזור. אחרי שהבנתם איך לממש מעברים בקוד, תוכלו להסתכל בדוגמאות הבאות.
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. עבדו בזוגות, זה יכול לעזור. Once you've thought about it, you can have a look at the examples below.
+
+The transition should be placed one or two measures before the new section. תוכלו להשתמש במספר טכניקות מעבר מעבר בו-זמנית.
****
-המעבר צריך להיות ממוקם תיבה או שתיים לפני הקטע החדש. תוכלו להשתמש במספר טכניקות מעבר מעבר בו-זמנית.
מעבר תופים:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
----
-הטכניקה של השמטת ערוצים דורשת רק שינויים במספר קריאות לפונקציה `()fitMedia`. ראו את הדוגמה למטה.
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. ראו את הדוגמה למטה.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
----
הדוגמה הבאה משתמשת במרימים (risers) ובמצילה (crash cymbal) במעבר.
@@ -160,37 +163,39 @@ include::../../en/v2/code-examples/custom-functions-transition-techniques-track-
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/custom-functions-transition-techniques-risers.py.txt[]
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/custom-functions-transition-techniques-risers.js.txt[]
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
----
+{nbsp} +
+
[[yourfullsong]]
=== השיר בשלמותו
-בתכנות ניתן ליצור *הפשטות (אבסטרקציות)*: חיבור של רעיונות ליצירת מושג אחד. בדיוק כמו שבמוסיקה מחברים מספר רעיונות מוסיקליים לקטע אחד. פונקציות הן סוג של הפשטה במדעי המחשב. הן מחברות מספר הוראות לכלי אחד שאפשר להשתמש בו בקלות. הפשטות כאלה מסייעות להבהיר את מבנה התוכנית.
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. פונקציות הן סוג של הפשטה במדעי המחשב. הן מחברות מספר הוראות לכלי אחד שאפשר להשתמש בו בקלות. הפשטות כאלה מסייעות להבהיר את מבנה התוכנית.
.תרגלו
****
-בתרגיל זה ניצור שיר שלם, באמצעות כל האמצעים שלמדנו וגילינו ב-EarSketch! הנה הצעה לדרך העבודה על השיר. תוכלו להתאים את דרך העבודה כך שתהיה נוחה לכן/ם:
+Let's create a full song using all the tools you've discovered in EarSketch! הנה הצעה לדרך העבודה על השיר. תוכלו להתאים את דרך העבודה כך שתהיה נוחה לכן/ם:
-. בחרו נושא, או מסר, לשיר. חשבו על סוגי הצלילים, הכלים והמילים שיעבירו את המסר בצורה הטובה ביותר.
-. בחרו מבנה פשוט לשיר.
-. ולסיום, התחילו לכתוב קוד! התחילו בבחירת צלילים ומיקומם בעזרת הפונקציה `()fitMedia`.
-. השתמשו ב-`()makeBeat` כדי להוסיף כלי הקשה.
+. בחרו נושא, או מסר, לשיר. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. בחרו מבנה פשוט לשיר.
+. ולסיום, התחילו לכתוב קוד! Start with some `fitMedia()` functions to select sounds.
+. Use `makeBeat()` to add some percussion.
. תוכלו להעלות לספריית הצלילים קליפים שלכם.
-. השתמשו בלולאות for למניעת חזרות בקוד.
-. בעזרת פונקציות, הגדירו קטעים בשיר, וקבעו את מבנה השיר.
-. הוסיפו מעברים (אחד או שניים) משמעותיים.
-. הוסיפו אפקטים עם ()serEffect.
+. Use `for` loops to reduce repetition in your code.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
. הוסיפו הוראות תנאי (if).
-. השתמשו במשתנים לאחסון נתונים כמו שמות קליפים, למשל.
+. Make sure you use variables to store some information such as sound constants.
. אל תשכחו להשתמש בהערות כדי להסביר מה עשיתם.
-. הריצו את הקוד מדי פעם, תוך כדי הכתיבה, כדי להקשיב למה שיצרתם/ן עד כאן. שנו את השיר עד שהוא יביע את רצונכן/ם.
+. Don't forget to regularly run your code and listen to your song. שנו את השיר עד שהוא יביע את רצונכן/ם.
. בחרו שם לשיר.
****
@@ -199,26 +204,25 @@ include::../../en/v2/code-examples/custom-functions-transition-techniques-risers
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
----
+
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
----
-בדוגמה הזו, השתמשנו בלולאה בתוך פונקציה שהגדרנו! השתמשנו בפרמטרים של הפונקציה (`start` ו-`end`) בלולאה.
-
+In this example, we have used a `for` loop inside a custom function! We have used parameters of the function (`start` and `end`) inside the for loop.
[[chapter7summary]]
=== סיכום פרק שביעי
-* *קטעים* הם אוספים של יחידות מוסיקליים הקשורות זו לזו. קטע נמשך על פני מספר תיבות. כל קטע מביע רעיון או רגש מסוימים.
-* *מעברים* הם פסקאות מוסיקליות המקשרות בין קטעים שונים.
-* המבנה והמגוון של השיר נקראים *הצורה (form)* של השיר. צורה נפוצה היא ABA.
-* *פונקציות המוגדרות של-ידי המתכנת* מבצעות משימה מוגדרת. יש להגדיר את הפונקציה לפני שקוראים לה. לפונקציה יכול להיות מספר כלשהו של פרמטרים.
-* *הפשטה (אבסטרקציה)* היא חיבור של רעיונות ליצירת מושג אחד. המושג שנוצר, יותר כללי מהמושגים שיצרו אותו. פונקציות הן דוגמה להפשטה.
-
+* *Sections* are related musical units consisting of multiple measures. כל קטע מביע רעיון או רגש מסוימים.
+* *Transitions* are passages of music used to connect consecutive musical sections.
+* The structure and variety found within a song is known as its *form*. צורה נפוצה היא ABA.
+* *Custom functions* are unique functions written by the programmer to accomplish a specific task. יש להגדיר את הפונקציה לפני שקוראים לה. You can create as many parameters as you want.
+* An *abstraction* is the bundling of ideas to form a single, often less complex, concept. פונקציות הן דוגמה להפשטה.
[[chapter-questions]]
=== שאלות
@@ -226,6 +230,7 @@ include::../../en/v2/code-examples/custom-functions-total-atlanta-song-of-summer
[question]
--
מי מהבאים אינו דוגמה לקטע מוסיקלי?
+
[answers]
* תופים
* פתיחה
@@ -236,6 +241,7 @@ include::../../en/v2/code-examples/custom-functions-total-atlanta-song-of-summer
[question]
--
מהי הפשטה (אבסטרקציה)?
+
[answers]
* חיבור של מספר רעיונות למושג אחד
* מגוון של צלילים לאורך הקטע
@@ -246,31 +252,34 @@ include::../../en/v2/code-examples/custom-functions-total-atlanta-song-of-summer
[role="curriculum-python"]
[question]
--
-מי מהבאים מגדיר, בצורה נכונה, את הפונקציה `()myFunction` עם הפרמטרים `startMeasure` ו-`endMeasure` ?
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
[answers]
-* `:def myFunction(startMeasure, endMeasure)`
-* `:()def myFunction`
-* `:myFunction(startMeasure, endMeasure)`
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
* `myFunction(2, 5)`
--
[role="curriculum-javascript"]
[question]
--
-מי מהבאים מגדיר, בצורה נכונה, את הפונקציה `()myFunction` עם הפרמטרים `startMeasure` ו-`endMeasure` ?
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
[answers]
-* `{}function myFunction(startMeasure, endMeasure) `
-* `{}()function myFunction`
-* `{}myFunction(startMeasure, endMeasure)`
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
* `myFunction(2, 5)`
--
[question]
--
מי מהבאים אינו דוגמה למעבר?
+
[answers]
* עקביות (קונסיסטנטיות) של המלודיה
* מצילה
* "מרים" (riser)
-* השמטת ערוצים
---
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/he/v2/data-structures.adoc b/src/locales/he/v2/data-structures.adoc
index dda99866d..74ac1a759 100644
--- a/src/locales/he/v2/data-structures.adoc
+++ b/src/locales/he/v2/data-structures.adoc
@@ -1,44 +1,45 @@
[[getorganizedwithdatastructures]]
-== ארגון הקוד בעזרת מבני נתונים
+== מבני נתונים
+
:nofooter:
[role="curriculum-python"]
-לרשותנו כלים רבים ליצירת שירים ב-EarSketch. הסקריפטים שכתבנו עלולים להיות מאוד ארוכים. בפרק זה תלמדו איך לארגן את הקוד, בעיקר בעזרת רשימות (lists) ופונקציונליות חדשה של `()makeBeat`.
+לרשותנו כלים רבים ליצירת שירים ב-EarSketch. הסקריפטים שכתבנו עלולים להיות מאוד ארוכים. This chapter will help you organize your code further, in particular using a special abstraction called lists, and a new functionality of `makeBeat()`.
[role="curriculum-javascript"]
-לרשותנו כלים רבים ליצירת שירים ב-EarSketch. הסקריפטים שכתבנו עלולים להיות מאוד ארוכים. בפרק זה תלמדו איך לארגן את הקוד, בעיקר בעזרת מערכים (arrays) ופונקציונליות חדשה של `()makeBeat`.
+לרשותנו כלים רבים ליצירת שירים ב-EarSketch. הסקריפטים שכתבנו עלולים להיות מאוד ארוכים. This chapter will help you organize your code further, in particular using a special abstraction called arrays, and a new functionality of `makeBeat()`.
[[datastructures]]
-=== מבני נתונים
+=== What is a Data Structure
[role="curriculum-python"]
-רשימות ארוכות של משתנים שמאחסנים צלילים, אפשר לארגן ביעילות בעזרת *רשימות (lists)*. *רשימה*, שנקראת מערך (array) בשפות תכנות מסוימות, היא אוסף של ערכים, או *אלמנטים*, בתוך סוגריים מרובעים (`[]`) המופרדים על-ידי פסיקים. הנה דוגמה:
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. הנה דוגמה:
[role="curriculum-javascript"]
-רשימות ארוכות של משתנים שמאחסנים צלילים, אפשר לארגן ביעילות בעזרת *מערכים (arrays)*. *מערך*, שנקרא רשימה (list) בשפות תכנות מסוימות, היא אוסף של ערכים, או *איברים*, בתוך סוגריים מרובעים (`[]`) המופרדים על-ידי פסיקים. הנה דוגמה:
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. הנה דוגמה:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-instead-of-writing-this.py.txt[]
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-instead-of-writing-this.js.txt[]
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
----
[role="curriculum-python"]
-לאחר החלפת משתנים ברשימה, כיצד נתן לגשת לתוכן הרשימה? על-ידי שימוש באינדקסים. לכל איבר ברשימה יש אינדקס, החל מ-`0`. בדוגמה הקודמת, `drums[0]` מכיל את הקליפ `OS_KICK03`, `drums[1]` מכיל את הקליפ `OS_OPENHAT01` ו-`drums[3]` מכיל את הקליפ OS_SNARE05.
+If you have replaced variables with a list, how will you reference the content of the list? על-ידי שימוש באינדקסים. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
[role="curriculum-javascript"]
-לאחר החלפת משתנים במערך, כיצד נתן לגשת לתוכן המערך? על-ידי שימוש באינדקסים. לכל איבר במערך יש אינדקס, החל מ-`0`. בדוגמה הקודמת, `drums[0]` מכיל את הקליפ `OS_KICK03`, `drums[1]` מכיל את הקליפ `OS_OPENHAT01` ו-`drums[3]` מכיל את הקליפ OS_SNARE05.
+If you have replaced variables with an array, how will you reference the content of the array? על-ידי שימוש באינדקסים. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
.תרגלו
****
-צרו מערך המכיל שלושה שמות של קליפים.
-השתמשו בשלוש קריאות ל-`()fitMedia` כדי למקם את שלושת הקליפים בשלושת הערוצים הראשונים, מתיבה אחת יעד תיבה חמש.
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
****
הנה דוגמה:
@@ -46,30 +47,31 @@ include::../../en/v2/code-examples/data-structures-instead-of-writing-this.js.tx
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-list.py.txt[]
+include::code-examples/data-structures-list.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-arrays.js.txt[]
+include::code-examples/data-structures-arrays.js.txt[]
----
-[[Graphic]]
//.The EarSketch Share window for collaboration (Let Others Edit)
+
//[caption="Figure 21.4.2: "]
+
image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
[role="curriculum-python"]
-ראינו כיצד `list[index]` מתייחס לאיבר של הרשימה. אפשר להשתמש בביטוי זה כדי לשנות איבר של הרשימה. לדוגמה: `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` בדוגמה הקודמת, ישנה את האיבר הראשון של הרשימה ל-`RD_ROCK_POPRHYTHM_MAINDRUMS_11`. זה דומה לעדכון ערך משתנה, שגם בו השתמשנו *באופרטור ההשמה* `=`.
+We've seen that `list[index]` will reference an element of the list. אפשר להשתמש בביטוי זה כדי לשנות איבר של הרשימה. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
[role="curriculum-javascript"]
-ראינו כיצד `array[index]` מתייחס לאיבר של המערך. אפשר להשתמש בביטוי זה כדי לשנות איבר של המערך. לדוגמה: `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` בדוגמה הקודמת, ישנה את האיבר הראשון של המערך ל-`RD_ROCK_POPRHYTHM_MAINDRUMS_11`. זה דומה לעדכון ערך משתנה, שגם בו השתמשנו *באופרטור ההשמה* `=`.
+We've seen that `array[index]` will reference an element of the array. אפשר להשתמש בביטוי זה כדי לשנות איבר של המערך. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
.תרגלו
****
-שנו את הדוגמה הקודמת, כך שתשתמש בלולאה כדי להימנע מקריאה לפונקציה`fitMedia()` שלוש פעמים. השתמשו במספר הערוץ כמונה הלולאה.
-האינדקס חייב להתחיל ב-`0`, בעוד מספר הערוץ מתחיל ב-`1`. בתוך הלולאה צרו משתנה שיהווה `אינדקס` שערכו מספר הערוץ פחות אחת.
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. השתמשו במספר הערוץ כמונה הלולאה.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
****
למטה ישנה דוגמה. הסתכלו בקונסול וראו מה הסקריפט מדפיס בזמן הריצה.
@@ -77,35 +79,35 @@ image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-iterating-through-lists.py.txt[]
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-iterating-through-arrays.js.txt[]
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
----
[role="curriculum-python"]
-טיפ מועיל: הפונקציה ()len, עם שם הרשימה (list) כפרמטר, מחזירה את מספר איברי הרשימה. כך ש-`list[0]` הוא האיבר הראשון של `list`, ו- `list[len(list)-1]` הוא האיבר האחרון שלה. לדוגמה, אם `list = ["Hello","fellow","EarSketchers"]`, אז `len(list)` מחזירה `3`. האינדקסים הם `0`, `1` ו-`2`. האינדקס האחרון הוא 2 = 3-1.
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. האינדקס האחרון הוא 2 = 3-1.
[role="curriculum-javascript"]
-טיפ מועיל: ערך התכונה `length` (`array.length`) הוא מספר האיברים במערך. כך ש-`array[0]` הוא האיבר הראשון של `array`, ו- `array[array.length-1]` הוא האיבר האחרון שלו. לדוגמה, אם `array = ["Hello","fellow","EarSketchers"]`, אז ערכה של `array.length` הוא `3`. האינדקסים הם `0`, `1` ו-`2`. האינדקס האחרון הוא 2 = 3-1.
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. האינדקס האחרון הוא 2 = 3-1.
[role="curriculum-python"]
.תרגלו
****
-ניצור פתיחה לשיר ב-EarSketch בה כלים (ערוצים) יתווספו למוסיקה אחד אחד לאורך זמן. לדוגמה, הערוץ הראשון יתחיל בתיבה הראשונה, הערוץ השני יתחיל בתיבה השנייה וכו'. הדרגה בהוספה שימושית בפתיחה של שיר. למשל, שירו של https://www.youtube.com/watch?v=L53gjP-TtGEKanye[Kanye West's "Power"^].
-בעזרת לולאה ורשימה, צרו פתיחה כזו מתיבה אחת עד חמש. כמו בדוגמה הקודמת, תוכלו להשתמש ב-`track` כמונה, ובמשתנה נוסף `כאינדקס`. בנוסף, תוכלו ליצור משתנה בשם `measure`.
-השתמשו בפונקציה `()len`.
+ניצור פתיחה לשיר ב-EarSketch בה כלים (ערוצים) יתווספו למוסיקה אחד אחד לאורך זמן. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
****
[role="curriculum-javascript"]
.תרגלו
****
-ניצור פתיחה לשיר ב-EarSketch בה כלים (ערוצים) יתווספו למוסיקה אחד אחד לאורך זמן. לדוגמה, הערוץ הראשון יתחיל בתיבה הראשונה, הערוץ השני יתחיל בתיבה השנייה וכו'. הדרגה בהוספה שימושית בפתיחה של שיר. למשל, שירו של https://www.youtube.com/watch?v=L53gjP-TtGEKanye[Kanye West's "Power"^].
-בעזרת לולאה ומערך, צרו פתיחה כזו מתיבה אחת עד חמש. כמו בדוגמה הקודמת, תוכלו להשתמש ב-`track` כמונה, ובמשתנה נוסף `כאינדקס`. בנוסף, תוכלו ליצור משתנה בשם `measure`.
-השתמשו בתכונה `length`.
+ניצור פתיחה לשיר ב-EarSketch בה כלים (ערוצים) יתווספו למוסיקה אחד אחד לאורך זמן. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
****
הנה דוגמה:
@@ -113,59 +115,35 @@ include::../../en/v2/code-examples/data-structures-iterating-through-arrays.js.t
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-additive-introduction.py.txt[]
+include::code-examples/data-structures-additive-introduction.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-additive-introduction.js.txt[]
+include::code-examples/data-structures-additive-introduction.js.txt[]
----
+{nbsp} +
+
[[usingdatastructureswithmakebeat]]
-=== שימוש במבני נתונים עם `()makeBeat`
+=== Use Data Structures with `makeBeat()`
[role="curriculum-python"]
-נראה שתי דרכים לשימוש במבני נתונים עם `()makeBeat`. ראשית, נראה עד כמה דומות מחרוזות ורשימות:
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
[role="curriculum-javascript"]
-נראה שתי דרכים לשימוש במבני נתונים עם `()makeBeat`. ראשית, נראה עד כמה דומים מערכים ומחרוזות:
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
[role="curriculum-python"]
-1. כמו לרשימות, גם למחרוזות יש אינדקסים. *האינדקס* מייצג את מיקום התו (character) במחרוזת, החל מ-0. לדוגמה, ערכו של`[3]"Sarah"` הוא`a`.
-2. אפשר להשתמש בפונקציה `()len` עם מחרוזות, והיא תחזיר את מספר התווים במחרוזת. התו האחרון נמצא באינדקס`len(string)-1`.
-האינדקסים במחרוזת `"EarSketch"` מוצגים בטבלה הבאה.
-
-
-[cols="h,^,^,^,^,^,^,^,^,^"]
-|===
-|תו
-|E
-|a
-|r
-|S
-|k
-|e
-|t
-|c
-|h
-
-|אינדקס
-|0
-|1
-|2
-|3
-|4
-|5
-|6
-|7
-|8
-|===
+* כמו לרשימות, גם למחרוזות יש אינדקסים. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
[role="curriculum-javascript"]
-1. כמו למערכים, גם למחרוזות יש אינדקסים. *האינדקס* מייצג את מיקום התו (character) במחרוזת, החל מ-0. לדוגמה, ערכו של`[3]"Sarah"` הוא`a`.
-2. אפשר להשתמש בתכונה (attribute) `length.` עם מחרוזות, והיא תחזיר את מספר התווים במחרוזת. התו האחרון נמצא באינדקס`string.length-1`.
-האינדקסים במחרוזת `"EarSketch"` מוצגים בטבלה הבאה.
+* כמו למערכים, גם למחרוזות יש אינדקסים. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
[cols="h,^,^,^,^,^,^,^,^,^"]
|===
@@ -192,32 +170,30 @@ include::../../en/v2/code-examples/data-structures-additive-introduction.js.txt[
|8
|===
-
-
[role="curriculum-python"]
-3. אפשר לשרשר רשימות כמו שמשרשרים מחרוזות. שרשור נעשה בעזרת אופרטור השרשור (`+`): התחביר (syntax) הוא `newList = listA + listB`.
+* אפשר לשרשר רשימות כמו שמשרשרים מחרוזות. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
[role="curriculum-javascript"]
-3. אפשר לשרשר מערכים כמו שמשרשרים מחרוזות. השרשור נעשה בעזרת `concat` שהיא *פעולה (method)*. פעולה דומה לפונקציה, בכך שיש לה סוגריים המכילים פרמטרים. כדי להשתמש בה, כותבים את שמה אחרי שם המערך ומוסיפים נקודה ביניהם: התחביר (syntax) הוא `newArray = arrayA.concat(arrayB)`. צורת כתיבה זו נקראת *dot-notation*.
+* אפשר לשרשר מערכים כמו שמשרשרים מחרוזות. We use the `concat` *method*. פעולה דומה לפונקציה, בכך שיש לה סוגריים המכילים פרמטרים. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
[role="curriculum-python"]
-4. אפשר לחתוך מחרוזת ולקבל *תת-מחרוזת (substring)*. זה מאפשר לחתוך ביט, טכניקה פופולרית במוסיקה אלקטרונית ורמיקסינג. התחביר (syntax) הוא `newString = oldString[startIndex: endIndex]`. התת-מחרוזת כוללת את התו באינדקס`startIndex`, אבל לא את התו באינדקס `endIndex`. לדוגמה, הערך של `[1,4]"Sarah"` הוא `"ara"`. אפשר לעשות כך גם עם רשימות: `newList = oldList[startIndex: endIndex]`.
+* You can get a *substring*, also known as a slice, of a larger string. זה מאפשר לחתוך ביט, טכניקה פופולרית במוסיקה אלקטרונית ורמיקסינג. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
[role="curriculum-javascript"]
-4. אפשר לחתוך מחרוזת ולקבל *תת-מחרוזת (substring)*. זה מאפשר לחתוך ביט, טכניקה פופולרית במוסיקה אלקטרונית ורמיקסינג. התחביר הוא `newString = oldString.substring(startIndex, endIndex)`. התת-מחרוזת כוללת את התו באינדקס`startIndex`, אבל לא את התו באינדקס `endIndex`.לדוגמה, ערכה של `Sarah".substring(1,4)"` הוא `"ara"`. אפשר לעשות אותו דבר עם מערכים, בעזרת הפעולה (method) `()slice`. התחביר הוא: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` ו-`slice()` הן פעולות, וכולן משתמשות ב-dot notation.
+* You can get a *substring*, also known as a slice, of a larger string. זה מאפשר לחתוך ביט, טכניקה פופולרית במוסיקה אלקטרונית ורמיקסינג. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
[role="curriculum-python"]
.תרגלו
****
בסקריפט חדש:
-. צרו ארבעה משתנים: שתי מחרוזות תיפוף (`stringA` ו- `stringB`) ושתי רשימות של קליפים (`soundsA` ו- `soundsB`).
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
. הדפיסו את התו השני של כל מחרוזת.
. הדפיסו את האיבר האחרון של כל רשימה.
-. צרו והדפיסו את `stringC`, השרשור של `stringA` ו- `stringB`.
-. צרו והדפיסו את `soundsC`, השרשור של `soundsB`, `soundsA` ושוב`soundsA`.
-. צרו והדפיסו `stringD`, תת-מחרוזת של`stringC` מהתו השני עד התו החמישי (כולל).
-. צרו והדפיסו את `soundsD`, תת-רשימה של `soundC` מאיבר השלישי ועד האחרון (כולל).
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
****
[role="curriculum-javascript"]
@@ -225,30 +201,30 @@ include::../../en/v2/code-examples/data-structures-additive-introduction.js.txt[
****
בסקריפט חדש:
-. צרו ארבעה משתנים: שתי מחרוזות תיפוף (`stringA` ו- `stringB`) ושני מערכים של קליפים (`soundsA` ו- `soundsB`).
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
. הדפיסו את התו השני של כל מחרוזת.
. הדפיסו את האיבר האחרון של כל מערך.
-. צרו והדפיסו את `stringC`, השרשור של `stringA` ו- `stringB`.
-. צרו והדפיסו את `soundsC`, השרשור של `soundsB`, `soundsA` ושוב`soundsA`.
-. צרו והדפיסו `stringD`, תת-מחרוזת של`stringC` מהתו השני עד התו החמישי (כולל).
-. צרו והדפיסו את `soundsD`, תת-רשימה של `soundC` מאיבר השלישי ועד האחרון (כולל).
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
****
-הנה דוגמה לפתרון:
+Here is an example of a solution:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-string-and-lists-operations.py.txt[]
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-string-and-lists-operations.js.txt[]
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
----
-דוגמה לשימוש של עיבוד מחרוזות ושל `()makeBeat`:
+This is an example of how you can use string operations with `makeBeat()`:
[role="curriculum-python curriculum-mp4"]
[[video13py]]
@@ -261,36 +237,38 @@ video::./videoMedia/013-03-Substrings-JS.mp4[]
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-string-operations.py.txt[]
+include::code-examples/data-structures-string-operations.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-string-operations.js.txt[]
+include::code-examples/data-structures-string-operations.js.txt[]
----
[role="curriculum-python"]
-לסיום, `()makeBeat` יכולה לטפל במספר קליפים בבת-אחת. זה מאפשר למקם את כל כלי ההקשה (percussions) בערוץ אחד בעזרת קריאה אחת לפונקציה`()makeBeat`. במקום להעביר, כפרמטר הראשון, את שם הקליפ, אפשר להעביר רשימה של שמות קליפים. במחרוזת התיפוף, במקום להשתמש רק ב-`0` כדי לנגן קליפ, אפשר להשתמש במספרים מ-`0` עד `9`. המספרים הללו מציינים את האינדקס של הקליפ ברשימת הקליפים. ראו את הדוגמה "לפני ואחרי" שלהלן, עם מקצב ה-"בום פאם בום פאם".
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
[role="curriculum-javascript"]
-לסיום, `()makeBeat` יכולה לטפל במספר קליפים בבת-אחת. זה מאפשר למקם את כל כלי ההקשה (percussions) בערוץ אחד בעזרת קריאה אחת לפונקציה`()makeBeat`. במקום להעביר, כפרמטר הראשון, את שם הקליפ, אפשר להעביר מערך של שמות קליפים. במחרוזת התיפוף, במקום להשתמש רק ב-`0` כדי לנגן קליפ, אפשר להשתמש במספרים מ-`0` עד `9`. המספרים הללו מציינים את האינדקס של הקליפ במערך הקליפים. ראו את הדוגמה "לפני ואחרי" שלהלן, עם מקצב ה-"בום פאם בום פאם".
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-making-a-drum-set.py.txt[]
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-making-a-drum-set.js.txt[]
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-העתיקו את דוגמת הקוד מפרק 3.4 של ביטים לפי ז'אנר (סוגה). שנו אותה כך שתהיה רק קריאה אחת לפונקציה`()makeBeat` לכל ז'אנר. לפעמים ההיי-האט מנוגן בו זמנית עם הקיק או הסנר. במקרים אלו הוסיפו קריאה ל-`()makeBeat` רק בשביל ההיי-האט.
+העתיקו את דוגמת הקוד מפרק 3.4 של ביטים לפי ז'אנר (סוגה). Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
****
הנה הפתרון:
@@ -298,75 +276,65 @@ include::../../en/v2/code-examples/data-structures-making-a-drum-set.js.txt[]
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/data-structures-examples-of-beats.py.txt[]
+include::code-examples/data-structures-examples-of-beats.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/data-structures-examples-of-beats.js.txt[]
+include::code-examples/data-structures-examples-of-beats.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-צרו מקצבים (rhythms) עם הפונקציה `()makeBeat` ובעזרת מה שנלמד בשיעור זה. צפו שוב בקטע הווידאו בפרק 3.4 על ביטים לפי ד'אנר (סוגה), אם יש צורך בכך. אל תשכחו, שניתן להריץ את הקוד, לשמוע את הקטע ולתקן בהתאם.
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. צפו שוב בקטע הווידאו בפרק 3.4 על ביטים לפי ד'אנר (סוגה), אם יש צורך בכך. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
****
+{nbsp} +
+
[[evaluatingcorrectness]]
-=== הערכת נכונות
+=== Evaluate Correctness
-ברכותינו. רכשתן/ם מיומנויות מוסיקליות ותכנותיות שיאפשרו לכם/ן לכתוב שירים מקוריים ומעניינים עם EarSketch! הדבר האחרון שנרצה לדבר עליו, הוא איך ניתן לוודא שהקוד יהיה מסודר ופשוט ככל האפשר. הנה מספר עצות:
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. הנה מספר עצות:
-[role="curriculum-python"]
-* *תמצות* - צרו קוד קצר המשיג את מטרתו ביעילות. הנה מספר שאלות מנחות, שעוזרות לוודא שהקוד תמציתי:
-** האם העתקתי מספר קריאות לאותה פונקציה, אחת אחרי השנייה? (אם כן, ניתן לקצר את הקוד בעזרת לולאה!)
-** האם העתקתי את אותו בלוק של קוד מספר פעמים בסקריפט? (אם כן, כדאי להגדיר את הבלוק כפונקציה!)
-** האם יש שמות קליפים או ביטויים מתמטיים שחוזרים בקוד? (אם כן, צריך לשים את ערכם במשתנים! לפעמים רשימה יכולה לעזור)
-* *בהירות* מתייחסת לאופן בו הקוד מסביר את פעולתו ואת כוונת המתכנת/ת. אם קשה לחבר/ה להבין את הקוד שכתבת, הקוד, כנראה, לא בהיר. הנה מספר שאלות מנחות, שעוזרות לוודא שהקוד בהיר:
-** האם יש בקוד הערות פתיחה עם שם הסקריפט, שם המחבר/ת ותיאור?
-** האם שמות המשתנים והפונקציות תיאוריים? (אם לא, יש לשנות את השמות)
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. הנה מספר שאלות מנחות, שעוזרות לוודא שהקוד תמציתי:
+** האם העתקתי מספר קריאות לאותה פונקציה, אחת אחרי השנייה? If so, simplify with a loop!
+** האם העתקתי את אותו בלוק של קוד מספר פעמים בסקריפט? If so, put them in a function!
+** האם יש שמות קליפים או ביטויים מתמטיים שחוזרים בקוד? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. אם קשה לחבר/ה להבין את הקוד שכתבת, הקוד, כנראה, לא בהיר. הנה מספר שאלות מנחות, שעוזרות לוודא שהקוד בהיר:
+** האם שמות המשתנים והפונקציות תיאוריים? If not, rename them.
** האם יש, בכל בלוק של קוד, הערות המסבירות את הקוד, ביחוד בקטעים שעלולים להיות קשים להבנה?
** האם נעשה שימוש במבנים תכנותיים, כמו פונקציות (המוגדרות על-ידי המתכנת/ת) ולולאות, כדי לארגן את הקוד?
-** האם מבנה הסקריפט משקף את מבנה השיר? זה מאפשר קריאה שוטפת של הקוד.
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
-[role="curriculum-javascript"]
-* *תמצות* - צרו קוד קצר המשיג את מטרתו ביעילות. הנה מספר שאלות מנחות, שעוזרות לוודא שהקוד תמציתי:
-** האם העתקתי מספר קריאות לאותה פונקציה, אחת אחרי השנייה? (אם כן, ניתן לקצר את הקוד בעזרת לולאה!)
-** האם העתקתי את אותו בלוק של קוד מספר פעמים בסקריפט? (אם כן, כדאי להגדיר את הבלוק כפונקציה!)
-** האם יש שמות קליפים או ביטויים מתמטיים שחוזרים בקוד? (אם כן, צריך לשים את ערכם במשתנים! לפעמים מערך יכול לעזור)
-* *בהירות* מתייחסת לאופן בו הקוד מסביר את פעולתו ואת כוונת המתכנת/ת. אם קשה לחבר/ה להבין את הקוד שכתבת, הקוד, כנראה, לא בהיר. הנה מספר שאלות מנחות, שעוזרות לוודא שהקוד בהיר:
-** האם יש בקוד הערות פתיחה עם שם הסקריפט, שם המחבר/ת ותיאור?
-** האם שמות המשתנים והפונקציות תיאוריים? (אם לא, יש לשנות את השמות)
-** האם יש, בכל בלוק של קוד, הערות המסבירות את הקוד, ביחוד בקטעים שעלולים להיות קשים להבנה?
-** האם נעשה שימוש במבנים תכנותיים, כמו פונקציות (המוגדרות על-ידי המתכנת/ת) ולולאות, כדי לארגן את הקוד?
-** האם מבנה הסקריפט משקף את מבנה השיר? זה מאפשר קריאה שוטפת של הקוד.
-
-*משוב עמיתים/ות* נפוץ בתכנות ועוזר לשפר את הקוד ואת המוסיקה בעזרת הערות של חבר/ה. משוב חייב להיות *בונה*, כלומר, מעודד ולא "שובר". בנתינת משוב יש להיות:
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. בנתינת משוב יש להיות:
-* *ספציפי/ת* - יש להתייחס לבלוקים ספציפיים, לשורות קוד ספציפיות, לתיבות ספציפיות ולערוצים ספציפיים.
-* *תיאורי/ת* - יש לתאר את דרך החשיבה ואת התהליך שיובילו לשיפור השיר.
-* *רגיש/ה לחזון ולמטרות של הזולת* - הטעם המוסיקלי שלך לא צריך להיות גורם בהערכת שיר של חבר/ה.
-* *חיובי* - בנוסף לדברים הדורשים שיפור, יש לציין גם את החלקים החזקים בקוד ובשיר.
-* *לא השוואתי/ת* - יש להתייחס לקוד בפני עצמו ולא בהשוואה או בתחרות מול קוד אחר (שלך או של חבר/ה אחר/ת).
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
בדומה לכך, בקבלת משוב יש להיות:
-* *ספציפי/ת* - יש לציין מהם קטעי הקוד, שורות הקוד, התיבות והערוצים שדורשים, לדעתך, שיפור ועבודה נוספת. זה יקל על מתן משוב שיסייע לשיפור בשיר.
-* *קשוב/ה* - יש להמתין לסיום מתן המשוב לפני שתגיב/י עליו. יש להקשיב (באמת להקשיב...) לדברי המשוב. מומלץ לכתוב הערות בקוד המתארות את המשוב. הערות אלה יועילו כשתחזרו לקוד כדי לשפרו.
-* *חוקר/ת* - חשוב לשאול שאלות מפורטות על כל עניין שיש בו ספק: לוגיקה, טעויות אפשריות, אחידות מוסיקלית או כל אלמנט אחר.
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. זה יקל על מתן משוב שיסייע לשיפור בשיר.
+* *Listen* - Wait to respond until your peer has finished speaking. יש להקשיב (באמת להקשיב...) לדברי המשוב. מומלץ לכתוב הערות בקוד המתארות את המשוב. הערות אלה יועילו כשתחזרו לקוד כדי לשפרו.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
[role="curriculum-python"]
.תרגלו
****
צרו שיר וקבלו עליו משוב מחבר/ה. הנה מספר רעיונות כדי להתניע את כתיבת השיר:
-* מומלץ להחליט על הנושא של השיר ועל המבנה שלו לפני שמתחילים לכתוב את השיר. המבנה יכול להיות פשוט. ABA, למשל.
-* בחרו קליפים ונסו אפשרויות שונות. הגדירו משתנים לצלילים ומחרוזות תיפוף. השתמשו בפונקציות `()fitMedia` ו-`()makeBeat`. תוכלו להעלות צלילים שלכן/ם.
-* כשזה מועיל, השתמשו בלולאות והגדירו פונקציות.
-* הוסיפו אפקטים בעזרת `()setEffect`.
+* It's always recommended to think about a theme for your song and a structure before getting started. המבנה יכול להיות פשוט. ABA, למשל.
+* בחרו קליפים ונסו אפשרויות שונות. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. תוכלו להעלות לספריית הצלילים קליפים שלכם.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
* השתמשו בהוראת if כדי למקסס (להתאים את הווליום בכל ערוץ).
* בקשו קלט מהמשתמש/ת כדי לשנות משהו בשיר.
-* אם יש צורך הכך, השתמשו במערכים.
+* If necessary, place some elements in a list.
****
[role="curriculum-javascript"]
@@ -374,52 +342,40 @@ include::../../en/v2/code-examples/data-structures-examples-of-beats.js.txt[]
****
צרו שיר וקבלו עליו משוב מחבר/ה. הנה מספר רעיונות כדי להתניע את כתיבת השיר:
-* מומלץ להחליט על הנושא של השיר ועל המבנה שלו לפני שמתחילים לכתוב את השיר. המבנה יכול להיות פשוט. ABA, למשל.
-* בחרו קליפים ונסו אפשרויות שונות. הגדירו משתנים לצלילים ומחרוזות תיפוף. השתמשו בפונקציות `()fitMedia` ו-`()makeBeat`. תוכלו להעלות צלילים שלכן/ם.
-* כשזה מועיל, השתמשו בלולאות והגדירו פונקציות.
-* הוסיפו אפקטים בעזרת `()setEffect`.
+* It's always recommended to think about a theme for your song and a structure before getting started. המבנה יכול להיות פשוט. ABA, למשל.
+* בחרו קליפים ונסו אפשרויות שונות. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. תוכלו להעלות לספריית הצלילים קליפים שלכם.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
* השתמשו בהוראת if כדי למקסס (להתאים את הווליום בכל ערוץ).
* בקשו קלט מהמשתמש/ת כדי לשנות משהו בשיר.
* אם יש צורך הכך, השתמשו במערכים.
****
-[[conclusion]]
-=== סיכום
-
-תודה רבה על השתתפותכן/ם בהרפתקה של EarSketch! צוות EarSketch מקווה שנהניתן/ם ולמדתן/ם הרבה בעזרת כלי זה :) יש עוד מה לגלות ולחקור בפרקי הבחירה!
-
-////
-Thank you video
-////
-
-
[[chapter9summary]]
=== סיכום פרק תשיעי
[role="curriculum-python"]
-* *רשימה (list)* היא אוסף סדור של ערכים. זו דרך יעילה לאחסן נתונים. הערכים המאוחסנים ברשימה, ונקראים איברי הרשימה, יכולים להיות מכל טיפוס נתונים שהוא.
+* A *list* is a collection of values combined into a single entity, a good way to organize data. הערכים המאוחסנים ברשימה, ונקראים איברי הרשימה, יכולים להיות מכל טיפוס נתונים שהוא.
* כמו במחרוזות, לאיברי הרשימה יש אינדקסים. האינדקסים מתחילים מ-0.
-* הגישה לאיברי הרשימה היא בעזרת סוגריים מרובעים. למשל, `myList[1]`. לתווים במחרוזת ניתן לגשת בצורה דומה: `myString[1]`.
-* הפונקציה `len()` מחזירה את מספר איברי הרשימה, או את מספר התווים במחרוזת. התחביר (syntax) הוא:`len(list)`.
-* אפשר לשרשר ולחתוך רשימות בעזרת *אופרטורים של רשימות*, קבוצת אופרטורים לעיבוד רשימות.
-* התחביר (syntax) ליצירת תת-רשימה מרשימה קיימת הוא: `newList = oldList[startIndex: endIndex]`.
-* אפשר לחבר רשימות בעזרת אופרטור השרשור `+`. למשל, `newList = listA + listB`.
-* `()makeBeat` יכולה ליצור מקצבים ממספר קליפים בו זמנית, עם היא מקבלת פרמטר עם רשימת הקליפים ומחרוזת תיפוף המתייחסת לקליפים השונים0>. `()makeBeat` יכולה לגשת לקליפים באינדקסים 0 עד 9, בתנאי שהם מאוחסנים באותה רשימה.
-* החלפת מידע בונה עם הזולת היא צורה של *משוב עמיתים*. משוב עמיתים מספק הזדמנות ללמוד מהזולת.
-
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. משוב עמיתים מספק הזדמנות ללמוד מהזולת.
[role="curriculum-javascript"]
-* *מערך (array)* היא אוסף סדור של ערכים. זו דרך יעילה לאחסן נתונים. הערכים המאוחסנים במערך, ונקראים איברי המערך, יכולים להיות מכל טיפוס נתונים שהוא.
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
* כמו במחרוזות, לאיברי המערך יש אינדקסים. האינדקסים מתחילים מ-0.
-* הגישה לאיברי המערך היא בעזרת סוגריים מרובעים. למשל, `myArray[1]`. לתווים במחרוזת ניתן לגשת בצורה דומה: `myString[1]`.
-* התכונה `length` מחזירה את מספר איברי המערך, או את מספר התווים במחרוזת. התחביר (syntax) הוא `array.length` או `string.length`.
-* אפשר לשרשר ולחתוך מערכים בעזרת *אופרטורים של מערכים*, קבוצת כלים לעיבוד מערכים.
-* התחביר (syntax) ליצירת תת-מערך ממערך קיים הוא: `newArray = oldArray.slice(startIndex, endIndex)`.
-* התחבר (syntax) ליצירת תת-מחרוזת ממחרוזת קיימת הוא: `newString = oldString.substring(startIndex, endIndex)`.
-* אפשר לחבר מערכים בעזרת השיטה `concat()`. למשל, `newArray = arrayA.concat(arrayB)`.
-* `()makeBeat` יכולה ליצור מקצבים ממספר קליפים בו זמנית, עם היא מקבלת פרמטר עם מערךהקליפים ומחרוזת תיפוף המתייחסת לקליפים השונים0>. `()makeBeat` יכולה לגשת לקליפים באינדקסים 0 עד 9, בתנאי שהם מאוחסנים באותו מערך.
-* החלפת מידע בונה עם הזולת היא צורה של *משוב עמיתים*. משוב עמיתים מספק הזדמנות ללמוד מהזולת.
-
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. משוב עמיתים מספק הזדמנות ללמוד מהזולת.
[[chapter-questions]]
=== שאלות
@@ -427,6 +383,7 @@ Thank you video
[question]
--
מי מהפעולות הבאות משמשת לצירוף של רשימות/מערכים?
+
[answers]
* שרשור
* חיתוך
@@ -438,28 +395,31 @@ Thank you video
[question]
--
מהו האינדקס של האיבר הראשון ברשימה בפייתון?
+
[answers]
* `0`
* `1`
* `2`
-* `1-`
+* `-1`
--
[role="curriculum-python"]
[question]
--
-מה מחזירה `len(myList)`?
+What does `len(myList)` return?
+
[answers]
-* מספר האיברים ב-`myList`
-* טיפוס הנתונים של`myList`
-* האיברים של`myList`
-* הרוחב של`myList`
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
--
[role="curriculum-python"]
[question]
--
-מהו התחביר לשרשור שתי רשימות(`listA` ו-`listB`)?
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
[answers]
* `listA + listB`
* `listA ++ listB`
@@ -471,39 +431,43 @@ Thank you video
[question]
--
כיצד ניתן ליצור רשימה המכילה את כל איברי oldList, חוץ מהאיבר הראשון והאיבר האחרון?
+
[answers]
-* `oldList[1:len(oldList)-1]`
+* `oldList[1:len(oldList) - 1]`
* `oldList[1:len(oldList)]`
* `oldList[0:len(oldList)]`
-* `oldList[2:len(oldList-1)]`
+* `oldList[2:len(oldList - 1)]`
--
[role="curriculum-javascript"]
[question]
--
מהו האינדקס של האיבר הראשון במערך ב-Javascript?
+
[answers]
* `0`
* `1`
* `2`
-* `1-`
+* `-1`
--
[role="curriculum-javascript"]
[question]
--
-מה ערכו של `myArray.length`?
+What does `myArray.length` return?
+
[answers]
-* מספר האיברים ב-`myArray`
-* טיפוס הנתונים של `myArray`
-* האיברים של`myArray`
-* הרוחב של `myArray`
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
--
[role="curriculum-javascript"]
[question]
--
-מה התחביר (syntax) לשרשור שני מערכים (`arrayA` ו- `arrayB`)?
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
[answers]
* `arrayA.concat(arrayB)`
* `arrayA.concatenate(arrayB)`
@@ -514,10 +478,20 @@ Thank you video
[role="curriculum-javascript"]
[question]
--
-כיצד ניתן ליצור מערך מאיברי `oldArray` ללא האיבר הראשון והאיבר האחרון?
+How can you get an array from `oldArray` without the first and last elements?
+
[answers]
-* `oldArray.slice(1,oldArray.length-1]`
-* `oldArray.slice(1,oldArray.length)`
-* `oldArray.slice(0,oldArray.length)`
-* `oldArray.slice(2:oldArray.length-1)`
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
--
+
+[[conclusion]]
+=== סיכום
+
+תודה רבה על השתתפותכן/ם בהרפתקה של EarSketch! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/he/v2/effects-and-envelopes.adoc b/src/locales/he/v2/effects-and-envelopes.adoc
index 89cd97fb1..092b9e920 100644
--- a/src/locales/he/v2/effects-and-envelopes.adoc
+++ b/src/locales/he/v2/effects-and-envelopes.adoc
@@ -1,13 +1,16 @@
[[effectsandenvelopes]]
== אפקטים ומעטפות
+
:nofooter:
-EarSketch מאפשרת ליוצר/ת לשנות קליפים וליצור צלילים חדשים וייחודיים. זה נעשה בעזרת הפונקציה`()setEffect`, בה נתמקד בפרק זה.
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
[[effectsinearsketch]]
-=== שימוש באפקטים ב-EarSketch
+=== Use Effects in EarSketch
+
+:nofooter:
-*אפקטים* מאפשרים לשנות איכויות של צלילים. בדומה לאופן בו פילטרים משנים תמונה, הוספת אפקט משנה את הצליל. אפשר לשנות את העוצמה של הצליל ולהוסיף לו הד, למשל...
+*Effects* allow us to change qualities of sounds. בדומה לאופן בו פילטרים משנים תמונה, הוספת אפקט משנה את הצליל. For example, you can change the volume, add some echo or reverb, etc.
[role="curriculum-python curriculum-mp4"]
[[video4py]]
@@ -17,17 +20,17 @@ video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
[[video4js]]
video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
-נשתמש בפונקציה`()setEffect`, שמקבלת ארבעה פרמטרים, בדומה לפונקציה`()fitMedia`:
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
-. *trackNumber*: הערוץ אליו יתווסף האפקט.
-. *effectName*: האפקט עצמו.
-. *effectParameter*: הפרמטר של האפקט.
-. *effectValue*: הערך של הפרמטר: מספר בטווח ספציפי. הטווח תלוי בפרמטר של האפקט.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
.תרגלו
****
-כתבו שיר בשני ערוצים ושנו את העוצמה (ווליום) של שני הערוצים בעזרת הפונקציה `()setEffect`.
-במקרה זה, שם האפקט (הפרמטר השני) הוא VOLUME, והפרמטר של האפקט (הפרמטר השלישי) הוא GAIN. הערך של האפקט (הפרמטר הרביעי) הוא מספר של דציבלים (dB) בין 60- ל-12+.
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
****
הנה דוגמה:
@@ -35,72 +38,80 @@ video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-volume-effect.py.txt[]
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-volume-effect.js.txt[]
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
----
-דנו באפקט`VOLUME`. כעת נדון באפקט `DELAY`. האזינו לשני הקליפים הבאים. הראשון ללא האפקט, והשני עם האפקט *delay*.
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
ללא אפקט:
+
++++
audioMedia/reference.mp3
++++
עם אפקט delay:
+
++++
audioMedia/delay2.mp3
++++
-במקרה זה, שם האפקט (הפרמטר השני) הוא `DELAY`, והפרמטר של האפקט (הפרמטר השלישי) יכול להיות או `DELAY_TIME` (אורך הזמן לפני שההד "עונה") או `DELAY_FEEDBACK` (עוצמת ההד). הערך של `DELAY_TIME` הוא במילישניות (1000 מילישניות הן שניה אחת) והערך של`DELAY_FEEDBACK` הוא מספר בין 120- ו-1-.
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
.תרגלו
****
-. Read about the delay effect in the list of effects chapter here: <>
+. Read about the delay effect in the list of effects chapter here: <>
. הריצו את הקוד שמופיע בהמשך והקשיבו למוסיקה ללא אפקטים
-. הפכו ללא הערה את שורת `()setEffect` הראשונה והקשיבו להבדל
-. הפכו ללא הערה את שורת `()setEffect` השנייה והקשיבו להבדל (להפוך שורה ללא הערה פירושו למחוק מתחילת השורה את `#` או`//` ).
-שימו לב לכך שזמן ההשהיה (הפרמטר הרביעי) הוא 500mS, שהוא אורך של ביט (פעמה) אחד. מכיוון שהטמפו הוא 120bpm, יש ביט כל חצי שניה (1/2=60/120). שנייה אחת היא 1000 מילישניות, וחצי שנייה היא 500 מילישניות.
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. מכיוון שהטמפו הוא 120bpm, יש ביט כל חצי שניה (1/2=60/120). שנייה אחת היא 1000 מילישניות, וחצי שנייה היא 500 מילישניות.
שנו את זמן ההשהיה. האם המוסיקה נשמעת טוב יותר או לא?
****
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-delay-effect.py.txt[]
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-delay-effect.js.txt[]
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
----
+{nbsp} +
+
[[functionsandmoreeffects]]
=== פונקציות ועוד אפקטים
- עד עתה, השתמשנו במספר פונקציות ב-EarSketch כמו `()fitMedia` או `()setEffect`. שימו לב לכך, ששם של פונקציה תמיד מתחיל באות קטנה, והוא, לרוב, פועל. הסוגריים מורות למחשב *לקרוא* לפונקציה או *לבצע* אותה. *פרמטרים* (שלפעמים נקראים גם ארגומנטים), בתוך הסוגריים, מופרדים על-ידי פסיקים.
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. שימו לב לכך, ששם של פונקציה תמיד מתחיל באות קטנה, והוא, לרוב, פועל. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
[role="curriculum-python"]
-* לפונקציות `setTempo()`, `fitMedia()`, `makeBeat()`ו-`setEffect()` יש פרמטרים. הן חלק מה-Application Programming Interface - ממשק לתכנות
- אפליקציות , או, בקיצור, ה-*API*. ה-API של EarSketch מוסיף יכולות מוסיקליות לפייתון. דוגמה נוספת ל-API הוא ה-API של Googie Maps: אוסף כלים לשיבוץ מפות באתרים או יישומים.
-* בפרק מאוחר יותר נלמד איך ליצור פונקציות נוספות, המותאמות לצרכינו.
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. ה-API של EarSketch מוסיף יכולות מוסיקליות לפייתון. דוגמה נוספת ל-API הוא ה-API של Googie Maps: אוסף כלים לשיבוץ מפות באתרים או יישומים.
+* In a later chapter, you'll also learn how to create your own custom functions.
[role="curriculum-javascript"]
-* לפונקציות `setTempo()`, `fitMedia()`, `makeBeat()`ו-`setEffect()` יש פרמטרים. הן חלק מה-Application Programming Interface - ממשק לתכנות
- אפליקציות , או, בקיצור, ה-*API*. ה-API של EarSketch מוסיף יכולות מוסיקליות ל-JavaScript. דוגמה נוספת ל-API הוא ה-API של Googie Maps: אוסף כלים לשיבוץ מפות באתרים או יישומים.
-* בפרק מאוחר יותר נלמד איך ליצור פונקציות נוספות, המותאמות לצרכינו.
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. ה-API של EarSketch מוסיף יכולות מוסיקליות ל-JavaScript. דוגמה נוספת ל-API הוא ה-API של Googie Maps: אוסף כלים לשיבוץ מפות באתרים או יישומים.
+* In a later chapter, you'll also learn how to create your own custom functions.
כל פרמטר של פונקציה יכול להיות מטיפוס נתונים שונה. סדר הפרמטרים חשוב. הנה מספר דוגמאות לטיפוסי נתונים:
-* *מספרים*. *מספרים שלמים או Integers* (או int) הם מספרים שלמים כמו 0, 5 או 26-. *Floating point* הם מספרים ממשיים כמו 0.125 או 21.0-. לדוגמה, הפרמטרים מספר הערוץ, תיבת ההתחלה ותיבת הסיום, בפונקציה `()fitMedia` הם כולם מספרים.
-* * מחרוזות Strings*. מחרוזת תיפוף כמו `"----0000----0000"`, משמשת כפרמטר לפונקציה`()makeBeat`.
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
-בואו נמשיך לשחק עם הפונקציה `()setEffect`. קטע הווידאו הבא מראה כיצד להשתמש במספר אפקטים:
+Now, let's play more with the `setEffect()` function. קטע הווידאו הבא מראה כיצד להשתמש במספר אפקטים:
////
VIDEO IS BEEING MADE
@@ -108,65 +119,68 @@ more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNP
("videos revamping" tab)
////
-* Reverb (הדהוד)* הוא צליל שחוזר מהקירות אל האוזניים. הוא נותן תחושה של מרחב לצליל. חשבו על ההבדל בין דיבור בחדר קטן לדיבור בחלל של אולם גדול. ככל שהחדר גדול יותר, לוקח לצליל יותר זמן לחזור מהקירות לאוזניכם/ן, ונוצר הצליל המהדהד של אולם גדול. לאפקט `REVERB` יש פרמטרים לשליטה בזמן הדעיכה (`REVERB_DECAY`) ועצמת האפקט (`MIX`).
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. הוא נותן תחושה של מרחב לצליל. חשבו על ההבדל בין דיבור בחדר קטן לדיבור בחלל של אולם גדול. ככל שהחדר גדול יותר, לוקח לצליל יותר זמן לחזור מהקירות לאוזניכם/ן, ונוצר הצליל המהדהד של אולם גדול. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
הקשיבו לקליפים הבאים, ושמעו את התוצאה של הוספת reverb לערוץ:
ללא אפקט:
+
++++
audioMedia/reverbReference.mp3
++++
עם אפקט reverb:
+
++++
audioMedia/reverbEffect.mp3
++++
+{nbsp} +
+
.תרגלו
****
-Go to this chapter for a complete list of effects: <>.
-צרו שיר עם אפקט ווליום (volume) ושני אפקטים נוספים. אל תשכחו לתאר, בהערות, מה הקוד עושה ולהשתמש במשתנים, כשצריך.
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
****
-
-[[effectsandenvelopes]]
+[[effectsandenvelopes2]]
=== אפקטים ומעטפות
-לפעמים, נרצה שאפקט ישתנה בזמן. לדוגמה, נרצה שעצמת הצליל תלך ותגדל (fade in) בתחילת השיר.
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
-* מעטפות או envelopes* מאפשרות להגדיר כיצד ישתנה האפקט לאורך זמן.
+*Envelopes* allow us to define how an effect changes over time.
-נשתמש בשני זוגות של ערך וזמן. כל זוג כולל ערך של אפקט ותיבה מתאימה. לדוגמה, המשמעות של (3 ,0 ,1 ,60-) היא שנקודה אחת בעלת ערך 60- תמוקם בתיבה הראשונה, ושנקודה שנייה בעלת ערך 0 תמוקם בתיבה השלישית. המעטפת יוצרת קו בין שתי נקודות אלה, שנקרא *ramp או רמפה*:
+We will use two value-time pairs. כל זוג כולל ערך של אפקט ותיבה מתאימה. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
[[envelopepoints]]
.מעטפת (עם הערות) ב-EarSketch
-[caption="Figure 5.1: "]
+[caption="Figure 5.3.1: "]
image::../media/U2/NewEnvelope.png[Alt Text]
-הגדרת המעטפת נעשית בפונקציה`()setEffect`שיש לה שבעה פרמטרים. ארבעת הפרמטרים האחרונים הם שני הזוגות של ערך וזמן.
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
-. trackNumber
-. effectName
-. effectParameter
-. effectStartValue
-. effectStartLocation
-. effectEndValue
-. effectEndLocation
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
-שלושת הפרמטרים האחרונים הם *פרמטרים אופציונליים*. אם לא נקבע את ערכם, כפי שעשינו כשהשתמשנו ב-`setEffect()` עם ארבעה פרמטרים, האפקט יופעל על כל הערוץ.
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
הנה דוגמה של fade in:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-envelopes.py.txt[]
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-envelopes.js.txt[]
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
----
צפו בסרטון הבא המדגים מעטפות נוספות
@@ -175,42 +189,41 @@ include::../../en/v2/code-examples/effects-and-envelopes-envelopes.js.txt[]
[[video5b]]
video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
-
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
----
-
[role="curriculum-javascript curriculum-mp4"]
video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-צרו שיר חדש. השתמשו בלולאת for כדי להוסיף מעטפת לכל הערוצים (למשל, fade in ו-fade out לכל הערוצים), או כדי לחזור על אפקט באותו ערוץ. השתמשו באיזה אפקט שתרצו.
+צרו שיר חדש. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. השתמשו באיזה אפקט שתרצו.
השמיעו את השיר לחבר/ה, עם ובלי האפקט (כדי "לבטל" את האפקט, הפכו את השורות בקוד שמגדירות את האפקט להערות). על החבר/ה לנחש מהו האפקט.
****
-למטה ישנה דוגמה. כל איטרציה של הלולאה מוסיפה קטע באורך של תיבה אחת של המעטפת. השינוי האוטומטי של הפרמטר GAIN, יוצר דעיכות ריתמיות בעוצמה. זהו אפקט פופולרי ב-EDM, המודגם בשיר https://www.youtube.com/watch?v=Us_U-d2YN5Y[Rhythm] של Lvly. נסו לכבות ולהפעיל את האפקט ב-DAW כדי לשמוע את השפעת האפקט (בעזרת כפתור "bypass" משמאל לערוץ האפקט ב-DAW).
-
+Below is an example of the above practice. כל איטרציה של הלולאה מוסיפה קטע באורך של תיבה אחת של המעטפת. Automating the GAIN parameter creates rhythmic volume fades. נסו לכבות ולהפעיל את האפקט ב-DAW כדי לשמוע את השפעת האפקט (בעזרת כפתור "bypass" משמאל לערוץ האפקט ב-DAW).
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
----
And here is an example of fade in and fade out on all the tracks:
@@ -218,30 +231,31 @@ And here is an example of fade in and fade out on all the tracks:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
----
+
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
----
+{nbsp} +
[[chapter5summary]]
=== סיכום פרק חמישי
-* *אפקטים* משנים את איכויות הצליל, והופכים את הצליל לייחודי.
-* *Volume* משנה את עצמת הקול. *Delay* יוצר הד. *Reverb* גורם לצליל להישמע כאילו הוא מנוגן בחלל של אולם גדול. *Panning* ממקם את הצליל בצד ימין או בצד שמאל.
-* אפקטים מופעלים ב-EarSketch בעזרת הפונקציה `()setEffect`. התחביר שלה הוא: `setEffect(trackNumber, effectName, effectParameter, effectValue)`.
-** *trackNumber*: הערוץ אליו יתווסף האפקט.
-** *effectName*: האפקט עצמו.
-** *effectParameter*: הפרמטר של האפקט.
-** *effectValue*: הערך של הפרמטר: מספר בטווח ספציפי.
-* *פונקציות* מכילות הוראות שעל המחשב לבצע. נתונים מועברים לפונקציה ב-*פרמטרים*, שמשפיעים על אופן ביצוע הפונקציה. התחביר של *קריאה* לפונקציה בעלת שני פרמטרים הוא: `myFunction(argument1, argument2)`. דוגמה לתחביר של *קריאה* לפונקציה בעלת ארבעה פרמטרים היא: `makeBeat(kick, 2, measure, kickBeat)`.
-* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
-* *מעטפות* מגדירות את האופן בו האפקט משתנה בזמן. הן מוגדרות בעזרת צמדים של ערך-זמן, כמו _(ערך, זמן, ערך, זמן)_.
-* להגדרת מעטפת, שבעת הפרמטרים של `()setEffect` הם: `setEffect(trackNumber, effectName, effectParameter, startEffectValue, effectStartLocation, endEffectValue, effectEndLocation)`.
-
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
[[chapter-questions]]
=== שאלות
@@ -249,6 +263,7 @@ include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js
[question]
--
מה אפקט מאפשר לעשות ב-EarSketch?
+
[answers]
* שינוי האיכויות של צליל בפרויקט
* הוספת צליל לערוץ
@@ -258,7 +273,8 @@ include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js
[question]
--
-מי מהבאים אינו פרמטר של `()setEffect`?
+Which of these is NOT a `setEffect()` argument?
+
[answers]
* Clip Name
* Effect Name
@@ -269,6 +285,7 @@ include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js
[question]
--
כיצד ניתן לקבוע את זמן ההשהיה (delay time) של אפקט delay, בערוץ השלישי, ל-50 מילישניות?
+
[answers]
* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
@@ -278,7 +295,8 @@ include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js
[question]
--
-מי מהבאים אינו פרמטר המשמש להגדרת מעטפת בעזרת הפונקציה `()setEffect`?
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
[answers]
* Clip Length
* Start Value
@@ -288,14 +306,16 @@ include::../../en/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js
[question]
--
-מה עושה הפונקציה `()setEffect`הבאה?
+What would the following `setEffect()` function do?
+
[source,python]
----
-setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 10)
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
----
+
[answers]
* מגדילה את כמות הדיסטורשן בערוץ הראשון לאורך 10 תיבות.
* מקטינה את כמות הדיסטורשן בערוץ הראשון לאורך 50 תיבות.
* מגבירה את הווליום של הערוץ הראשון לאורך 10 תיבות.
* מחלישה את הווליום של הערוץ הראשון לאורך 50 תיבות.
---
+--
\ No newline at end of file
diff --git a/src/locales/he/v2/get-user-input.adoc b/src/locales/he/v2/get-user-input.adoc
index ec986d60a..480852ac6 100644
--- a/src/locales/he/v2/get-user-input.adoc
+++ b/src/locales/he/v2/get-user-input.adoc
@@ -1,8 +1,9 @@
[[getuserinput]]
== קלט מהמשתמש
+
:nofooter:
-בפרק זה נלמד איך לבקש קלט מהמשתמש, ואיך להתאים את המוסיקה לקלט. לשם כך, נכיר את ההוראה return ואת הפונקציה`()readInput`.
+בפרק זה נלמד איך לבקש קלט מהמשתמש, ואיך להתאים את המוסיקה לקלט. For that, we'll look at return statements and the `readInput()` function.
[[returnstatement]]
=== הוראת return
@@ -17,86 +18,39 @@ video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
[[video131js]]
video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
-. פונקציות יכולות לקבל פרמטרים. בנוסף, הן יכולות להחזיר ערך.
-. *return* היא הוראה ש: א. מורה לפונקציה להחזיר ערך. ב. גורמת לפונקציה לסיים את ריצתה. אם ישנן הוראות אחרי הוראת ה-`return` המחשב יתעלם מהן.
-. כדי להשתמש בערך המוחזר מהפונקציה, יש ליצור משתנה ולהציב בו את הקריאה לפונקציה.
-. הוראת return אינה הכרחית. ללא הוראת return הפונקציה לא תחזיר ערך. `()fitMedia` ו-`()setEffect`הן דוגמאות לפונקציות שלא מחזירות ערך.
+* In addition to taking inputs (parameters), functions can output a value. בנוסף, הן יכולות להחזיר ערך.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. ב. גורמת לפונקציה לסיים את ריצתה. If you have any statements after the `return` keyword, they will be ignored.
+* כדי להשתמש בערך המוחזר מהפונקציה, יש ליצור משתנה ולהציב בו את הקריאה לפונקציה.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
הנה דוגמת קוד:
[role="curriculum-python"]
[source,python]
----
-# Return Statements: Linking two beats together with return statements
-
-# Setup
-from earsketch import *
-setTempo(100)
-
-rhythm1 = "0+++0+0+0+--0+00"
-rhythm2 = "0+0-00++0-000+++"
-
-# Music
-def createBeat(startMeasure, soundClip, beatString):
- endMeasure = startMeasure + 3
- for measure in range(startMeasure, endMeasure):
- makeBeat(soundClip, 1, measure, beatString)
-
- # Return ending measure so we can use it outside function
- return endMeasure
-
-# Function calls
-# Assigning the value we return to a variable
-newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
-
-# Passing the returned value into another function
-createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
+include::code-examples/get-user-input-return-statements.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Return Statements: Linking two beats together with return statements
-
-// Setup
-setTempo(100);
-
-var rhythm1 = "0+++0+0+0+--0+00";
-var rhythm2 = "0+0-00++0-000+++";
-
-// Music
-function createBeat(startMeasure, soundClip, beatString) {
- var endMeasure = startMeasure + 3;
- for (var measure = startMeasure; measure < endMeasure; measure++) {
- makeBeat(soundClip, 1, measure, beatString);
- }
-
- // Return ending measure so we can use it outside function
- return endMeasure;
-}
-
-// Function calls
-// Assigning the value we return to a variable
-var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
-
-// Passing the returned value into another function
-createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
+include::code-examples/get-user-input-return-statements.js.txt[]
----
עם הוראת return, בקרת הזרימה של הפונקציה נראית כך:
[[return]]
.בקרת הזרימה של הוראת return
-[caption="Figure 13.1: "]
+[caption="Figure 8.1.1: "]
image::../media/U2/Return.png[Alt Text]
.תרגלו
****
כתבו פונקציה, שתיצור קטע מוסיקלי, עם:
-* פרמטר אחד בלבד, שנקרא `start`, שמייצג את תיבת ההתחלה.
-* הוראת return אחת שמחזירה את תיבת הסיום.
-* גוף פונקציה שמכיל קריאות לפונקציה`()fitMedia`.
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
הקטע יכול להמשך מספר תיבות כרצונכם/ן.
הקוד יקרא לפונקציה וידפיס את תיבת הסיום.
@@ -107,59 +61,26 @@ image::../media/U2/Return.png[Alt Text]
[role="curriculum-python"]
[source,python]
----
-# Return Statements 2: Returning the end measure of a section function
-
-# Setup
-from earsketch import *
-setTempo(120)
-
-melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
-drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
-
-# Function definition
-def verse(start):
- end = start + 4
- fitMedia(melody1, 1, start, end)
- fitMedia(drums1, 2, start, end)
- return end
-
-# Function calls
-endMeasure = verse(1) # calling verse function and start is measure 1
-print(endMeasure)
+include::code-examples/get-user-input-return-statements-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Return Statements 2: Returning the end measure of a section function
-
-// Setup
-setTempo(120);
-
-var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
-var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
-
-// Function definition
-function verse(start) {
- var end = start + 4;
- fitMedia(melody1, 1, start, end);
- fitMedia(drums1, 2, start, end);
- return end;
-}
-// Function calls
-var endMeasure = verse(1); // calling verse function and start is measure 1
-println(endMeasure);
+include::code-examples/get-user-input-return-statements-2.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-נניח שכתבנו קטע בשם A, ואנחנו רוצים שהוא ישתנה מעט בכל הופעה שלו בשיר. ניצור פונקציה בשם `()sectionA` ובה שתי קריאות לפונקציה `()fitMedia`.
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
-לפונקציה יהיו שני פרמטרים: `start` ופרמטר בוליאני `variation` שיאפשר למתכנת לבקש מהפונקציה ליצור שינוי קל בקטע A.
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
-בגוף הפונקציה, נשתמש בהוראת תנאי (if) שתבדוק את ערך הפרמטר הבוליאני. בהתאם לערך הפרמטר הפונקציה תשנה את הקליפ בקריאות לפונקציה `()fitMedia`.
+בגוף הפונקציה, נשתמש בהוראת תנאי (if) שתבדוק את ערך הפרמטר הבוליאני. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
-נקרא לפונקציה עם תיבות התחלה שונות, בחלקן עם שינוי ובחלקן בלי שינוי.
+נקרא לפונקציה עם תיבות התחלה שונות, בחלקן עם שינוי ובחלקן בלי שינוי.
****
הנה דוגמה:
@@ -167,220 +88,127 @@ println(endMeasure);
[role="curriculum-python"]
[source,python]
----
-# Conditional statement: Using a boolean to create variation in a function
-
-# Setup
-from earsketch import *
-setTempo(120)
-
-melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
-melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
-drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
-
-# Function definition
-def verse(start, variation):
- # variation is either equal to True or False
- if variation:
- fitMedia(melody1, 1, start, start + 4)
- else:
- fitMedia(melody2, 1, start, start + 4)
- fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
-
-# Function calls
-verse(1, True)
-verse(7, False)
+include::code-examples/get-user-input-conditional-statement.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Conditional statement: Using a boolean to create variation in a function
-
-// Setup
-setTempo(120);
-
-var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
-var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
-var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
-
-// Function definition
-function verse(start, variation) {
- // variation is either equal to true or false
- if (variation) {
- fitMedia(melody1, 1, start, start + 4);
- } else {
- fitMedia(melody2, 1, start, start + 4);
- }
- fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
-}
-
-// Function calls
-verse(1, true);
-verse(7, false);
+include::code-examples/get-user-input-conditional-statement.js.txt[]
----
+{nbsp} +
+
[[userinput]]
-=== קבלת קלט מהמשתמש
+=== קלט מהמשתמש
-נראה עכשיו כיצד לבקש מהמשתמש קלט לאחר לחיצה על "run". זה נעשה בעזרת הפונקציה `()readInput`. לפונקציה זו פרמטר מסוג מחרוזת (string), כמו: "what tempo would you like for your music?". בזמן הריצה המשתמש יראה חלונית בה תופיע המחרוזת ומקום להקליד את תגובתו. הפונקציה`()readInput` מחזירה את המחרוזת שהמשתמש הקליד בחלונית.
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). בזמן הריצה המשתמש יראה חלונית בה תופיע המחרוזת ומקום להקליד את תגובתו. The `readInput()` function returns what the user types there.
לדוגמה, העתיקו את הקוד הבא לסקריפט חדש, והריצו אותו:
[role="curriculum-python"]
[source,python]
----
-answer = readInput("What tempo would you like for your music?")
-print(answer)
+include::code-examples/get-user-input-untitled1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-var answer = readInput("What tempo would you like for your music?");
-println(answer);
+include::code-examples/get-user-input-untitled1.js.txt[]
----
-לעיתים נרצה להמיר ערך מטיפוס נתונים אחד לאחר. הנה מספר פונקציות שימושיות:
+We might need to convert the returned user input into a different data type. הנה מספר פונקציות שימושיות:
[role="curriculum-python"]
-* `()str` - ממירה את הערך שהיא מקבלת כפרמטר למחרוזת (string).
-* `()int` - ממירה את המחרוזת שהיא מקבלת בפרמטר למספר שלם (לדוגמה: `"3"` הופך ל-`3`).
-* `()float` - ממירה את המחרוזת שהיא מקבלת כפרמטר למספר ממשי (לדוגמה: `"3.5"` הופך ל-`3.5`).
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
[role="curriculum-javascript"]
-* `String()` - ממירה ערך כלשהו למחרוזת. שימו לב לכך, שבאופן חריג, שם הפונקציה מתחיל באות גדולה.
-* `Number()` - ממירה מחרוזת למספר (לדוגמה: `"3.5"` הופך ל-`3.5`).
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
-בדוגמה למטה, קלט מהקונסול קובע את הטמפו של השיר. אל תשכחו להמיר את הקלט למספר.
+בדוגמה למטה, קלט מהקונסול קובע את הטמפו של השיר. אל תשכחו להמיר את הקלט למספר.
[role="curriculum-python"]
[source,python]
----
-# User input 1: Asking the user for the tempo
-
-# Setup
-from earsketch import *
-
-# asking for tempo
-question = "What tempo would you like for your music? Choose a number between 45 and 220"
-answer = readInput(question)
-
-# converting to an integer
-tempo = int(answer)
-
-# setting the tempo
-setTempo(tempo)
-
-# music
-fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
+include::code-examples/get-user-input-user-input-1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// User input 1: Asking the user for the tempo
-
-// Setup
-
-// asking for tempo
-var question = "What tempo would you like for your music? Choose a number between 45 and 220";
-var answer = readInput(question);
-
-// converting to a number
-var tempo = Number(answer);
-
-// setting the tempo
-setTempo(tempo);
-
-// music
-fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
+include::code-examples/get-user-input-user-input-1.js.txt[]
----
-הנה עוד דוגמה לשימוש בקלט מהמשתמש.
+הנה עוד דוגמה לשימוש בקלט מהמשתמש.
-*שרשור (concatenation)* הוא אמצעי לחיבור מחרוזות, באמצעות הסימן`+`. לדוגמה, שרשור המחרוזות `"hello"` ו-`"world"` ייצור את`"helloworld"`. בדוגמת הקוד הבאה, המשתמש מתבקש לבחור מספר של קליפ. המספר משורשר ל-`DUBSTEP_BASS_WOBBLE_0` כדי ליצור את השם המלא של הקליפ, למשל: `DUBSTEP_BASS_WOBBLE_010`.
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. בדוגמת הקוד הבאה, המשתמש מתבקש לבחור מספר של קליפ. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
[role="curriculum-python"]
[source,python]
----
-# User input 2: Creating a dubstep song with user-specified parameters
-
-# Setup
-from earsketch import *
-setTempo(120)
-
-# Music
-clipNumber = readInput("Type a clip number between 10 and 46: ")
-dubStepClip = "DUBSTEP_BASS_WOBBLE_0"
-finalClip = dubStepClip + clipNumber
-
-# user selected dubstep wobbles
-fitMedia(finalClip, 1, 1, 5)
+include::code-examples/get-user-input-user-input-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// User input 2: Creating a dubstep song with user-specified parameters
-
-// Setup
-setTempo(120);
-
-// Music
-var clipNumber = readInput("Type a clip number between 10 and 46: ");
-var dubStepClip = "DUBSTEP_BASS_WOBBLE_0";
-var finalClip = dubStepClip + clipNumber;
-
-// user-selected dubstep wobbles
-fitMedia(finalClip, 1, 1, 5);
+include::code-examples/get-user-input-user-input-2.js.txt[]
----
+{nbsp} +
+
.תרגלו
****
-בקשו מהמשתna קלט שישנה משהו בשיר.
+בקשו מהמשתמש קלט שישנה משהו בשיר.
הנה מספר רעיונות לכלים תכנותיים שוכלו להשתמש בהם:
-. שרשור מחרוזות,
-. המרה בין טיפוסי נתונים,
+. שרשור מחרוזות,
+. המרה בין טיפוסי נתונים,
. יצירת פרמטר ספציפי בפונקציה שתכתבו
****
+{nbsp} +
+
[[booleanlogic]]
=== לוגיקה בוליאנית
נשלב לוגיקה בוליאנית וקלט מהמשתמש בדוגמה נוספת לאינטראקציה עם המשתמש.
[role="curriculum-python"]
-ראשית, נלמד על אלגברה בוליאנית. למדנו כיצד *אופרטורים של השוואה* עוזרים ביצירת ביטוי בוליאני. לדוגמה, האופרטור `==` בודק האם שני ערכים שווים זה לזה, ואם כן ערך הביטוי הוא`True`.
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
[role="curriculum-javascript"]
-ראשית, נלמד על אלגברה בוליאנית. למדנו כיצד *אופרטורים של השוואה* עוזרים ביצירת ביטוי בוליאני. לדוגמה, האופרטור `===` בודק האם שני ערכים שווים זה לזה, ואם כן ערך הביטוי הוא`true`.
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
-כעת, נלמד על *אופרטורים בוליאניים*: הם מצרפים מספר ביטויים בוליאניים. ישנם שלושה אופרטורים בוליאניים:
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
[role="curriculum-python"]
-* `and`: מקבל שני ביטויים בוליאניים, ומחזיר `True` רק אם שניהם `True`, אחרת הוא מחזיר `False`.
-* `or`: מקבל שני ביטויים בוליאניים, ומחזיר `True` רק אם לפחות אחד מהם `True`, אחרת הוא מחזיר `False`.
-* `not`: מקבל ביטוי בוליאני אחד ומחזיר את שלילתו (הערך ההפוך).
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
[role="curriculum-javascript"]
-* `&&`: is called "and", it takes 2 boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
-* `||`: is called "or": it takes 2 boolean inputs and returns `true` when at least 1 input is `true`, otherwise returns `false`.
-* `!`: נקרא "not": הוא מקבל ביטוי בוליאני אחד ומחזיר את שלילתו (הערך ההפוך).
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
-לדוגמה: אם גילך 16, אז המשפט "גילי 16" הוא נכון, והמשפט "גילי 17" אינו נכון. המשפט "גילי 16 וגם 17" אינו נכון. אבל המשפט "גילי 16 או 17" נכון.
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
[role="curriculum-python"]
.תרגלו
****
-מה ערכי הביטויים הבאים? `True` או `False`?
+מה ערכי הביטויים הבאים? `True` or `False`?
* `not True`
* `True and False`
* `True or False`
* `True and True`
-* `True and False or True`
+* `(True and False) or True`
* `True and not False`
* `not (False or False)`
****
@@ -388,15 +216,15 @@ fitMedia(finalClip, 1, 1, 5);
[role="curriculum-javascript"]
.תרגלו
****
-מה ערכי הביטויים הבאים? `true` או `false`?
+מה ערכי הביטויים הבאים? `true` or `false`?
-* `true!`
+* `!true`
* `true && false`
* `true || false`
* `true && true`
* `(true && false) || true`
* `true && !false`
-* `(false || false)!`
+* `!(false || false)`
****
הסקריפט הבא ידפיס את התשובות:
@@ -404,34 +232,13 @@ fitMedia(finalClip, 1, 1, 5);
[role="curriculum-python"]
[source,python]
----
-# Boolean expressions: printing boolean expressions
-
-from earsketch import *
-
-print(not True)
-print(True and False)
-print(True or False)
-print(True and True)
-print((True and False) or True)
-print(True and not False)
-print(not (False or False))
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Boolean expressions: printing boolean expressions
-
-// Setup
-setTempo(120);
-
-println(!true);
-println(true && false);
-println(true || false);
-println(true && true);
-println((true && false) || true);
-println(true && !false);
-println(!(false || false);
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
----
בסרטון מוצגת חזרה על ערכים בוליאניים ואופרטורים בוליאניים:
@@ -444,119 +251,61 @@ video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
[[video17ajs]]
video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
-
.תרגלו
****
-בתרגיל זה, תשלבו קלט מהמשתמש ואופרטורים בוליאניים: כתבו סקריפט, שיבקש מהמשתמש לבחור ז'אנר, מתוך מספר מצומצם של אפשרויות (לדוגמה "hip hop" או "classic"). כתלות בבחירת המשתמש, הסקריפט יבחר מחרוזת תיפוף שמתאימה לז'אנר. הסקריפט יזהה מספר אפשריות איות. לדוגמה: hip hop, Hip Hop ו-HIP HOP, ייצרו את אותו שיר.
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
****
הנה דוגמה:
+
[role="curriculum-python"]
[source,python]
----
-# Boolean operations: Asking user for genre and creating beat accordingly
-
-from earsketch import *
-setTempo(120)
-
-# Sound variables
-kick = OS_KICK02
-hihat = OS_CLOSEDHAT04
-clap = OS_CLAP03
-
-# Beat string variables
-hiphopKickBeat = "0++++---0+++0+++"
-hiphopHihatBeat = "----0---00---000"
-edmKickBeat = "0+++----0+++----"
-edmClapBeat = "----0-------0---"
-
-# Requesting user input
-genre = readInput("What genre is your favourite? Hip Hop or EDM?")
-
-# Creating the appropriate rhythm
-if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
- makeBeat(kick, 1, 1, hiphopKickBeat)
- makeBeat(hihat, 2, 1, hiphopHihatBeat)
-elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
- makeBeat(kick, 1, 1, edmKickBeat)
- makeBeat(clap, 2, 1, edmClapBeat)
-else:
- print("Sorry we couldn't read the genre you selected. Please run the code again")
-
-# Adding some reverb on track 2
-setEffect(2, REVERB, MIX, 0.1)
+include::code-examples/get-user-input-boolean-operations.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-// Boolean operations: Asking user for genre and creating beat accordingly
-
-// Setup
-setTempo(120);
-
-// Sound variables
-var kick = OS_KICK02;
-var hihat = OS_CLOSEDHAT04;
-var clap = OS_CLAP03;
-
-// Beat string variables
-var hiphopKickBeat = "0++++---0+++0+++";
-var hiphopHihatBeat = "----0---00---000";
-var edmKickBeat = "0+++----0+++----";
-var edmClapBeat = "----0-------0---";
-
-// Requesting user input
-var genre = readInput("What genre is your favourite? Hip Hop or EDM?");
-
-// Creating the appropriate rhythm
-if ((genre == "Hip Hop") || (genre == "hip hop") || (genre == "HIP HOP")) {
- makeBeat(kick, 1, 1, hiphopKickBeat);
- makeBeat(hihat, 2, 1, hiphopHihatBeat);
-} else if ((genre == "edm") || (genre == "Edm") || (genre == "EDM")) {
- makeBeat(kick, 1, 1, edmKickBeat);
- makeBeat(clap, 2, 1, edmClapBeat);
-} else {
- println("Sorry we couldn't read the genre you selected. Please run the code again");
-}
-
-// Adding some reverb on track 2
-setEffect(2, REVERB, MIX, 0.1);
+include::code-examples/get-user-input-boolean-operations.js.txt[]
----
+{nbsp} +
+
.אתגר
****
-אתגר הג'וקבוקס (jukebox): כתבו סקריפט שיבקש מהמשתמש את הז'אנר הרצוי מתוך שלוש אפשרויות (לדוגמה: "latino", "trap" ו-"dubstep"). הסקריפט יצור שיר בהתאם לבחירת המשתמש.
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
****
+{nbsp} +
+
[[chapter8summary]]
=== סיכום פרק שמיני
[role="curriculum-python"]
-* *הוראת return* משמשת להחזרת ערך מהפונקציה. היא הוראה אופציונלית. פונקציה לא חייבת להחזיר ערך.
-* הפונקציה `()readInput` מבקשת קלט מהמשתמש בזמן ריצת הקוד. הפרמטר היחיד שלה היא מחרוזת שתודפס בקונסול. הסקריפט יכול להשתמש בקלט. לדוגמה, הסקריפט יכול לשנות את הטמפו או הז'אנר (סוגה) של המוסיקה.
-* קיימות פונקציות להמרה בין טיפוסי נתונים. `()str` ממירה ערך כלשהו למחרוזת (string).
-`()int` ממירה מחרוזת, המכילה ספרות, למספר שלם. `()float` ממירה מחרוזת המכילה ספרות עם נקודה עשרונית למספר ממשי (float).
-* אפשר *לשרשר (concatenate)* מחרוזות: הערך של "Hello"+"World" הוא "HelloWorld"
-* *לוגיקה בוליאנית* כוללת אופרטורים בוליאניים. אופרטורים בוליאניים הם:
-** `and`: מקבל שני ביטויים בוליאניים, ומחזיר `True` רק אם שניהם `True`, אחרת הוא מחזיר `False`.
-** `or`: מקבל שני ביטויים בוליאניים, ומחזיר `True` רק אם לפחות אחד מהם `True`, אחרת הוא מחזיר `False`.
-** `not`: מקבל ביטוי בוליאני אחד ומחזיר את שלילתו (הערך ההפוך).
-* כעת, יש בידינו כלים רבים המאפשרים ליצור שינויים: קלט מהמשתמש יכול לקבוע מרכיבים מסוימים בשיר. נוכל להוסיף פרמטר, לפונקציות שיצרנו, שיקבע מהו השינוי.
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. הפרמטר היחיד שלה היא מחרוזת שתודפס בקונסול. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* קיימות פונקציות להמרה בין טיפוסי נתונים. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. אופרטורים בוליאניים הם:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
[role="curriculum-javascript"]
-* *הוראת return* משמשת להחזרת ערך מהפונקציה. היא הוראה אופציונלית. פונקציה לא חייבת להחזיר ערך.
-* הפונקציה `()readInput` מבקשת קלט מהמשתמש בזמן ריצת הקוד. הפרמטר היחיד שלה היא מחרוזת שתודפס בקונסול. הסקריפט יכול להשתמש בקלט. לדוגמה, הסקריפט יכול לשנות את הטמפו או הז'אנר (סוגה) של המוסיקה, בהתאם לקלט.
-* קיימות פונקציות להמרה בין טיפוסי נתונים. לדוגמה, ()str ממירה נתונים למחרוזת. `String()` ממירה כל ערך למחרוזת. שימו לב לכך, שבאופן חריג, שם הפונקציה מתחיל באות גדולה. ()Number ממירה מחרוזת למספר.
-* אפשר *לשרשר (concatenate)* מחרוזות: הערך של "Hello"+"World" הוא "HelloWorld"
-* *לוגיקה בוליאנית* כוללת אופרטורים בוליאניים. אופרטורים בוליאניים הם:
-** `&&`: is called "and", it takes 2 boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
-** `||`: is called "or": it takes 2 boolean inputs and returns `true` when at least 1 input is `true`, otherwise returns `false`.
-** `!`: נקרא "not": הוא מקבל ביטוי בוליאני אחד ומחזיר את שלילתו (הערך ההפוך).
-* כעת, יש בידינו כלים רבים המאפשרים ליצור שינויים: קלט מהמשתמש יכול לקבוע מרכיבים מסוימים בשיר. נוכל להוסיף פרמטר, לפונקציות שיצרנו, שיקבע מהו השינוי.
-
-
-
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. הפרמטר היחיד שלה היא מחרוזת שתודפס בקונסול. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* קיימות פונקציות להמרה בין טיפוסי נתונים. לדוגמה, ()str ממירה נתונים למחרוזת. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. אופרטורים בוליאניים הם:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
[[chapter-questions]]
=== שאלות
@@ -564,10 +313,11 @@ setEffect(2, REVERB, MIX, 0.1);
[question]
--
מי מהבאים הוא דוגמה להמרה של טיפוס נתונים?
+
[answers]
* הפיכת מחרוזת למספר.
* אחסון ערך הטמפו, שהמשתמש הגדיר, במשתנה.
-* קריאה ל-`()readInput` כדי לבקש מהמשתמש לבחור ז'אנר (סוגה)..
+* Using `readInput()` to ask a user for a genre.
* יצירת ערך בוליאני בעזרת אופרטור השוואה.
--
@@ -575,17 +325,16 @@ setEffect(2, REVERB, MIX, 0.1);
[question]
--
מה יהי הפלט של קטע הקוד הבא (כלומר, מה הוא ידפיס לקונסול)?
+
[source,python]
----
-n = 5
-if (n * 3) == 15:
- m = 5 + n
- print(m)
+not (True and (4 > 5))
----
+
[answers]
-* `10`
-* `n`
* `True`
+* `5`
+* `4`
* `False`
--
@@ -593,24 +342,23 @@ if (n * 3) == 15:
[question]
--
מה יהי הפלט של קטע הקוד הבא (כלומר, מה הוא ידפיס לקונסול)?
+
[source,javascript]
----
-var n = 5;
-if (n * 3 == 15) {
- var m = 5 + n;
- println(m);
-}
+!(true && (4 > 5));
----
+
[answers]
-* `10`
-* `n`
-* `True`
-* `False`
+* `true`
+* `4`
+* `false`
+* `5`
--
[question]
--
מי מהבאים הוא דוגמה לשרשור?
+
[answers]
* `x = beatstring1 + beatstring2`
* `x = beatstring1.beatstring2`
@@ -621,29 +369,23 @@ if (n * 3 == 15) {
[role="curriculum-python"]
[question]
--
-מה ערכו של הביטוי הבא?
-[source,python]
-----
-not (True and (4 > 5))
-----
+How would you obtain the boolean True with the booleans True and False?
+
[answers]
-* `True`
-* `False`
-* `true`
-* `"False"`
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
--
[role="curriculum-javascript"]
[question]
--
-מה ערכו של הביטוי הבא?
-[source,javascript]
-----
-!(true && (4 > 5));
-----
+How would you obtain the boolean true with the booleans true and false?
+
[answers]
-* `true`
-* `false`
-* `True`
-* `"false"`
---
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/he/v2/getting-started.adoc b/src/locales/he/v2/getting-started.adoc
index 60b71049f..e3ee74ccb 100644
--- a/src/locales/he/v2/getting-started.adoc
+++ b/src/locales/he/v2/getting-started.adoc
@@ -1,15 +1,16 @@
[[getstartedwithearsketch]]
== להתחיל עם EarSketch
-:nofooter:
-בפרק זה תלמדו איך EarSketch עובדת, איך להוסיף צלילים (קליפים) למוסיקה ואיך לדבג (לתקן שגיאות) קוד.
+:nofooter:
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
[[discoverearsketch]]
=== גלו את EarSketch
+
:nofooter:
-ב-EarSketch, תתנו למחשב הוראות על-ידי כתיבת קוד. כל שורת קוד היא הוראה אחת. כל ההוראות ביחד נקראות תכנית (הן נקראות גם אלגוריתם). בדיוק כמו שמעקב אחרי מתכון בספר בישול יוצר ארוחה, כך ביצוע של תכנית ב-EarSketch יכול ליצור שיר. היכן בתכנית נמצא הקוד? צפו בקטע הוידאו!
+ב-EarSketch, תתנו למחשב הוראות על-ידי כתיבת קוד. כל שורת קוד היא הוראה אחת. כל ההוראות ביחד נקראות תכנית (הן נקראות גם אלגוריתם). בדיוק כמו שמעקב אחרי מתכון בספר בישול יוצר ארוחה, כך ביצוע של תכנית ב-EarSketch יכול ליצור שיר. How does it work? Find out in the video below!
[role="curriculum-mp4"]
[[video1a]]
@@ -19,24 +20,22 @@ video::./videoMedia/1_1_Discover_EarSketch.mp4[]
TODO: upload video
////
-כדי להשתמש ב-EarSketch
+As you become familiar with EarSketch these are the main panels.
-. אפשר לדפדף ולבחור צליל *מספריית הצלילים*
-. אפשר לכתוב קוד *בעורך הקוד*,
-. לחיצה על כפתור *run* יגרום ליצירה להופיע ב-*Digital Audio Workstation* (או *DAW*)
-. אפשר ללחוץ על כפתור *play* כדי להאזין למוסיקה
-. אפשר לשנות את הקוד עד שהשיר נשמע בדיוק לטעמנו!
-. אפשר לפתוח ולסגור את חלונית חומרי הלימוד בעזרת כפתור הגלילה בראש החלונית
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
-_מה זה DAW?_
+{nbsp} +
-*Digital Audio Workstation*, או *DAW*, היא תוכנה שמייצרת ועורכת קטעי קול במחשב, באולפן מקצועי או ביתי.
+_What is a DAW?_
-תכנות DAW פופולריות הן: https://www.ableton.com/[Ableton^] ת https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], ו- http://www.reaper.fm/[Reaper^]
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
-בעזרת DAW אפשר להקליט, לערוך ולנגן קבצי קול. קבצי קול אלה נקראים *קליפים*.
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
-EarSketch היא בדיוק כמו DAW, חוץ מזה שהמרכיבים המוסיקליים מתוכנתים בקוד.
+EarSketch is DAW that allows you to create music by writing code.
כך תוכלו לעשות שימוש ב-DAW:
@@ -48,74 +47,64 @@ video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
////
-
-בואו נריץ דוגמאות קוד ב-EarSketch! בתיבה למטה, לחצו על האייקון עם לוח הכתיבה הכחול שבפינה הימנית העליונה. דוגמת הקוד תועתק *לעורך הקוד*. לעת עתה, אין צורך להבין את הקוד, רק ללחוץ על כפתור _run_: המוסיקה תופיע ב-DAW. לחיצה על _play_ תשמיע אותה.
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-intro-script.py.txt[]
+include::code-examples/getting-started-intro-script.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-intro-script.js.txt[]
+include::code-examples/getting-started-intro-script.js.txt[]
----
{nbsp} +
-
-
[[createanewscript]]
=== צרו את הסקריפט הראשון!
-ב-EarSketch, כל סקריפט מתייחס לשיר אחד. בואו נראה איך יוצרים סקריפט:
+Let's see how to create a script from scratch.
-. *היכנסו לחשבון שלכם/ן או צרו חשבון חדש* בפינה הימנית העליונה של המסך. אם תלחצו על הכפתור הלבן "Create / Reset Account", תוכלו לשחזר סיסמה או ליצור חשבון חדש ("Register a New Account"). זהירות: באופן כללי ברשת, אל תשתמשו באותה הסיסמה לכל החשבונות. אל תגלו את הסיסמאות שלכם/ן.
-
-. *לחצו כדי ליצור:* אם אין סקריפטים פתוחים, לחצו על הקישור הכחול הגדול בעורך הקוד "click here to create a new script".
+. *Create.* In the editor tabs, click the white "+" icon.
+
-אם יש סקריפטים פתוחים, לחצו על ה-"+" הלבן ליד הלשוניות.
+If this is your first script, click the large blue text "Click here to create a new script!"
+
[[newscriptplus]]
.יצירת סקריפט חדש
[caption="Figure 1.2.1: "]
image::../media/U1P1/NewScriptPlus.png[Alt Text]
-
-
-. *בחר שם ושפה* תפתח תיבת הדיאלוג "Create a new script". Give your new script a name which will be name of your song. עכשיו בחרו את שפת התכנות (Python או JavaScript). לסיום, לחצו על כפתור "Create".
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
+
[[newscriptpromptpy]]
.תיבת הדיאלוג ליצירת סקריפט חדש
[role="curriculum-python"]
[caption="Figure 1.2.2: "]
image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
[[newscriptpromptjs]]
.תיבת הדיאלוג ליצירת סקריפט חדש
[role="curriculum-javascript"]
[caption="Figure 1.2.2: "]
image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+*_What is a programming language?_*
-*_מהי שפת תכנות?_*
-
-קוד נכתב ב*שפת תכנות*, שכוללת אוצר מילים ותחביר, כמו שפה רגילה. יש לדעת את חוקי הדקדוק של שפת התכנות, אחרת המחשב לא יוכל לבצע את ההוראות.
-
-ב-EarSketch אפשר לכתוב ב-Python או ב-JavaScript.
-
-[role="curriculum-python"]
-_את/ה בחרת לתכנת ב-Python. Python משמשת חברות כמו גוגל, יאהו, נאסא ודיסני. בשפה זו קודדו המשחקים Civilization 4, Battlefield 2 ו-Crystal Space._
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
-[role="curriculum-javascript"]
-_את/ה בחרת לתכנת ב-JavaScript. JavaScrupt היא אחת מעשר שפות התכנות הפופולריות ביותר. כמעט כל אתר ברשת משתמש ב-JavaScript._
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
-ברמה העמוקה ביותר, מחשבים פועלים על צירופים של אפסים ואחדים: מספרים בינריים. זה בגלל שרכיבים אלקטרוניים יכולים להגיב בצורות שונות אם יש זרם חשמלי (1) או אם אין זרם חשמלי (0). כשנלחץ כפתור *run*, המחשב מתרגם את ההוראות c-Python או ב-JavaScript, לקוד בינרי. הקוד *מבוצע* על-ידי המחשב, ואפשר לראות את השיר מופיע ב-DAW.
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
[[fitmedia]]
-=== הפונקציה `()fitMedia`
+=== The `fitMedia()` function
-עכשיו, אחרי שיצרת את הסקריפט הראשון שלך, נעבוד על המוסיקה שלך!
+Now that you have created your first script, let's start working on your music!
הווידאו הבא מתאר כיצד להוסיף קליפ לשיר שלך:
@@ -127,27 +116,51 @@ video::./videoMedia/1_3_fitmedia_py.mp4[]
[[video110js]]
video::./videoMedia/1_3_fitmedia_js.mp4[]
-כדי להוסיף קליפ ל-DAW, מקלידים`()fitMedia`. בין הסוגריים יהיו ארבעה פרמטרים, שביניהם פסיקים:
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
-. *שם הערוץ*: כשהסמן בתוך הסוגריים, יש לבחור קליפ מדפדפן הצלילים, ולהדביק אותו על-ידי לחיצה על האייקון הכחול.
-. *מספר הערוץ*: ערוצים הם השורות לאורך ה-DAW; הם עוזרים לארגן את הצלילים לפי כלים (קולות, גיטרה מובילה, גיטרת קצב, בס, תופים וכו'). את/ה יכול/ה להתחיל בערוץ אחד לצליל הראשון.
-. *תיבת התחלה*: מתי הצליל יתחיל להתנגן. תיבות הן יחידות זמן מוזיקליות. תיבה אחת מכילה ארבע פעמות (beats). אפשר להתחיל בתיבה הראשונה עם הצליל הראשון.
-. *תיבת סיום*: מתי הצליל יסיים להתנגן.
+`fitMedia(sound, track, start, end)`
-_Example:_ `fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)` will place the sound `Y18_DRUM_SAMPLES_2` on track 1 from measure 1 to measure 5.
+There are 4 *parameters*, separated by commas.
-עכשיו, אחרי לחיצה על _run_: תוכל/י לראות את הקליפ ב-DAW. לחיצה על _play_ תנגן אותו.
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
-[role="curriculum-javascript"]
-*פקודה* מורה למחשב לבצע פעולה. לדוגמה, `fitMedia(Y18_DRUM_SAMPLES_1, 1, 1, 5);` היא הוראה. כל פקודה ב-JavaScript *_חייבת להסתיים בנקודה פסיק_*.
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
////
OPTIONAL
////
-*דפדפן הצלילים*: מאפשר לחפש בספרייה של מעל 4000 קליפים שתוכל/י לשלב במוזיקה שלך. הם נוצרו על-ידי היוצרים/מפיקים https://en.wikipedia.org/wiki/Young_Guru[Young Guru^], https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^], https://en.wikipedia.org/wiki/Ciara[Ciara^], https://en.wikipedia.org/wiki/Common_(rapper)[Common^], https://en.wikipedia.org/wiki/Pharrell_Williams[Pharrell Williams^], Irizarry y Caraballo, ו-https://www.sndbrd.com/[Milknsizz^].
+{nbsp} +
+
+*_The Sound Browser_*
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
////
END OF OPTIONAL
@@ -156,33 +169,33 @@ END OF OPTIONAL
////
OPTIONAL
////
-
-See some examples of code using `fitMedia()` (Remember you can click the blue clip board in the top right corner of the box to paste the code into a new file):
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia.py.txt[]
+include::code-examples/getting-started-using-fitmedia.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia.js.txt[]
+include::code-examples/getting-started-using-fitmedia.js.txt[]
----
-אתגר: הוסיפו עוד שורות`()fitMedia`לסקריפט, כמו שאנחנו עשינו. שימו לב לכך שהשתמשנו בערוץ נפרד לכל שורת`()fitMedia`:
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia-2.py.txt[]
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-using-fitmedia-2.js.txt[]
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
----
{nbsp} +
@@ -191,20 +204,19 @@ include::../../en/v2/code-examples/getting-started-using-fitmedia-2.js.txt[]
****
בחרו קליפים לטעמכם/ן מספריית הצלילים ו:
-. מקמו צלילים בשני ערוצים שונים
-. מקמו צלילים מתיבה 2 עד תיבה 12
-. צרו שיר קצר בשלושה ערוצים, באורך של שמונה תיבות או יותר
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
-בכל תרגיל, בקש/י מחבר/ה להקשיב לשיר ולתת משוב.
+בכל תרגיל, בקשו מחבר/ה להקשיב לשיר ולתת משוב.
אם יש שגיאות בקוד תקנו אותן. בפרק הבא נעסוק בהרחבה בתיקון שגיאות.
****
-
[[debugging]]
=== תיקון שגיאות (debugging)
-לפעמים, מתכנתות ומתכנתים עושים שגיאות שגורמות לקוד לרוץ באופן שגוי, או לא לרוץ בכלל. שגיאות תכנות נקראות *באגים*, ובאנגלית *bugs*. התהליך למציאת ותיקון השגיאות נקרא דיבוג, ובאנגלית *debugging*. אפשר לדבג בשיטות שונות, בעזרת הקונסול (החלונית מתחת לחלונית עורך הקוד).
+לפעמים, מתכנתות ומתכנתים עושים שגיאות שגורמות לקוד לרוץ באופן שגוי, או לא לרוץ בכלל. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. אפשר לדבג בשיטות שונות, בעזרת הקונסול (החלונית מתחת לחלונית עורך הקוד).
[role="curriculum-python curriculum-mp4"]
[[video3py]]
@@ -224,113 +236,85 @@ OPTIONAL
מהם הסוגים השונים של שגיאות?
-. *שגיאות תחביר - Syntax errors*: התכנית לא רצה בגלל שהקוד לא עומד בכללי ה*תחביר (syntax)* של השפה (לדוגמה: אין סוגריים סוגרים, או האיות של fitMedia שגוי).
-. *שגיאות זמן-ריצה - runtime errors*: התכנית מתחילה לרוץ אך עוצרת בגלל שגיאה.
-. *שגיאות לוגיות - logic errors*: התכנית רצה, אבל לא מבצעת את מה שמצופה ממנה. אפשר לתקן שגיאות לוגיות באמצעות הסתכלות על ה-DAW ובדיקה אלו קליפים לא נמצאים במקומם הרצוי.
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. אפשר לתקן שגיאות לוגיות באמצעות הסתכלות על ה-DAW ובדיקה אלו קליפים לא נמצאים במקומם הרצוי.
////
END OF OPTIONAL
////
-
הנה מספר שגיאות נפוצות:
[role="curriculum-python"]
-. *טעות באיות:* יש לבדוק את האיות כשמשתמשים בפונקציות כמו `()fitMedia` או בשמות של קבועים (כמו שמות קליפים).
-. *Case sensitivity:* רוב המילים שמשתמשים בהן בתכנות הן case-sensitive (כלומר, המחשב מקפיד להבדיל בין אותיות גדולות ואותיות קטנות). יש להקפיד ולהשתמש באות גדולה או אות קטנה, כנדרש. לדוגמה, יש לכתוב `()fitMedia` ולא `()FitMedia` או `()fitmedia`. רוב השמות בסקריפט מאויתים לפי כלל שנקרא *camel-caps*: המילה הראשונה באותיות קטנות וכל שאר המילים מתחילות באות גדולה, למשל: `()exampleFunctionName`.
-. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
-. *אתחול הסקריפט:* EarSketch מוסיפה, אוטומטית, פונקציות אתחול לסקריפט. מחיקה של `from earsketch import *`.
-. *סימני פיסוק:* פסיקים, או סימני פיסוק אחרים, חסרים.
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). יש להקפיד ולהשתמש באות גדולה או אות קטנה, כנדרש. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
[role="curriculum-javascript"]
-. *טעות באיות:* יש לבדוק את האיות כשמשתמשים בפונקציות כמו `()fitMedia` או בשמות של קבועים (כמו שמות קליפים).
-. *Case sensitivity:* רוב המילים שמשתמשים בהן בתכנות הן case-sensitive (כלומר, המחשב מקפיד להבדיל בין אותיות גדולות ואותיות קטנות). יש להקפיד ולהשתמש באות גדולה או אות קטנה, כנדרש. לדוגמה, יש לכתוב `()fitMedia` ולא `()FitMedia` או `()fitmedia`. רוב השמות בסקריפט מאויתים לפי כלל שנקרא *camel-caps*: המילה הראשונה באותיות קטנות וכל שאר המילים מתחילות באות גדולה, למשל: `()exampleFunctionName`.
-. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
-. *סימני פיסוק:* פסיקים, או סימני פיסוק אחרים, חסרים.
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). יש להקפיד ולהשתמש באות גדולה או אות קטנה, כנדרש. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
זמן לתרגל!
-מצאו את חמש השגיאות בקוד הבא:
+Find the five errors in the following code:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/getting-started-finding-errors.py.txt[]
+include::code-examples/getting-started-finding-errors.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/getting-started-finding-errors.js.txt[]
+include::code-examples/getting-started-finding-errors.js.txt[]
----
+
////
OPTIONAL
////
אלה השגיאות בקטע:
-. בפונקציה `()setTempo` חסרים סוגריים
-. בפונקציה`()fitMedia`הראשונה חסרה האות 'e'
-. בפונקציה `()fitMedia` הראשונה חסר פסיק בין הפרמטר השלישי והפרמטר הרביעי
-. בפונקציה`()fitMedia` השנייה, ה-M צריכה להיות גדולה
-. בפונקציה `()fitMedia`השנייה, סדר הפרמטרים שגוי. שם הקליפ צריך לבוא לפני מספר הערוץ
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
////
END OF OPTIONAL
////
-Take a look at <> for a description of different error types and what you can do to prevent them.
-
+Take a look at <> for a description of different error types and what you can do to prevent them.
////
TODO: when options are ready, modify the link
////
-
-
-
-
-
[[chapter1summary]]
=== סיכום פרק ראשון
-[role="curriculum-python"]
-* שורת קוד היא הוראה שעל המחשב לבצע. כל ההוראות יחד מהוות תכנית.
-* *DAW* היא תוכנה להקלטה, עריכה ונגינה של קבצי שמע דיגיטליים, או *קליפים*. EarSketch היא DAW, שמאפשרת למקם קליפים על ציר הזמן, בעזרת קוד.
-* כדי ליצור מוסיקה ב-EarSketch, יש להקליד קוד בעורך הקוד. אחרי לחיצה על run, אפשר לנגן את השיר בחלונית ה-DAW.
-* קליפים של צלילים אפשר למצוא בדפדפן הצלילים. אפשר להקליד או להדביק את שמותיהם בקוד. כל האותיות בשמות הקליפים הן אותיות גדולות.
-* *תכנית מחשב* היא רצף של הוראות שהמחשב מבצע כדי להשלים משימה כלשהי.
-* *שפות תכנות* הן אוסף של מילים וסמלים שהמחשב מבין. לשפת תכנות יש תחביר (syntax) לפיו הקוד נכתב.
-* סקריפט ב-EarSketch מורכב מקטע הערות, קטע אתחול, קטע מוזיקה.
-* כדי ליצור סקריפט חדש יש ללחוץ על הקישור הכחול הגדול או על ה-"+" (אם כבר יש סקריפט פתוח בעורך הקוד).
-* `()fitMedia` היא הדרך העיקרית להוספת צלילים ל-DAW. יש לה ארבעה פרמטרים (או ארגומנטים), המידע שהיא צריכה כדי ליצור מוסיקה:
-** *fileName:* שם הקליפ שימוקם ב-DAW.
-** *trackNumber:* הערוץ בו ימוקם הקליפ.
-** *startLocation:* התיבה בה יתחיל הקליפ להתנגן.
-** *endLocation:* התיבה בה יסיים הקליפ להתנגן.
-* *דיבוג (Debugging)* הוא התהליך לגילוי ותיקון *באגים (bugs)*, שגיאות שהמתכנת או המתכנת עשו.
-* חוקי ה*תחביר (syntax)* מגדירים כיצד יש לכתוב קוד בשפת תכנות מסוימת.
-* *הקונסול* מציג מידע על מצב התוכנית. מידע זה מסייע בתהליך הדיבוג.
-* באגים נפוצים הם טעיות הקלדה, בלבול בין אותיות גדולות וקטנות, השמטת סוגריים ואתחול לא נכון של הסקריפט.
-
-[role="curriculum-javascript"]
-* שורת קוד היא הוראה שעל המחשב לבצע. כל ההוראות יחד מהוות תכנית.
-* *DAW* היא תוכנה להקלטה, עריכה ונגינה של קבצי שמע דיגיטליים, או *קליפים*. EarSketch היא DAW, שמאפשרת למקם קליפים על ציר הזמן, בעזרת קוד.
-* כדי ליצור מוסיקה ב-EarSketch, יש להקליד קוד בעורך הקוד. אחרי לחיצה על run, אפשר לנגן את השיר בחלונית ה-DAW.
-* קליפים של צלילים אפשר למצוא בדפדפן הצלילים. אפשר להקליד או להדביק את שמותיהם בקוד. כל האותיות בשמות הקליפים הן אותיות גדולות.
-* *תכנית מחשב* היא רצף של הוראות שהמחשב מבצע כדי להשלים משימה כלשהי.
-* *שפות תכנות* הן אוסף של מילים וסמלים שהמחשב מבין. לשפת תכנות יש תחביר (syntax) לפיו הקוד נכתב.
-* סקריפט ב-EarSketch מורכב מקטע הערות, קטע אתחול, קטע מוזיקה.
-* כדי ליצור סקריפט חדש יש ללחוץ על הקישור הכחול הגדול או על ה-"+" (אם כבר יש סקריפט פתוח בעורך הקוד).
-* `()fitMedia` היא הדרך העיקרית להוספת צלילים ל-DAW. יש לה ארבעה פרמטרים (או ארגומנטים), המידע שהיא צריכה כדי ליצור מוסיקה:
-** *fileName:* שם הקליפ שימוקם ב-DAW.
-** *trackNumber:* הערוץ בו ימוקם הקליפ.
-** *startLocation:* התיבה בה יתחיל הקליפ להתנגן.
-** *endLocation:* התיבה בה יסיים הקליפ להתנגן.
-* *דיבוג (Debugging)* הוא התהליך לגילוי ותיקון *באגים (bugs)*, שגיאות שהמתכנת או המתכנת עשו.
-* חוקי ה*תחביר (syntax)* מגדירים כיצד יש לכתוב קוד בשפת תכנות מסוימת.
-* *הקונסול* מציג מידע על מצב התוכנית. מידע זה מסייע בתהליך הדיבוג.
-* באגים נפוצים הם טעיות הקלדה, בלבול בין אותיות גדולות וקטנות, השמטת סוגריים ואתחול לא נכון של הסקריפט.
-
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
[[chapter-questions]]
=== שאלות
@@ -338,16 +322,18 @@ TODO: when options are ready, modify the link
[question]
--
מי מהבאים אינו פאנל בסביבת העבודה של EarSketch?
+
[answers]
* דפדפן האפקטים
* עורך הקוד
-* ה-DAW
-* הקונסול
+* ב-DAW
+* בקונסול
--
[question]
--
-כמה פרמטרים יש לפונקציה`()fitMedia`?
+How many parameters do you need for your `fitMedia()` function?
+
[answers]
* 4
* 6
@@ -357,7 +343,8 @@ TODO: when options are ready, modify the link
[question]
--
-כל סקריפט ב-EarSketch מתאים ל...
+One script corresponds to...
+
[answers]
* שיר אחד
* שורת קוד אחת
@@ -368,6 +355,7 @@ TODO: when options are ready, modify the link
[question]
--
מהי תיבה?
+
[answers]
* יחידת זמן מוסיקלית
* יחידת עוצמה (ווליום)
@@ -378,6 +366,7 @@ TODO: when options are ready, modify the link
[question]
--
מי מהבאים אינו סוג נפוץ של שגיאה בקוד?
+
[answers]
* שגיאות דקדוקיות
* שגיאות זמן ריצה
@@ -388,9 +377,10 @@ TODO: when options are ready, modify the link
[question]
--
היכן, בסביבת הפיתוח של EarSketch אפשר למצוא מידע על באגים בקוד?
+
[answers]
* בקונסול
* בדפדפן הצלילים
* בדפדפן הסקריפטים
* ב-DAW
---
+--
\ No newline at end of file
diff --git a/src/locales/he/v2/legacy.adoc b/src/locales/he/v2/legacy.adoc
new file mode 100644
index 000000000..ddb733e7d
--- /dev/null
+++ b/src/locales/he/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== ארכיון חומרי לימוד (2020-2015)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/he/v2/loops-and-layers.adoc b/src/locales/he/v2/loops-and-layers.adoc
index c6b092cea..04574e189 100644
--- a/src/locales/he/v2/loops-and-layers.adoc
+++ b/src/locales/he/v2/loops-and-layers.adoc
@@ -1,16 +1,16 @@
[[loopandlayers]]
-== לולאות ושכבות!
-:nofooter:
+== לולאות ושכבות
-בפרק זה נלמד על לולאות `for`, ואיך ליצור חזרות בקוד ובמוסיקה. כמו כן, נדבר על שכבות ומרקמים, ונראה מספר טיפים לתיקון שגיאות (debugging).
+:nofooter:
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. כמו כן, נדבר על שכבות ומרקמים, ונראה מספר טיפים לתיקון שגיאות (debugging).
[[forloops]]
-=== לולאות`for`
+=== `for` loops
-בדיוק כמו שמוסיקאי/ת יכול/ה לנגן תבנית מוסיקלית, שוב ושוב, *בלופ*, אפשר לבקש מהמחשב להשלים משימות, שוב ושוב, *בלופ*! זה יותר יעיל: במקום לכתוב הוראה הרבה פעמים, נכתוב לולאה (loop) עם ההוראות, והמחשב ידע לחזור עליהן.
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
-לדוגמה, אם נרצה לחזור על `()makeBeat` שיצרנו, במקום לכתוב מספר שורות של פונקציות `()makeBeat`, אפשר ליצור לולאת `for`. זה נעשה כך:
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
////
add new video
@@ -18,113 +18,117 @@ more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPu
in the "revamping videos" tab (includes link to script)
////
-הנה הקוד הסופי מהווידאו:
-
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-looping-my-beats.py.txt[]
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-looping-my-beats.js.txt[]
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
----
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
-כדי להבין יותר טוב מה קורה בקוד, אפשר להשתמש בהוראה `print`. היא מאפשרת להציג מידע בקונסול (console), כשהקוד רץ.
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+[[loop-components-PY]]
+.המרכיבים הבסיסיים של לולאת for
[role="curriculum-python"]
-`print` *מחשבת* ביטוי: היא מפשטת אותו לצורתו הבסיסית, בהתאם לטיפוס הנתונים שלו, ומציגה אותו בקונסול. שימו לב לכך, שבפייתון, `print` שונה מפונקציות אחרות מפני שלא תמיד נצטרך לשים סוגריים אחרי שם הפונקציה.
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+[[loop-components-JS]]
+.המרכיבים הבסיסיים של לולאת for
[role="curriculum-javascript"]
-הפונקציה `()println` *מחשבת* ביטוי: היא מפשטת אותו לצורתו הבסיסית, בהתאם לטיפוס הנתונים שלו, ומציגה אותו בקונסול.
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
[role="curriculum-python"]
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. אם התנאי מתקיים, גוף הלולאה יבוצע. אם המונה גדול מדי, תנאי הלולאה לא יתקיים, והלולאה תסתיים. המחשב ימשיך לבצע את ההוראה הבאה אחרי הלולאה.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
.תרגלו
****
-לפני שתריצו את הקוד, הסיקו מה יוצג בקונסול אחרי כל שורת`print`.
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
****
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. היא מאפשרת להציג מידע בקונסול (console), כשהקוד רץ.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
.תרגלו
****
-לפני שתריצו את הקוד, הסיקו מה יוצג בקונסול אחרי כל שורת`()println`.
+Before running the following code, try to guess what the console will display for each `print()` call.
****
+[role="curriculum-javascript"]
+.תרגלו
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-printing.py.txt[]
+include::code-examples/loops-and-layers-printing.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-printing.js.txt[]
+include::code-examples/loops-and-layers-printing.js.txt[]
----
הסבר למה שיוצג בקונסול:
+
----
-4 (התוצאה של 1+3)
-1 (בהתחלה ערכו של מונה התיבות measure הוא 1)
-"ok"
-2 (כעת ערכו של מונה התיבות measure הוא 2)
-"ok" (בכל מעבר על הלולאה (איטרציה) יודפס ok)
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
3
-"ok"
+ok
4
-"ok"
+ok
----
-הריצה מסתיימת כאן כי ערכו של מונה התיבות measure חייב להיות קטן מחמש.
-
-.תרגלו
-****
-. צרו לולאת`for`עם המונה "measure" כדי להציב מחרוזת תיפוף בערוץ הראשון, בעזרת הפונקציה`()makeBeat`מתיבה אחת עד תיבה ארבע, כמו בווידאו
-. שנו את הקוד, כך שההצבה תהיה מתיבה שלוש עד תיבה שבע
-. שנו את הקוד כך שהביט יותר בערוץ השני ולא בערוץ הראשון. הוא עדיין יוצב מהתיבה השלישית עד השביעית
-. כעת, שנו את שם המונה, בחרו ערוץ, תיבת התחלה ותיבת סיום וצרו לולאת`for`בהתאם
-. הראו לחבר/ה את לולאת ה-`for`האחרונה, ובקשו ממנו/ה לומר באיזה ערוץ הביט, באיזו תיבה הוא מתחיל, באיזו תיבה הוא נגמר ומה שם המונה.
-****
-
-אפשר לכתוב יותר מהוראה אחת בתוך לולאת `for`.
-
-[role="curriculum-python"]
-לולאות`for` בפייתון מורכבות משלושה חלקים בסיסיים:
-[role="curriculum-javascript"]
-לולאות`for` ב-JavaScript מורכבות מארבעה חלקים בסיסיים:
-
-[[loop-components-PY]]
-.המרכיבים הבסיסיים של לולאת for
-[role="curriculum-python"]
-[caption="Figure 12.2: "]
-image::../media/U1P2/Loop_Components_PY.png[Alt Text]
-
-[[loop-components-JS]]
-.המרכיבים הבסיסיים של לולאת for
-[role="curriculum-javascript"]
-[caption="Figure 12.2: "]
-image::../media/U1P2/Loop_Components_JS.png[Alt Text]
-
-[role="curriculum-python"]
-* *גוף הלולאה*: מכיל את ההוראות שיתבצעו שוב ושוב. הגוף כולל כל מה *שמוזח* (בעזרת מקש _tab_) בשורות שמיד אחרי הנקודותיים`:`.
-* *מונה הלולאה*: יוצר משתנה שישמש כמונה הלולאה.
-* *טווח או Range*: פונקציה שיוצרת סדרה של מספרים. מונה הלולאה יקבל מספרים אחד אחרי השני. בכל איטרציה (ביצוע של גוף הלולאה) הוא יקבל מספר אחר מהסדרה. מילת המפתח `in` בודקת אם ערך מונה הלולאה הוא בטווח שצוין. לפונקציה`()range` שני פרמטרים, ערך ההתחלה (כולל) וערך הסיום (לא כולל): `range(startingNumber, endingNumber)`.
-
-[role="curriculum-javascript"]
-* *גוף הלולאה*: גוף הלולאה כולל הוראות שיתבצעו שוב ושוב. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key).
-* *אתחול*: יצירת משתנה שישמש *מונה לולאה*. האתחול נעשה לפני האיטרציה (ריצה של גוף הלולאה) הראשונה.
-* *הוראת איטרציה*: הוראה שמעדכנת את מונה הלולאה. המונה גדל בכל איטרציה.
-* *תנאי הלולאה*: בודק האם יש לבצע את הלולאה פעם נוספת. אם התנאי מתקיים, גוף הלולאה יבוצע. אם המונה גדול מדי, תנאי הלולאה לא יתקיים, והלולאה תסתיים. המחשב ימשיך לבצע את ההוראה הבאה אחרי הלולאה.
-
-אפשר לכתוב יותר מהוראה אחת בתוך לולאת `for`.
+הריצה מסתיימת כאן כי ערכו של מונה התיבות measure חייב להיות קטן מחמש.
[[controlflow]]
=== בקרת זרימה
-הנה דוגמה נוספת לשימוש בלולאות`for`:
+Here is another example of how you can use `for` loops:
[role="curriculum-python curriculum-mp4"]
[[video12bpy]]
@@ -134,49 +138,49 @@ video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
[[video12bjs]]
video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
-אפשר ליצור חזרות במוסיקה על-ידי הקלדה חוזרת של `()fitMedia` עם מספרי תיבה שונים:
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-no-loops.py.txt[]
+include::code-examples/loops-and-layers-no-loops.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-no-loops.js.txt[]
+include::code-examples/loops-and-layers-no-loops.js.txt[]
----
-אפשר להשתמש בלולאת`for`כדי ליצור את אותה המוסיקה בצורה יותר יעילה. מונה הלולאה הוא "measure". שימו לב לכך שגוף הלולאה כולל שתי שורות. בשתי השורות מופיע המשתנה "measure".
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-loops.py.txt[]
+include::code-examples/loops-and-layers-loops.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-loops.js.txt[]
+include::code-examples/loops-and-layers-loops.js.txt[]
----
-*המתרגם (interpreter)*, קורא ומבצע את הסקריפט. הסדר בו המתרגם מבצע את ההוראות נקרא *בקרת זרימה - control flow*. בדרך כלל המתרגם עובר שורה שורה, מלמעלה למטה. לכן צריך להגדיר משתנים לפני שמשתמשים בהם בקוד.
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. בדרך כלל המתרגם עובר שורה שורה, מלמעלה למטה. לכן צריך להגדיר משתנים לפני שמשתמשים בהם בקוד.
-לולאה היא *הוראת בקרת זרימה*, והיא משנה סדר זה. בסוף גוף הלולאה, המתרגם קופץ חזרה לתחילת הלולאה.
+A loop is a *control flow statement*, which changes the order. בסוף גוף הלולאה, המתרגם קופץ חזרה לתחילת הלולאה.
-האנימציה הבאה מראה כיצד בקרת הזרימה נעה בלולאת`for`, ואיך ערך מונה הלולאה משתנה בכל *איטרציה*, או חזרה על גוף הלולאה:
+This animation shows how the control flow moves in a `for` loop, and how the value of the loop counter changes on each *iteration*, or repetition of the loop body:
[[loop-py]]
.לולאת for, צעד אחרי צעד
[role="curriculum-python"]
-[caption="Figure 12.4: "]
+[caption="Figure 4.2.1: "]
image::../media/U1P2/LoopPy_updated.gif[Alt Text]
.לולאת for, צעד אחרי צעד
[role="curriculum-javascript"]
-[caption="Figure 12.4: "]
+[caption="Figure 4.2.1: "]
[[loop-js]]
image::../media/U1P2/LoopJS_updated.gif[Alt Text]
@@ -186,59 +190,72 @@ Although it is valid syntax, a `*monospace bold phrase*` causes a build error in
BMW
////
-דבר מעניין, אחרון, על לולאות`for`הוא אינקרמנטציה.
+One last interesting thing about `for` loops is incrementation.
[role="curriculum-python"]
-אינקרמנטציה, פירושה הגדלה. הגדלת הערך של מונה הלולאה. בלולאת `for` השתמשנו בפונקציה `()range`כדי להגדיל את ערכו של המונה. לפונקציה יש שני פרמטרים: `startingNumber`ו- `endingNumber` (הטווח לא כולל ערך זה). יש פרמטר, אופציונלי, שלישי: `increment`. ערך ברירת המחדל של `increment`הוא אחד, אבל ניתן לתת לו ערכים גדולים יותר.
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
[role="curriculum-javascript"]
-איקרמנטציה, פירושה הגדלה. הגדלת הערך של מונה הלולאה. בלולאת `for` השתמשנו ב:`measure = measure + 1`. זה הגדיל את המונה`measure` ב-1 בכל איטרציה (ריצה של גוף הלולאה). אפשר להגדיל את ערך המונה ביותר מאחד. לדוגמה:`measure = measure + 4`.
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
.תרגלו
-*****
+****
לפני שתריצו את הקוד, נסו להסיק מה הוא עושה.
-*****
+****
+
+{nbsp} +
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/loops-and-layers-incrementing.py.txt[]
+include::code-examples/loops-and-layers-incrementing.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/loops-and-layers-incrementing.js.txt[]
+include::code-examples/loops-and-layers-incrementing.js.txt[]
----
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. משמעות הפעולה היא ש-measure שווה עכשיו לערכו הקודם ועוד אחד. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
[role="curriculum-python"]
-כאן השתמשנו בפונקציה`()range`, אבל אפשר להגדיל או להקטין את הערך של המשתנה בעזרת: `measure = measure + 1`. משמעות הפעולה היא ש-measure שווה עכשיו לערכו הקודם ועוד אחד. אפשר לכתוב בקיצור `=+` (או `=-` כדי להקטין את הערך). נעשה זאת כך: ל-`measure += 1` אותה משמעות כמו ל- `measure = measure + 1`. ול-`measure -=1`אותה משמעות כמו ל-`measure = measure - 1`
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
[role="curriculum-javascript"]
-כאן כתבנו`measure = measure + 4`, שמשמעותו ש-measure שווה עכשיו לערכו הקודם ועוד ארבע. אפשר להשתמש בקיצורים הבאים:
- `=+` (או`=-` להקטנת הערך). הביטויים הבאים הם דרך קצרה להגדיל או להקטין את ערכו של המונה:
-
-* `++measure`, או `measure += 1`יגדילו את ערכו של measure באחת. אם נרצה להגדיל את ערכו של measure בשתיים, נכתוב `measure += 2`.
-* `--measure`, או`measure -= 1` מקטינים את ערכו של measure באחת. אם נרצה להקטין את ערכו של המונה בשתיים, נכתוב use `measure -= 2`.
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). הביטויים הבאים הם דרך קצרה להגדיל או להקטין את ערכו של המונה:
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
[[debuggingtips]]
=== טיפים לתיקון שגיאות (debugging)
-תכנות הוא לא רק כתיבת קוד. תכנות הוא גם תיקון שגיאות ותחזוקת הקוד. Debugging פירושו תיקון השגיאות בקוד. כשתתקלו בשגיאה, נסו את הצעדים הבאים:
+תכנות הוא לא רק כתיבת קוד. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. כשתתקלו בשגיאה, נסו את הצעדים הבאים:
[role="curriculum-python"]
-. *קריאת ההודעות בקונסול*.
-. *מציאת מקום השגיאה בקוד:* ישנן שלוש אפשרויות. 1. אם ההודעה בקונסול מציינת מספר שורה, יש לבדוק את השורה הזו ואת השורה שלפניה בקוד. 2. שימוש בהפיכת שורות להערות. אפשר לדייק את מיקום ואופי השגיאה על-ידי הפיכת בלוק של קוד להערה, והרצת הקוד. אם ההרצה, כעת, נקייה משגיאות, אז השגיאה היא בחלק שהפך להערה. 3. *תיקון שגיאות בעזרת print* יכול, גם הוא, לעזור במציאת מקום השגיאה. יש לקרוא את קטע הקוד בו נמצאת השגיאה ולעקוב אחרי אופן פעולתו. בעזרת `print` ניתן להדפיס ערכים של משתנים (או הודעות), כשאופן פעולת הקוד לא ברורה. ההדפסות מאפשרות להשוות השערות בדבר ערכי משתנים ואופן הפעולה, למה שהקוד מבצע בפועל.
-. *תיקון השגיאה* בדיקת השגיאות, עריכת הקוד בהתאם והרצה חוזרת של הקוד כדי לוודא את נכונותו.
-. *בקשת עזרה*: אם אחרי השקעת זמן רב השגיאה לא תוקנה, כדאי לבקש עזרה מחבר/ה. זוג עיניים רענן יכול לחולל פלאים!
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. אם ההודעה בקונסול מציינת מספר שורה, יש לבדוק את השורה הזו ואת השורה שלפניה בקוד.
+.. שימוש בהפיכת שורות להערות. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. אם ההרצה, כעת, נקייה משגיאות, אז השגיאה היא בחלק שהפך להערה.
+.. *Print debugging* can also be used to locate an error. יש לקרוא את קטע הקוד בו נמצאת השגיאה ולעקוב אחרי אופן פעולתו. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. ההדפסות מאפשרות להשוות השערות בדבר ערכי משתנים ואופן הפעולה, למה שהקוד מבצע בפועל.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! זוג עיניים רענן יכול לחולל פלאים!
[role="curriculum-javascript"]
-. *קריאת ההודעות בקונסול*.
-. *מציאת מקום השגיאה בקוד:* ישנן שלוש אפשרויות. 1. אם ההודעה בקונסול מציינת מספר שורה, יש לבדוק את השורה הזו ואת השורה שלפניה בקוד. 2. שימוש בהפיכת שורות להערות. אפשר לדייק את מיקום ואופי השגיאה על-ידי הפיכת בלוק של קוד להערה, והרצת הקוד. אם ההרצה, כעת, נקייה משגיאות, אז השגיאה היא בחלק שהפך להערה. 3. *תיקון שגיאות בעזרת print* יכול, גם הוא, לעזור במציאת מקום השגיאה. יש לקרוא את קטע הקוד בו נמצאת השגיאה ולעקוב אחרי אופן פעולתו. בעזרת `()println` ניתן להדפיס ערכים של משתנים (או הודעות), כשאופן פעולת הקוד לא ברורה. ההדפסות מאפשרות להשוות השערות בדבר ערכי משתנים ואופן הפעולה, למה שהקוד מבצע בפועל.
-. *תיקון השגיאה* בדיקת השגיאות, עריכת הקוד בהתאם והרצה חוזרת של הקוד כדי לוודא את נכונותו.
-. *בקשת עזרה*: אם אחרי השקעת זמן רב השגיאה לא תוקנה, כדאי לבקש עזרה מחבר/ה. זוג עיניים רענן יכול לחולל פלאים!
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. אם ההודעה בקונסול מציינת מספר שורה, יש לבדוק את השורה הזו ואת השורה שלפניה בקוד.
+.. שימוש בהפיכת שורות להערות. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. אם ההרצה, כעת, נקייה משגיאות, אז השגיאה היא בחלק שהפך להערה.
+.. *Print debugging* can also be used to locate an error. יש לקרוא את קטע הקוד בו נמצאת השגיאה ולעקוב אחרי אופן פעולתו. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. ההדפסות מאפשרות להשוות השערות בדבר ערכי משתנים ואופן הפעולה, למה שהקוד מבצע בפועל.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! זוג עיניים רענן יכול לחולל פלאים!
קטע הווידאו מדגים, שלב אחרי שלב, תיקון שגיאות בעזרת הדפסת ערכי משתנים:
@@ -250,103 +267,101 @@ video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
[[video15js]]
video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
-הצגנו רשימת שגיאות אפשריות בפרק הראשון. להלן רשימה של שגיאות אפשריות נוספות:
+You've seen a list of potential errors in Chapter 1. להלן רשימה של שגיאות אפשריות נוספות:
[role="curriculum-python"]
-. *אתחול משתנים*: יש לאתחל משתנים לפני השימוש בהם בסקריפט. פירוש הדבר, שיש להציב ערך במשתנים בתחילת הסקריפט.
-. *Comments:* Improper commenting will cause a <>. הערות בפייתון חייבות להתחיל בסימן `#`.
-. *הזחה (אינדנטציה):* הזחה היא קריטית בפייתון. Lack of indentation in `for` loop bodies will cause an <>.
-. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
-. *פרמטרים:* טעויות בפרמטרים של פונקציה יכולים לגרום לכל מיני סוגים של שגיאות. חובה לספק מספר נכון של פרמטרים מהטיפוס הדרוש.
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. חובה לספק מספר נכון של פרמטרים מהטיפוס הדרוש.
[role="curriculum-javascript"]
-. *אתחול משתנים*: יש לאתחל משתנים לפני השימוש בהם בסקריפט. פירוש הדבר, שיש להציב ערך במשתנים בתחילת הסקריפט. יש לאתחל את המשתנים בעזרת `var`.
-. *Comments:* Improper commenting will cause a <>. הערות ב-JavaScript חייבות להתחיל ב-`//`.
-. *נקודה פסיק:* כל הוראה ב-JavaScript חייבת להסתיים ב-;.
-. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
-. *פרמטרים:* טעויות בפרמטרים של פונקציה יכולים לגרום לכל מיני סוגים של שגיאות. חובה לספק מספר נכון של פרמטרים מהטיפוס הדרוש.
-
-
-Take a look at <> for a full description of different error types and what you can do to prevent them.
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. חובה לספק מספר נכון של פרמטרים מהטיפוס הדרוש.
+Take a look at <> for a full description of different error types and what you can do to prevent them.
[[musicaltips]]
=== טיפים מוסיקליים
-כעת, אחרי שהכרנו כלים רבים ליצירת מוסיקה, כמו הפונקציה `()fitMedia`, הפונקציה`()makeBeat`ולולאות`for`, נכיר מספר רעיונות מוסיקליים.
+Now that you have many tools to create your music, like `fitMedia()`, `makeBeat()` and `for` loops, we will look at musical ideas.
-נתחיל עם *הסולם (key)* של היצירה. שימו לב לכך שבעברית המילה סולם מציינת שני מונחים באנגלית scale ו-key:
+Let's start with the *key* of your song:
-* *גובה הצליל (pitch)* מורה כמה גבוה או נמוך נשמע הצליל. טונים מוסיקליים יחסיים מסודרים *בסולם (scale)*, או קבוצה של תווים מוסיקליים המסודרים לפי האופן בו אנו שומעים התדר של הצלילים.
-* *הסולם (key)* של שיר קובע את הסולם (scale), או קבוצת גבהי הצלילים, מהם המוסיקה מורכבת. סולם (key) יכול להיות מז'ורי (בדרך כלל נשמע "שמח" יותר) או מינורי (בדרך כלל נשמע "עצוב" יותר).
-* למלחינות מתחילות ולמלחינים מתחילים מומלץ להשתמש בסולם (key) אחד בשיר שלכם. שימוש בצלילים מסולמות שונים עלול לשיר להישמע "מזייף". הקליפים באותה תיקייה בספריית הצלילים של EarSketch, הם כולם באותו סולם.
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. סולם (key) יכול להיות מז'ורי (בדרך כלל נשמע "שמח" יותר) או מינורי (בדרך כלל נשמע "עצוב" יותר).
+* למלחינות מתחילות ולמלחינים מתחילים מומלץ להשתמש בסולם (key) אחד בשיר שלכם. Selecting sounds from different keys might sound... off-key! הקליפים באותה תיקייה בספריית הצלילים של EarSketch, הם כולם באותו סולם.
-האזינו לקליפ, ושמעו את ההבדל בין סולם מז'ורי לסולם מינורי:
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
++++
audioMedia/MajorMinor.mp3
++++
-כעת נדון בסוגים שונים של ערוצים שיכולים להיות בשיר. אפשר להשתמש בערוץ נפרד של ה-DAW לכל כלי בשיר. בשיר פופ, אפשר למצוא את הערוצים הבסיסיים הבאים:
+Now let's talk about the different types of tracks you can have. אפשר להשתמש בערוץ נפרד של ה-DAW לכל כלי בשיר. בשיר פופ, אפשר למצוא את הערוצים הבסיסיים הבאים:
-* המלודיה היא הרעיון העיקרי, שלעיתים קרובות, מנוגן או מושר בצלילים הגבוהים. המלודיה היא "התווים שהזמר/ת שר/ה". המלודיה יכולה להיות מושרת, מנוגנת בגיטרה או מנוגנת בצלילים הגבוהים של הקלידים.
-* ההרמוניה מורכבת מצלילים ארוכים יותר "שתומכים במלודיה" כמו האקורדים בפסנתר, בגיטרה או בהרכב כלי מיתר.
-* ישנו גם הבס (base line). ערוץ הבס מורכב מהצלילים הנמוכים יותר. הוא יכול להכיל נגינה של קונטרבס, גיטרה בס, צ'לו או הצלילים הנמוכים של הקלידים.
-* ולסיום, ערוץ כלי ההקשה. אם משתמשים ב-`()makeBeat`, יכולים להיות מספר ערוצים כאלה. לדוגמה, יכול להיות ערוץ אחד לקיק (kick), ערוץ שני לסנר (snare) וערוץ שלישי להיי-האט (hi-hat).
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. ערוץ הבס מורכב מהצלילים הנמוכים יותר. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. לדוגמה, יכול להיות ערוץ אחד לקיק (kick), ערוץ שני לסנר (snare) וערוץ שלישי להיי-האט (hi-hat).
-אלה הם רעיונות בסיסיים לסוגי ערוצים, שיוצרים את המבנה של מרקם השיר. אבל לשיר יכולים להיות חלקים שמכילים שמילים רק אחד או שניים מארבעת הסוגים. אפשר להוסיף ערוצים רבים נוספים: אפשר ליצור מלודיה שנייה, להוסיף נקודת עוגב (drone באנגלית. תו ארוך מאוד ברקע), קולות מוקלטים... נסו והחליטו מה מוצא חן באוזניכן/ם!
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
-לסיום נדון ב*חזרה* וב*ניגודיות (קונטרסט)*. בני אדם אוהבים חזרות בגלל מה שהפסיכולוגים מכנים "אפקט החשיפה גרידא". כשהמוח שומע קטע מוסיקלי הוא מנסה לנחש מה יהיה התו הבא, מה שגורם למאזין/ה להרגיש שותפות בנגינה. כמו כן, בכל פעם שהקטע חוזר, המאזין/ה יכול/ה להבחין בפרטים נוספים ביצירה, כי המוח כבר לא צריך להתמקד בעיבוד החומר המלודי הגולמי.
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. כשהמוח שומע קטע מוסיקלי הוא מנסה לנחש מה יהיה התו הבא, מה שגורם למאזין/ה להרגיש שותפות בנגינה. כמו כן, בכל פעם שהקטע חוזר, המאזין/ה יכול/ה להבחין בפרטים נוספים ביצירה, כי המוח כבר לא צריך להתמקד בעיבוד החומר המלודי הגולמי.
-קונטרסט מתייחס להבדלים בין קטעים עוקבים של מוסיקה, היוצרים איזון חשוב עם החזרה. קונטרסט משמש להבאת אלמנטים חדשים לתשומת לב המאזין/ה. קונטרסט יכול להיווצר בעזרת: שינויים ריתמיים, קווים מלודיים חדשים, הרמוניות חדשות או שינויים בכלים או בצלילים. דוגמה טובה לקונטרסט נמצאת בסביבות 21'0 (השנייה ה-21) ו-01'1 (דקה ושנייה) בשיר https://www.youtube.com/watch?v=AjjlABP5t1Q[Dream State] של Son Lux.
+קונטרסט מתייחס להבדלים בין קטעים עוקבים של מוסיקה, היוצרים איזון חשוב עם החזרה. קונטרסט משמש להבאת אלמנטים חדשים לתשומת לב המאזין/ה. קונטרסט יכול להיווצר בעזרת: שינויים ריתמיים, קווים מלודיים חדשים, הרמוניות חדשות או שינויים בכלים או בצלילים.
.תרגלו
****
צרו שיר בעזרת:
-* נושא (ציינו את הנושא בהערות בתחילת הקוד)
-* הפונקציות `()fitMedia` ו-`()makeBeat`
-* לולאת `for`אחת, או יותר, עם `()fitMedia` או `()makeBeat`
-* לפחות ארבעה ערוצים
-* לפחות 16 תיבות
+* נושא (ציינו את הנושא בהכרות בתחילת הקוד)
+* The `fitMedia()` and `makeBeat()` functions
+* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
+* At least four tracks
+* At least sixteen measures
* לפחות קליפ אחד שהועלה לספריית הצלילים
* הערות ומשתנים לארגון הקוד
זכרו שאתם יכולים לנסות דברים שונים ולשמור רק את מה שנשמע טוב ומשרת את השיר. שתפו את המוסיקה שיצרתם!
****
-
+{nbsp} +
[[chapter4summary]]
=== סיכום פרק רביעי
[role="curriculum-python"]
-* לולאת *for* מורה למחשב לבצע קטע קוד מספר פעמים, ויוצרת קוד יעיל יותר. לולאות`for` מורכבות מגוף הלולאה, מונה הלולאה והטווח. הקוד בגוף הלולאה חייב להיות מוזח ימינה.
-* *בקרת הזרימה* מייצגת את סדר הביצוע, על-ידי המחשב, של ההוראות בקוד.
-* הוראת`print` מחשבת את ערכו של הביטוי שמועבר כפרמטר ומדפיסה אותו בקונסול. זה כלי שימושי לתיקון שגיאות (debugging) כי הוא מאפשר ללמוד על מצב התכנית וערכי המשתנים.
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. הקוד בגוף הלולאה חייב להיות מוזח ימינה.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `print()` displays the data in the console. זה כלי שימושי לתיקון שגיאות (debugging) כי הוא מאפשר ללמוד על מצב התכנית וערכי המשתנים.
* הדפסה, הפיכת שורות קוד להערות והקונסול יכולים לעזור בתיקון שגיאות. בנוסף, בקשת עזרה יכולה לזרז את תהליך תיקון השגיאות.
-* Revisit the expanded list of common programming errors: <>.
-* *גובה הצליל (pitch)* קובע כמה גבוה או נמוך הצליל נשמע בסולם יחסי.
-* *הסולם (key)* קובע את *הסולם (scale)*, או קבוצת גבהי צלילים, בהם היצירה מולחנת, וגם את *צליל הטוניקה*. סולמות (keys) הם מז'וריים או מינוריים, דבר שמשרה על המאזין/ה הלכי רוח שונים.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. סולמות (keys) הם מז'וריים או מינוריים, דבר שמשרה על המאזין/ה הלכי רוח שונים.
* אפשר להשתמש בשלושה ערוצים כשלד של השיר: מלודיה (בצלילים גבוהים יחסית) בס (בצלילים נמוכים יחסית) וכלי הקשה.
[role="curriculum-javascript"]
-* לולאת *for* מורה למחשב לבצע קטע קוד מספר פעמים, ויוצרת קוד יעיל יותר. לולאות`for` מורכבות מגוף הלולאה, אתחול, הוראת איטרציה ותנאי הלולאה. הקוד בגוף הלולאה צריך להיות מוזח ימינה.
-* *בקרת הזרימה* מייצגת את סדר הביצוע, על-ידי המחשב, של ההוראות בקוד.
-* הפונקציה`()println` מחשבת את ערכם של הביטויים שמועברים כפרמטרים ומדפיסה אותם בקונסול. זה כלי שימושי לתיקון שגיאות (debugging) כי הוא מאפשר ללמוד על מצב התכנית וערכי המשתנים.
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. הקוד בגוף הלולאה צריך להיות מוזח ימינה.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `println()` displays the data in the console. זה כלי שימושי לתיקון שגיאות (debugging) כי הוא מאפשר ללמוד על מצב התכנית וערכי המשתנים.
* הדפסה, הפיכת שורות קוד להערות והקונסול יכולים לעזור בתיקון שגיאות. בנוסף, בקשת עזרה יכולה לזרז את תהליך תיקון השגיאות.
-* Revisit the expanded list of common programming errors: <>.
-* *גובה הצליל (pitch)* קובע כמה גבוה או נמוך הצליל נשמע בסולם יחסי.
-* *הסולם (key)* קובע את *הסולם (scale)*, או קבוצת גבהי צלילים, בהם היצירה מולחנת, וגם את *צליל הטוניקה*. סולמות (keys) הם מז'וריים או מינוריים, דבר שמשרה על המאזין/ה הלכי רוח שונים.
-* אפשר להשתמש בשלושה ערוצים כשלד של השיר: מלודיה (בצלילים גבוהים יחסית) בס (בצלילים נמוכים יחסית) וכלי הקשה.
-
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. סולמות (keys) הם מז'וריים או מינוריים, דבר שמשרה על המאזין/ה הלכי רוח שונים.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
[[chapter-questions]]
=== שאלות
[question]
--
-מי מהבאים אינו רכיב של לולאת`for`?
+Which of the following is NOT a component of a `for` loop?
+
[answers]
* מתרגם הלולאה
* מונה הלולאה
@@ -357,6 +372,7 @@ Take a look at <
-| קטן מ...
-|\=>
-| קטן מ... או שווה לו
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
|===
-שימו לב להבדל בין:
+Note the difference between:
-1. השוואה בין שני ערכים כדי לבדוק האם הם זהים: `==`
-2. הצבת ערך במשתנה: `=`
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
--
[role="curriculum-javascript"]
--
-כדי ליצור משתנה בוליאני, אפשר לאתחל משתנה (`var variable1 = true`), או להשתמש בהשוואה. כדי ליצור השוואה, נשתמש ב*אופרטור השוואה*. להלן האופרטורים להשוואה:
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. להלן האופרטורים להשוואה:
+
[cols="^h,1"]
|===
-| ===
-| זהה ל...
-|==!
-| לא זהה ל...
-|<
-| גדול מ...
-|=<
-| גדול מ... או שווה לו
+|===
+|is equal to
+
+|!==
+|is not equal to
+
|>
-| קטן מ...
-|\=>
-| קטן מ... או שווה לו
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
|===
-שימו לב להבדל בין:
+Note the difference between:
-1. השוואה בין שני ערכים כדי לבדוק האם הם זהים: `===`
-2. הצבת ערך במשתנה: `=`
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
--
[role="curriculum-python curriculum-mp4"]
[[video17apy]]
-video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
[role="curriculum-javascript curriculum-mp4"]
[[video17ajs]]
-video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
// this video will be cut at 2' to delete the section about boolean operators//
-
[role="curriculum-python"]
.תרגלו
****
-* צרו סקריפט חדש, והוסיפו צלילים בשני ערוצים.
-* הדפיסו `True` אם הערוץ הראשון בעל עוצמה גבוהה יותר מאשר הערוץ השני, והדפיסו`False` אחרת.
-* השתמשו בלולאת for עם המונה `track` כדי לבדוק, לכל ערוץ, האם עצמתו גדולה מ-0.01. אם כן, הדפיסו `True`, אחרת, הדפיסו `False`.
-* תוכלו להוסיף הוראת הדפסה לפני הדפסת`True` או `False` כך שכשתקראו את מה שהודפס בקונסול, תדעו מה `True` או`False`.
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
****
[role="curriculum-javascript"]
.תרגלו
****
-* צרו סקריפט חדש, והוסיפו צלילים בשני ערוצים.
-* הדפיסו `true` אם הערוץ הראשון בעל עוצמה גבוהה יותר מאשר הערוץ השני, והדפיסו`talse` אחרת.
-* השתמשו בלולאת for עם המונה `track` כדי לבדוק, לכל ערוץ, האם עצמתו גדולה מ-0.01. אם כן, הדפיסו `true`, אחרת, הדפיסו `false`.
-* תוכלו להוסיף הוראת הדפסה לפני הדפסת`true` או `false` כך שכשתקראו את מה שהודפס בקונסול, תדעו מה `true` או`false`.
+* Create a new script, and add sounds on two tracks.
+* Print `true` if the first track is louder than the second track, and `false` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
****
הנה דוגמה:
@@ -136,148 +147,150 @@ video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
----
[role="curriculum-python"]
-שימו לב: בדוגמה זו, השתמשנו במספר הוראות print עם מחרוזות כדי לסייע בקריאת תוכן הקונסול. השתמשנו באופרטור`+` כדי *לשרשר*, או לחבר מחרוזות, ובפונקציה ()str כדי להמיר מספרים למחרוזות.
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
[role="curriculum-javascript"]
-שימו לב: בדוגמה זו, השתמשנו במספר הוראות print עם מחרוזות כדי לסייע בקריאת תוכן הקונסול. השתמשנו באופרטור`+` כדי *לשרשר*, או לחבר מחרוזות.
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
[[conditionalstatements]]
=== הוראות תנאי
-מהי הוראת תנאי? *הוראה* היא מה שהמחשב מבצע. *הוראת תנאי* היא הוראה שמתבצעת אם, ורק אם, *תנאי* מסוים מתקיים. למשל, אם נתכנת רובוט לעצור כשהוא לפני מכשול, התנאי יהיה "האם יש לפני הרובוט מכשול?". אם יש, עצור. אם אין, המשך בפעולה.
+מהי הוראת תנאי? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. למשל, אם נתכנת רובוט לעצור כשהוא לפני מכשול, התנאי יהיה "האם יש לפני הרובוט מכשול?". אם יש, עצור. If no, don't do anything (keep going).
להלן דוגמה להוראת תנאי. שימו לב לדמיון ללולאת for:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled1.py.txt[]
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled1.js.txt[]
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
----
.תרגלו
****
-* צרו סקריפט חדש עם שני ערוצים.
-* אם אחד הערוצים בעצמה גבוהה יותר מעצמת הערוץ האחר, הקטינו את הווליום שלו. השתמשו בפונקציות`()analyzeTrack`ו-`()setEffect`, וב-if.
-* הגדירו הגבר שלילי (בין 1- ל-60dB-) כדי להקטין את העצמה.
+* Create a new script with two tracks.
+* אם אחד הערוצים בעצמה גבוהה יותר מעצמת הערוץ האחר, הקטינו את הווליום שלו. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
****
הנה דוגמה:
+
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
----
-לפעמים נדרש לבדוק מספר תנאים ולבצע בלוקים שונים של קוד, בהתאם לערכי התנאים. אפשר להוסיף כמה תנאים שצריך. יש להשתמש בתחביר (syntax) הבא:
+
+לפעמים נדרש לבדוק מספר תנאים ולבצע בלוקים שונים של קוד, בהתאם לערכי התנאים. You can chain multiple conditions together. יש להשתמש בתחביר (syntax) הבא:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled2.py.txt[]
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled2.js.txt[]
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
----
[[mixingyourtracks]]
-=== ערבול (מיקסוס)
+=== Mix your tracks
-נוכל להשתמש בכל הכלים האלה כדי למקסס שיר. למקסס, פירושו לשנות את עצמת הערוצים כל שישמעו מאוזנים (balanced).
+Let's use all these tools to mix your song. למקסס, פירושו לשנות את עצמת הערוצים כל שישמעו מאוזנים (balanced).
[role="curriculum-python"]
.תרגלו
****
* צרו סקריפט חדש.
-* הוסיפו קליפים בשלושה ערוצים לפחות ולאורך 16 תיבות לפחות.
-* השתמשו בפונקציה `()makeBeat`ובלולאת for כדי להוסיף כלי הקשה.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
* בחרו את הערוץ "המרכזי". הוא יכול להיות ערוץ המלודיה או ערוץ אחר שתרצו להדגיש.
-* אם עצמתו לא גדולה מעצמת הערוצים האחרים, הגבירו את עצמתו בעזרת הפונקציה `setEffect()`. התעלמו מערוץ כלי ההקשה, כי `()analyzeTrack` לא רלבנטי לכלי הקשה. `()analyzeTrack` מחזירה ממוצע, בעוד כלי הקשה מנגנים בפרצי צלילים, כך שממוצע לא מודד, באמת, את העצמה.
-* השתמשו ב-print כדי להציג בקונסול את התהליך. הנה הוראת print לדוגמה: `print('Is track number' + str(track) + 'greater than 0.01?')`, אם המונה `track`שווה ל-`1`, יודפס 'Is track number 1 greater than 0.01?'. הפונקציה`()str`ממירה מספר (לדוגמה: 1) למחרוזת (לדוגמה: '1').
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
****
[role="curriculum-javascript"]
.תרגלו
****
* צרו סקריפט חדש.
-* הוסיפו קליפים בשלושה ערוצים לפחות ולאורך 16 תיבות לפחות.
-* השתמשו בפונקציה `()makeBeat`ובלולאת for כדי להוסיף כלי הקשה.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
* בחרו את הערוץ "המרכזי". הוא יכול להיות ערוץ המלודיה או ערוץ אחר שתרצו להדגיש.
-* אם עצמתו לא גדולה מעצמת הערוצים האחרים, הגבירו את עצמתו בעזרת הפונקציה `()setEffect`. התעלמו מערוץ כלי ההקשה, כי `()analyzeTrack` לא רלבנטי לכלי הקשה.
-* השתמשו ב-print כדי להציג בקונסול את התהליך. הנה הוראת print לדוגמה: `print('Is track number' + str(track) + 'greater than 0.01?')`, אם המונה `track`שווה ל-`1`, יודפס 'Is track number 1 greater than 0.01?'.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
****
+Let's review some vocabulary:
-נעשה חזרה קצרה על מספר מושגים: *אופרטור*: תו (או מספר תווים) שמייצג פעולה. We have seen arithmetic operators (`+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `==`, `!=`).
-2. *ביטוי*: שילוב של ערכים, קבועים, משתנים, אופרטורים ופונקציות. המחשב מחשב את ערך הביטוי כדי לקבל תוצאה. בדרך כלל ערך הביטוי הוא ערך מספרי או בוליאני יחיד. For example: `1+2` (evaluated to 3) or `1<2` (evaluated to True) or `analyzeTrack(1,RMS_AMPLITUDE)` (evaluated to the loudness of track 1, a float between 0 and 1).
-3. *הוראות*: פקודות שעל המחשב לבצע.
-
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *ביטוי*: שילוב של ערכים, קבועים, משתנים, אופרטורים ופונקציות. המחשב מחשב את ערך הביטוי כדי לקבל תוצאה. בדרך כלל ערך הביטוי הוא ערך מספרי או בוליאני יחיד. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
-למטה יש דוגמה של מיקסוס אוטומטי. המיקסוס אוטומטי במובן זה שאפשר לשנות צלילים, בלי שיהיה צורך לבדוק את העצמה שלהם ולשנות ווליום בהתאם ידנית. הקוד יעשה זאת אוטומטית.
+למטה יש דוגמה של מיקסוס אוטומטי. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
----
+{nbsp} +
[[chapter6summary]]
=== סיכום פרק שישי
[role="curriculum-python"]
-* לפונקציה`()analyzeTrack` שני פרמטרים: מספר הערוץ והתכונה אותה נרצה לבדוק. כשהפרמטר השני הוא`RMS_AMPLITUDE`, הפונקציה תחזיר את עצמת הערוץ (מספר בין 0 ל-1). כשהפרמטר השני הוא`SPECTRAL_CENTROID`, הפונקציה תחזיר את בהירות הערוץ.
-* לטיפוס הנתונים *boolean* יש רק שני ערכים אפשריים, `True` ו-`False`.
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `True` and `False`.
* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
-* `==` מחשב האם שני הערכים שווים, בעוד `=` מציב ערך במשתנה.
-* *אופרטור* הוא תו (או מספר תווים) המייצג פעולה.
-* *ביטויים* מחושבים על-ידי המחשב כדי לקבל את ערכם.
-* *הוראה (statement)* היא פקודה לביצוע על-ידי המחשב.
-* *תנאי* הוא ביטוי שערכו יכול להיות `True` או `False`.
-* הוראת _if_ מבצעת את בלוק הקוד שלה אם, ורק אם, ערך התנאי שלה הוא `True`.
-* אם בהוראת _if_ ערך התנאי הוא`False`, הוראת _else_ אופציונלית, מאפשרת לבלוק קוד אלטרנטיבי להתבצע.
+* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
[role="curriculum-javascript"]
-* לפונקציה`()analyzeTrack` שני פרמטרים: מספר הערוץ והתכונה אותה נרצה לבדוק. כשהפרמטר השני הוא`RMS_AMPLITUDE`, הפונקציה תחזיר את עצמת הערוץ (מספר בין 0 ל-1). כשהפרמטר השני הוא`SPECTRAL_CENTROID`, הפונקציה תחזיר את בהירות הערוץ.
-* לטיפוס הנתונים *boolean* יש רק שני ערכים אפשריים, `true` ו-`false`.
-* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
-* `==` מחשב האם שני הערכים שווים, בעוד `=` מציב ערך במשתנה.
-* *אופרטור* הוא תו (או מספר תווים) המייצג פעולה.
-* *ביטויים* מחושבים על-ידי המחשב כדי לקבל את ערכם.
-* *הוראה (statement)* היא פקודה לביצוע על-ידי המחשב.
-* *תנאי* הוא ביטוי שערכו יכול להיות `true` או `false`.
-* הוראת _if_ מבצעת את בלוק הקוד שלה אם, ורק אם, ערך התנאי שלה הוא `true`.
-* אם בהוראת _if_ ערך התנאי הוא`false`, הוראת _else_ אופציונלית, מאפשרת לבלוק קוד אלטרנטיבי להתבצע.
-
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `true` and `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `true` or `false`.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
[[chapter-questions]]
=== שאלות
@@ -285,21 +298,24 @@ include::../../en/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.j
[question]
--
מי מהביטויים הבאים הוא בוליאני?
+
[answers]
-* `5+4 == 5`
+* `5+4 === 5`
* `measure = 1`
* `2<3<4`
-* `()False`
+* `False()`
--
[role="curriculum-python"]
[question]
--
מה יהי הפלט של קטע הקוד הבא (כלומר, מה הוא ידפיס לקונסול)?
+
[source,python]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.py.txt[]
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
----
+
[answers]
* 10
* 5
@@ -311,10 +327,12 @@ include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.py.txt[]
[question]
--
מה יהי הפלט של קטע הקוד הבא (כלומר, מה הוא ידפיס לקונסול)?
+
[source,javascript]
----
-include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.js.txt[]
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
----
+
[answers]
* 10
* 5
@@ -325,6 +343,7 @@ include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.js.txt[]
[question]
--
מה זה mixing?
+
[answers]
* התאמת הווליום של כל ערוץ כך שהם ישמעו מאוזנים (balanced)
* התאמת גובה הצלילים בכל ערוץ כך שהם ישמעו מאוזנים (balanced)
@@ -335,9 +354,10 @@ include::../../en/v2/code-examples/mixing-with-conditionals-untitled3.js.txt[]
[question]
--
כמה תנאים ניתן לבדוק בהוראת תנאי?
+
[answers]
* כל מספר של תנאים
* תנאי אחד
* שני תנאים
* שלושה תנאים
---
+--
\ No newline at end of file
diff --git a/src/locales/he/v2/optional.adoc b/src/locales/he/v2/optional.adoc
new file mode 100644
index 000000000..07dcd7366
--- /dev/null
+++ b/src/locales/he/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== אופציונלי: למדו עוד!
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. נלמד גם על אפקטים ומעטפות - השינוי בזמן של אפקטים. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/he/v2/unit-2.adoc b/src/locales/he/v2/unit-2.adoc
index 12143c41e..70330373b 100644
--- a/src/locales/he/v2/unit-2.adoc
+++ b/src/locales/he/v2/unit-2.adoc
@@ -3,4 +3,4 @@
:nofooter:
-ביחידה זו תלמדו על לולאות, שמאפשרות לחזור על הוראות בצורה יעילה. נלמד גם על אפקטים ומעטפות - השינוי בזמן של אפקטים. לסיום, נלמד למקסס ערוצים ולהשתמש בתנאים.
\ No newline at end of file
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. נלמד גם על אפקטים ומעטפות - השינוי בזמן של אפקטים. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/he/v2/unit-3.adoc b/src/locales/he/v2/unit-3.adoc
index 723c20f5f..2ec5fbcb4 100644
--- a/src/locales/he/v2/unit-3.adoc
+++ b/src/locales/he/v2/unit-3.adoc
@@ -5,4 +5,4 @@
אחרי שהיכרנו כלים רבים רבים ליצירת שיר, הוספת אפקטים וביצוע מיקס, נדון במבנה השיר. נשתמש, לשם כך, בפונקציות שמוגדרות על-ידי המתכנת (בניגוד לפונקציות שמוגדרות בפייתון ובספריית EarSketch)!
-נלמד גם על קלט מהמשתמש, ואיך ניתן להשתמש בו כדי ליצור שירים מותאמים אישית. לסיום, נלמד איך ניתן להשתמש במבני נתונים כדי לפשט את הקוד.
\ No newline at end of file
+We will also look at user inputs and how they can be embedded in your code to create personalize songs. לסיום, נלמד איך ניתן להשתמש במבני נתונים כדי לפשט את הקוד.
\ No newline at end of file
diff --git a/src/locales/he/v2/welcome.adoc b/src/locales/he/v2/welcome.adoc
index a125b8109..5bc3e58aa 100644
--- a/src/locales/he/v2/welcome.adoc
+++ b/src/locales/he/v2/welcome.adoc
@@ -1,10 +1,15 @@
[[welcome]]
-== ברוכים הבאים
+== ברוכים הבאים!
+
:nofooter:
-ברוכים הבאים ל-EarSketch!
+ברוכים הבאים ל-EarSketch!
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
-כאן תלמדו מדעי המחשב וטכנולוגיית מוסיקה. תשתמשו ב-Python או JavaScript כדי ליצור מוסיקה.
+*Students*: Continue below to learn more about EarSketch
+
+כאן תלמדו מדעי המחשב וטכנולוגיית מוסיקה. תשתמשו ב-Python או JavaScript כדי ליצור מוסיקה.
מוסיקאים ומתכנתים כותבים קוד כדי ליצור אפקטים חדשים ושירים.
@@ -12,8 +17,10 @@
[[video0]]
video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
-תכנות הוא מיומנות חשובה ומועילה במגוון גדול של מקצועות.
+תכנות הוא מיומנות חשובה ומועילה במגוון גדול של מקצועות.
+
+Maybe you'll become a legendary music producer or the industry's most sought-after recording engineer! אנחנו מאחלים לכם בהצלחה במסע זה.
-אולי תהפכו למפיקי-על או לטכנאי הקלטות מבוקשים! אנחנו מאחלים לכם בהצלחה במסע זה.
+הקליקו על החץ השמאלי בראש הטקסט כדי להתחיל.
-הקליקו על החץ השמאלי בראש הטקסט כדי להתחיל.
\ No newline at end of file
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/he/v2/your-first-song.adoc b/src/locales/he/v2/your-first-song.adoc
index 2de8388ce..af670faa0 100644
--- a/src/locales/he/v2/your-first-song.adoc
+++ b/src/locales/he/v2/your-first-song.adoc
@@ -1,124 +1,135 @@
[[customizeyourfirstsong]]
== שנו, לפי טעמכם/ן, את השיר הראשון שלכן/ם
+
:nofooter:
בפרק זה תלמדו איך לשנות את הקצב של השיר שלכם, להוסיף הערות לקוד ולטעון צלילים משלכם כדי להדגיש את המסר של השיר.
[[settempo]]
-=== הפונקציה `()setTempo`
+=== The `setTempo()` function
[role="curriculum-python"]
--
-בוודאי כבר שמתם לב לכך, שכאשר אתם יוצרים סקריפט חדש, יש אלמנטים עליהם עליכם לשמור כדי שהקוד שלכם ירוץ:
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
-. יש הערות שמתחילות ב-`#` באפור: נדון בהן בסעיף הבא
-. השורה `*from earsketch import`, שמוסיפה פונקציות (כמו `()fitMedia`) לפרויקט
-. הפונקציה `setTempo(120)` בה נדון בפירוט בהמשך
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
--
[role="curriculum-javascript"]
--
-בוודאי כבר שמתם לב לכך, שכאשר אתם יוצרים סקריפט חדש, יש אלמנטים עליהם עליכם לשמור כדי שהקוד שלכם ירוץ:
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
-. יש הערות שמתחילות ב-`//` באפור: נדון בהן בסעיף הבא
-. הפונקציה `setTempo(120)` בה נדון בפירוט בהמשך
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
--
-הפונקציה `()setTempo` קובעת את המהירות של השיר. *tempo* (בעברית: מפעם) מציין במוזיקה המערבית, את מספר הפעימות לדקה (bpm). ב-EarSketch ערך ברירת המחדל של הטמפו (כלומר, הערך הראשוני של המפעם) הוא 120bpm, שמתואם להליכה מהירה או מהירות צעידה. כדי לשנות את הטמפו, שנו את הערך שבסוגריים של הפונקציה `()setTempo`. ככל שהטמפו יותר גבוה, המוסיקה יותר מהירה. מותר להציב בפונקציה ערכים בין 45 ל-220.
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. ב-EarSketch' ערך ברירת המחדל של הטמפו (כלומר, הערך הראשוני של המפעם) הוא 120bpm, שמתואם להליכה מהירה או מהירות צעידה. To change the tempo, just change the number between the parentheses of the `setTempo()` function. ככל שהטמפו יותר גבוה, המוסיקה יותר מהירה. You can select a tempo between _45bpm and 220bpm_.
.תרגלו
****
-. צרו סקריפט חדש,
-. מקמו שני צלילים בשני ערוצים שונים,
-. שנו את הטמפו והאזינו לשיר,
-. השמיעו, לחבר/ה, את השיר בשלושה ערכי טמפו שונים. בקשו מהחבר/ה לדרג את השירים לפי הטמפו, מהנמוך לגבוה.
+. צרו סקריפט חדש.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. בקשו מהחבר/ה לדרג את השירים לפי הטמפו, מהנמוך לגבוה.
****
סוגה (ז'אנר) היא קטגוריה של יצירה אומנותית (לדוגמה: מוסיקה) שמאופיינת בדמיון בצורה, בסגנון ובתוכן. לסוגות שונות של מוזיקה אלקטרונית טווחים שונים של טמפו אופייני. לדוגמה:
[cols="^3*"]
|===
-|סוגה|BPM|דוגמה
+|סוגה |BPM |דוגמה
-|Hip Hop
-|85-95
-|Coolio - Gangsta's Paradise (feat. L.V.)
|Pop (פופ)
|110-130
-|Lizzo - Juice
-|Techno
-|120-125
-|Boris Brejcha - Schleierwolken
-|Electro (אלקטרו)
-|100-130
-|Apashe - Behind My Eyes (feat. LIA)
-|House (האוס)
-|115-130
-|DJ Breezy - Kimpinstik (feat. Dahlin Gage & Medikal)
-|Dubstep and Trap (דאבסטפ אנד טראפ)
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
|140-150
-|Jessica Audiffred & Walshy Fire - Stupid Love (feat. Nia V)
-|Drum & Bass (דראם אנ'בייס)
-|160-180
-|Mollie Collins - Lost & Found
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
|===
.תרגלו
****
. בחרו אמן או אמנית שאתם מאוד אוהבים. בררו לאיזו סוגה (ז'אנר) הוא/היא שייכים.
-. חפשו את הסוגה הזו (ב-Soundcloud או באתר דומה) והקשיבו למספר קטעי שירים מסוגה זו.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
. נסו למצוא קווי דמיון בין השירים.
. אתם יכולים לחקור וללמוד על סוגה זו בעזרת וויקיפדיה ומקורות אחרים.
****
-
-שימו לב לכך שקליפ יכול להישמע אחרת כשאתם שומעים אותו כמו שהוא וכשהוא משולב בשיר שלכם. סיבה אפשרית לכך היא שהטמפו של הקליפ שונה מהטמפו של השיר שלכם. כדי לדעת מהו הטמפו של קליפ בספרית הצלילים, עברו עם העכבר מעל השם שלו ברשימה. תוכלו לשנות את הטמפו של השיר שלכם לטמפו של הקליפ או לבחור קליפ אחר שמתאים לטמפו של השיר שלכם.
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
[[comments]]
-=== הוספת הערות לקוד
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
[role="curriculum-python"]
-*הערות* הן שורות קוד שלא מבוצעות על-ידי המחשב. הן משמשות אותנו, בני-אדם, להפיכת הקוד לקריא ומובן, לארגון הקוד וכדי לכתוב תזכורות לשימוש עתידי. Iבפייתון, הערות הן שורות המתחילות בסולמית `#`.
+In Python, comments are indicated by a line starting with a pound `#` symbol.
[role="curriculum-javascript"]
-*הערות* הן שורות קוד שלא מבוצעות על-ידי המחשב. הן משמשות אותנו, בני-אדם, להפיכת הקוד לקריא ומובן, לארגון הקוד וכדי לכתוב תזכורות לשימוש עתידי. ב-JavaScript, הערות הן שורות המתחילות בשני "סלאשים" `//`.
-
-שימו לב לכך ששורות הפתיחה בכל סקריפט הן הערות המתארות את הסקריפט. בכל סקריפט שתכתבו, יהיה עליכם/ן למלא שורות אלה בהערות המתאימות. זה מקל על מתכנתים אחרים להבין על מה הקוד שלכם.
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
.תרגלו
****
-בסקריפט שאתם/ן עובדים/ות עליו, מלאו את הפרטים הבאים בהערות בתחילת הקוד:
-
-. שם הסקריפט: שם השיר
-. המחבר: השם שלכם/ן
-. תיאור: תיאור קצר של הפרויקט
+In your current script, write a comment with a description of your song on the first line.
****
-אפשר להשתמש בהערות כדי לציין מה עושים חלקים שונים בקוד. הנה דוגמה. אפשר להריץ את הקוד. שימו לב שההערות מתארות את החלקים השונים בקוד:
+אפשר להשתמש בהערות כדי לציין מה עושים חלקים שונים בקוד. הנה דוגמה. אתם יכולים להריץ את הקוד. שימו לב שההערות מתארות את החלקים השונים בקוד:
[role="curriculum-python"]
[source,python]
----
-include::../../en/v2/code-examples/your-first-song-comments.py.txt[]
+include::code-examples/your-first-song-comments.py.txt[]
----
[role="curriculum-javascript"]
[source,javascript]
----
-include::../../en/v2/code-examples/your-first-song-comments.js.txt[]
+include::code-examples/your-first-song-comments.js.txt[]
----
+{nbsp} +
[[uploadingsounds]]
-=== טעינת קליפים של צלילים
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
-ניתן להעלות לספריית הצלילים קליפים של צלילים בעזרת דפדפן הצלילים. פתחו את דפדפן הצלילים ולחצו על "add sound" מתחת לפילטרים (אם הכפתור לא קיים, ודאו שבצעתם log in). ייפתח חלון. נבדוק את שלוש האפשרויות הראשונות:
+You must be logged in to upload sounds.
-. *Upload new Sound* מאפשר לכם לבחור קובץ שמע שנמצא במחשב שלכם. שנו את שם הקובץ, אם יש צורך בכך ("constant value(required)"), ולחצו "UPLOAD".
-. *Quick Record* מאפשרת לכם להקליט קטע קצר ישירות לספרייה של EarSketch. צפו בווידאו בהמשך למידע נוסף.
-. *Freesound* מאפשרת יבוא של צלילים מ-Freesound.org, מאגר של קבצי שמע. אתם יכולים לחפש במאגר סוג מסוים של צלילים (כמו: ציוץ ציפורים, גשם, רחוב סואן וכו'). תחת "Results", תופיע רשימה של קליפים. אתם יכולים לשמוע את הקליפ על-ידי לחיצה על play. אם הקליפ מוצא חן בעיניכם, תוכלו להעלות אותו על-ידי לחיצה על "UPLOAD".
+Let's explore the first three options.
-כדי למצוא את הצליל שהעליתם או הקלטתם, הקלידו את שם הקובץ בסרגל החיפוש בדפדפן הצלילים.
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
[role="curriculum-mp4"]
[[video101rec]]
@@ -126,29 +137,29 @@ video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
.תרגלו
****
-מוסיקה, ואמנות בכלל, היא, לעיתים קרובות, אמצעי להעברת מסר. המסר מועבר בעזרת המילים ו/או האופי של השיר. כתבו שיר קצר שמבטא משהו. זה יכול להיות הרגשה, שתרצו לשתף, או סיפור.
-
-. החליטו מה תרצו להביע בשיר
-. ואז, או שתכתבו מילים ותקליטו את עצמכם שרים או קוראים אותן או שתקליטו או תעלו צלילים שקשורים למסר
-. הוסיפו את ההקלטות לשיר בעזרת הפונקציה `()fitMedia`
-. הוסיפו צלילים מספריית הצלילים של EarSketch בעזרת הפונקציה `()fitMedia`
+מוסיקה, ואמנות בכלל, היא, לעיתים קרובות, אמצעי להעברת מסר. המסר מועבר בעזרת המילים ו/או האופי של השיר. כתבו שיר קצר שמבטא משהו. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
. השמיעו את השיר לחבר/ה
. שוחחו על השיר ועל הדברים שניסיתם להביע בו
****
-////
-OPTIONAL
-////
+An active computer program is called a *process*.
-*Processes*, או תהליכים, הם תוכניות מחשב שרצות במחשב שלכם. יחידת העיבוד המרכזית של המחשב או ה-*Central Processing Unit*, מבצעת אותן. יחידת העיבוד המרכזית נקראת, בקיצור, ה-CPU.
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
-ה- *זיכרון* של המחשב מאחסן נתונים והוראות עיבוד בהן משתמש ה-CPU. הזיכרון, שנקרא גם אחסון ראשי או RAM (Random Access Memory), מאחסן נתונים באופן זמני. רק מידע של תהליכים, שרצים כרגע, מאוחסן ב-RAM. זה מאפשר ל-CPU לגשת במהירות להוראות ולנתונים.
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
-יש הבדל בין זיכרון (או אחסון קצר טווח) לבין אחסון ארוך טווח. אחסון ארוך טווח, כמו דיסק קשיח או ענן, נקרא גם אחסון משני. *האחסון המשני* מכיל כמויות גדולות של נתונים לתקופות ארוכות, גם אחרי שהמחשב מכובה. ה-CPU לא מתקשר ישירות עם האחסון המשני. כשה-CPU מריץ תהליך, קודם כל, נטענים נתונים מהאחסון המשני אל הזיכרון כך שה-CPU יוכל לגשת אליהם במהירות.
+יש הבדל בין זיכרון (או אחסון קצר טווח) לבין אחסון ארוך טווח. אחסון ארוך טווח, כמו דיסק קשיח או ענן, נקרא גם אחסון משני. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. ה-CPU לא מתקשר ישירות עם האחסון המשני. כשה-CPU מריץ תהליך, קודם כל, נטענים נתונים מהאחסון המשני אל הזיכרון כך שה-CPU יוכל לגשת אליהם במהירות.
-לפעמים הנתונים בזיכרון, בהם משתמש ה-CPU, מגיעים מאמצעי קלט ולא מהאחסון המשני. *קלטים* הם האותות או הנתונים הנקלטים על-ידי המחשב, כמו שמע ממיקרופון, למשל. בדומה לכך, *פלטים* הם אותות או נתונים הנשלחים מהמחשב, כמו אות שמע דרך הרמקול, למשל. קלט/פלט או I/O, היא הדרך בה המחשב מתקשר עם העולם החיצוני, כולל בני אדם!
+לפעמים הנתונים בזיכרון, בהם משתמש ה-CPU, מגיעים מאמצעי קלט ולא מהאחסון המשני. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. קלט/פלט או I/O, היא הדרך בה המחשב מתקשר עם העולם החיצוני, כולל בני אדם!
-נסתכל על הקלטת צליל לתוך EarSketch כדוגמה לתהליך. ראשית, אנחנו מקליטים נתונים לתוך המחשב בעזרת אמצעי קלט - המיקרופון. ה-CPU מאחסן את נתוני השמע בזיכרון. כשנלחץ "play" כדי לשמוע את ההקלטה, ה-CPU ניגש לנתונים ושולח אותם לאמצעי פלט - אזניות או רמקול. כשנלחץ על upload, ה-CPU יריץ את התהליך שממיר את נתוני השמע לקובץ בפורמט שמע סטנדרטי (wav), וישלח את הקובץ לשרת EarSketch. השרת הוא מערכת חיצונית שמספקת שירותים לכל משתמשי EarSketch, כולל המחשב שלנו. שרת EarSketch יעביר את קובץ השמע מהזיכרון אל הזיכרון המשני כך שיוכל לגשת אליו בעתיד.
+Let's examine recording a sound into EarSketch as an example process. ראשית, אנחנו מקליטים נתונים לתוך המחשב בעזרת אמצעי קלט - המיקרופון. ה-CPU מאחסן את נתוני השמע בזיכרון. כשנלחץ "play" כדי לשמוע את ההקלטה, ה-CPU ניגש לנתונים ושולח אותם לאמצעי פלט - אזניות או רמקול. כשנלחץ על upload, ה-CPU יריץ את התהליך שממיר את נתוני השמע לקובץ בפורמט שמע סטנדרטי (wav), וישלח את הקובץ לשרת EarSketch. השרת הוא מערכת חיצונית שמספקת שירותים לכל משתמשי EarSketch, כולל המחשב שלנו. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
צפו בווידאו הבא:
@@ -163,68 +174,59 @@ END OF OPTIONAL
[[copyright]]
=== זכויות יוצרים
-*זכויות יוצרים* זה החלק של החוק שדן ב*קניין רוחני*, או הבעלות על יצירות, כמו מוסיקה. כשמשתמשים בסימפולים או עושים רמיקס למוסיקה קיימת, צריך לתת קרדיט למחברים. בסקריפט של EarSketch אפשר לעשות זאת בהערות בקוד. לפני שמשתמשים בצלילים של מוסיקאים אחרים וחולקים מוסיקה, יש ללמוד על זכויות יוצרים!
-
-*זכויות יוצרים* זה החלק של החוק שדן ב*קניין רוחני*, או הבעלות על יצירות, כמו מוסיקה.
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. כשמשתמשים בסימפולים או עושים רמיקס למוסיקה קיימת, צריך לתת קרדיט למחברים. בסקריפט של EarSketch אפשר לעשות זאת בהערות בקוד. לפני שמשתמשים בצלילים של מוסיקאים אחרים וחולקים מוסיקה, יש ללמוד על זכויות יוצרים!
כשאתם יוצרים משהו מקורי וממשי, יש לכם זכויות יוצרים עליו באופן אוטומטי! זה אומר שאתם יכולים להכין ממנו עותקים, לשנות אותו ולחלוק אותו.
-יש שתי זכויות יוצרים הקשורות לשיר: זכויות על השיר עצמו (של המחבר/ת) וזכויות על הביצוע, כלומר ההקלטה של השיר (בדרך כלל של חברת התקליטים). תמלוגים מביצועים פומביים של השיר משולמים למחבר/ת, ורוב התמלוגים ממכירת הקלטות של השיר משולמים לחברת התקליטים.
+יש שתי זכויות יוצרים הקשורות לשיר: זכויות על השיר עצמו (של המחבר/ת) וזכויות על הביצוע, כלומר ההקלטה של השיר (בדרך כלל של חברת התקליטים). תמלוגים מביצועים פומביים של השיר משולמים למחבר/ת, ורוב התמלוגים ממכירת הקלטות של השיר משולמים לחברת התקליטים.
-*הפרת זכויות יוצרים* היא פגיעה בזכויות היוצרים, כמו הורדה לא חוקית של מוסיקה, למשל. *שימוש סביר* מתיר שימוש בתוכן מוגן בזכויות יוצרים תחת מגבלות מסוימות, כמו שימוש לצרכי הוראה או שימוש לצרכי ביקורת, בהם משתמשים רק בקטעים קצרים מהיצירה. שימוש סביר נקבע לכל מקרה לגופו.
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
-בזכות השימוש הסביר, ישנה דרך לשימוש במוסיקה ושיתופה. זכויות יוצרים אמורות להקל על יצירה ושיתוף, ולא להכביד עליהן. EarSketch אפשרית בזכות אמניות ואמנים שמשתפים את עבודתם אתכם באמצעות *סימפולים* (קטעים קצרים של הקלטות) בספריית הצלילים. אמניות ואמנים אלה משתפים את הסימפולים תחת רישיון *Creative Commons*, שנותן הרשאה להשתמש ביצירות שלהם. ב-EarSketch יש לכם גישה חופשית לכל הסימפולים האלה. אתם יכולים לשתף אחרים במוסיקה שאתם יוצרים, אבל אסור לכם למכור אותה. שיתוף המוסיקה שיצרתם ולאפשר לאחרים להשתמש בקוד שלכם, היא הדרך שלכם להעביר את זה הלאה, ולתרום ליצירת עוד אמנות.
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
-רישיון*Creative Commons* (או CC) מאפשר ליוצרים לקבוע על אילו זכויות הם שומרים ועל אילו הם מוותרים. הנה כמה אפשרויות לרישיון CC: "מותר להשתמש ביצירה זו בכל אופן שתרצו ובלבד ש
-
-* שמי יופיע עליה." - Attribution (BY)
-* לא תשנו אותה בכלל." - No Derivatives (ND)
-* לא תרוויחו כסף ממנה." - Non-Commercial (NC)
-* תחלקו כל מה שתיצרו בעזרתה, תחת רישיון זהה." - Share-Alike (SA)
-
-כדי לקבוע את הרשאות ה-Creative Commons יש לבחור את סוג הרישיון ולכלול אותו ביצירה. לסקריפט, שמשותף ב-EarSketch, יש לציין את הרישיון.
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! זכויות יוצרים אמורות להקל על יצירה ושיתוף, ולא להכביד עליהן. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. שיתוף המוסיקה שיצרתם ולאפשר לאחרים להשתמש בקוד שלכם, היא הדרך שלכם להעביר את זה הלאה, ולתרום ליצירת עוד אמנות.
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
[[chapter2summary]]
=== סיכום פרק שני
[role="curriculum-python"]
-* *טמפו* הוא המהירות בה קטע מוסיקה מנוגן. הטמפו נתון בביטים לדקה (bpm). טמפו קשור לסוגה (ז'אנר).
-* הקליפים בספריית הצלילים של EarSketch מאורגנים בתיקיות של צלילים דומים. כדי לדעת מה הטמפו של קליפ, עברו בספריית הצלילים, עם העכבר, מעל שמו.
-* הערות הן שורות קוד שלא מבוצעות על-ידי המחשב. למרות שהן לא מבוצעות, הן מועילות לכתיבת הערות, הארות ותזכורות בתוך הסקריפט.
-* `*from earsketch import ` מוסיפה את ה-API של EarSketch לפרויקט שלך. השורה הזו חייבת להימצא בראש כל סקריפט.
-* `()setTempo` מאפשרת לקבוע את הטמפו (מפעם) של השיר. יש לכלול שורה כזו בכל סקריפט.
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). טמפו קשור לסוגה (ז'אנר).
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. כדי לדעת מה הטמפו של קליפ, עברו בספריית הצלילים, עם העכבר, מעל שמו.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. שורה זו חייבת להיכלל בכל סקריפט.
* אתם יכולים להעלות צלילים משלכם ל-EarSketch בעזרת דפדפן הצלילים. פשוט הקליקו על "Add sound".
-* *process או תהליך* הוא משימה שרצה במחשב. העיבוד מתבצע על-ידי ה-*CPU*, שאחראי לביצוע הוראות התכנית.
-* *זיכרון* (הנקרא גם RAM ואחסון ראשי) מאחסן, באופן זמני, נתונים והוראות לשימוש ה-CPU.
-* *אחסון משני* מתייחס לאחסון נתונים לזמן ארוך, לרוב בכמויות גדולות. נתונים מהאחסון המשני חייבים להטען לזיכרון לפני שה-CPU משתמש בהם.
-* *זכויות יוצרים* הוא החלק של החוק הדן בבעלות על עבודה יצירתית, כמו מוסיקה. זכויות יוצרים חשובות למוסיקאים כי הן מגדירות איך אמן או אמנית רשאים להשתמש יצירה של מישהו אחר.
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. נתונים מהאחסון המשני חייבים להטען לזיכרון לפני שה-CPU משתמש בהם.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
* אם יצרתם יצירה ממשית ומקורית, יש לכם, אוטומטית, זכויות יוצרים עליה. במילים אחריות, יש לכם בעלות על יצירות שיצרתם.
-* *Licensing או הרשאה לשימוש* של יצירה מוסיקלית נותנת לאחרים רשות להשתמש בה. לפעמים, זכויות מסוימות נשמרות בעזרת הרשאות *Creative Commons*. EarSketch מאפשרת הוספת הרשאת Creative Commons למוסיקה שלכם בחלונית השיתוף (Share).
+* *Licensing* a piece of music gives others permission to use it.
[role="curriculum-javascript"]
-* *טמפו* הוא המהירות בה קטע מוסיקה מנוגן. הטמפו נתון בביטים לדקה (bpm). טמפו קשור לסוגה (ז'אנר).
-* הקליפים בספריית הצלילים של EarSketch מאורגנים בתיקיות של צלילים דומים. כדי לדעת מה הטמפו של קליפ, עברו בספריית הצלילים, עם העכבר, מעל שמו.
-* הערות הן שורות קוד שלא מבוצעות על-ידי המחשב. הן משמשות לכתיבת הערות, הארות ותזכורות בקוד.
-* `;()setTempo` מאפשרת לקבוע את הטמפו (מפעם) של השיר. יש לכלול שורה כזו בכל סקריפט.
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). טמפו קשור לסוגה (ז'אנר).
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. כדי לדעת מה הטמפו של קליפ, עברו בספריית הצלילים, עם העכבר, מעל שמו.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. שורה זו חייבת להיכלל בכל סקריפט.
* אתם יכולים להעלות צלילים משלכם ל-EarSketch בעזרת דפדפן הצלילים. פשוט הקליקו על "Add sound".
-* *process או תהליך* הוא משימה שרצה במחשב. העיבוד מתבצע על-ידי ה-*CPU*, שאחראי לביצוע הוראות התכנית.
-* *זיכרון* (הנקרא גם RAM ואחסון ראשי) מאחסן, באופן זמני, נתונים והוראות לשימוש ה-CPU.
-* *אחסון משני* מתייחס לאחסון נתונים לזמן ארוך, לרוב בכמויות גדולות. נתונים מהאחסון המשני חייבים להטען לזיכרון לפני שה-CPU משתמש בהם.
-* *זכויות יוצרים* הוא החלק של החוק הדן בבעלות על עבודה יצירתית, כמו מוסיקה. זכויות יוצרים חשובות למוסיקאים כי הן מגדירות איך אמן או אמנית רשאים להשתמש יצירה של מישהו אחר.
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. נתונים מהאחסון המשני חייבים להטען לזיכרון לפני שה-CPU משתמש בהם.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
* אם יצרתם יצירה ממשית ומקורית, יש לכם, אוטומטית, זכויות יוצרים עליה. במילים אחריות, יש לכם בעלות על יצירות שיצרתם.
-* *Licensing או הרשאה לשימוש* של יצירה מוסיקלית נותנת לאחרים רשות להשתמש בה. לפעמים, זכויות מסוימות נשמרות בעזרת הרשאות *Creative Commons*. EarSketch מאפשרת הוספת הרשאת Creative Commons למוסיקה שלכם בחלונית השיתוף (Share).
-
-
-
+* *Licensing* a piece of music gives others permission to use it.
[[chapter-questions]]
=== שאלות
[question]
--
-מה `()setTempo` מאפשרת לעשות ב- EarSketch?
+What does `setTempo()` allow you to do in EarSketch?
+
[answers]
* לקבוע את הטמפו (מפעם) של השיר
* הוספת צליל לערוץ
@@ -235,6 +237,7 @@ END OF OPTIONAL
[question]
--
מה היחידה לטמפו?
+
[answers]
* פעימות לדקה (BPM)
* תיבות
@@ -245,6 +248,7 @@ END OF OPTIONAL
[question]
--
למה משמשות הערות?
+
[answers]
* כל התשובות נכונות
* ארגון הקוד
@@ -255,6 +259,7 @@ END OF OPTIONAL
[question]
--
מי מהטענות הבאות נכונה?
+
[answers]
* דיסק קשיח הוא דוגמה לאחסון משני
* נתוני שמע נשמרים ב-CPU
@@ -265,6 +270,7 @@ END OF OPTIONAL
[question]
--
כיצד משיגים זכויות יוצרים?
+
[answers]
* על-ידי יצירה ופרסום של עבודה חדשה
* על-ידי קניית פטנט
@@ -274,10 +280,11 @@ END OF OPTIONAL
[question]
--
-מה זה Creative Commons?
+What is a music license?
+
[answers]
-* הרשאה להשתמש ביצירה שלכם תחת מגבלות מסוימות
+* A license gives others permission to use a musical work
* תהליך הלחנה
-* הרשות לתבוע כל מי שמשתמש במוסיקה שלכם
-* רישיון שמאפשר לכם לגבות תגמולים
---
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/iu/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/iu/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/iu/v1/every-effect-explained-in-detail.adoc b/src/locales/iu/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..f52da48f9
--- /dev/null
+++ b/src/locales/iu/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTER
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/iu/v1/every-error-explained-in-detail.adoc b/src/locales/iu/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..9b0dfc157
--- /dev/null
+++ b/src/locales/iu/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*.
+
+The process of finding and fixing bugs is called *debugging*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/iu/v1/the-earSketch-api.adoc b/src/locales/iu/v1/the-earSketch-api.adoc
new file mode 100644
index 000000000..90e09c349
--- /dev/null
+++ b/src/locales/iu/v1/the-earSketch-api.adoc
@@ -0,0 +1,6 @@
+[[ch_27]]
+== The EarSketch API
+
+:nofooter:
+
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/iu/v2/add-beats.adoc b/src/locales/iu/v2/add-beats.adoc
new file mode 100644
index 000000000..3757cb508
--- /dev/null
+++ b/src/locales/iu/v2/add-beats.adoc
@@ -0,0 +1,339 @@
+[[addsomebeats]]
+== Add some Beats!
+
+:nofooter:
+
+In this chapter you will learn how to make your own beats! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
+
+[[variables]]
+=== Variables
+
+[role="curriculum-python curriculum-mp4"]
+[[video2py]]
+video::./videoMedia/002-05-Variables-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video2js]]
+video::./videoMedia/002-05-Variables-JS.mp4[]
+
+What is a variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
+
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
+
+To use a variable,
+
+[role="curriculum-python"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. You can only use the variable after it has been assigned, not before. For example, write `fitMedia(synth1, 1, 1, 3)`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-javascript"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. We also use the command `var` at the beginning of the line. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. For example, write `fitMedia(synth1, 1, 1, 3);`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-instead-of-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-instead-of-this.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+In your previous scripts, use variables to store your sound constants. Look at the examples below for help. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-variables.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-variables.js.txt[]
+----
+
+Note that it's important to name your variable in an understandable and descriptive way. For example, specify `synth1` instead of `music1` or `test`, which don't provide any information. This way, when you or someone else reads your code, they can see what you are referring to.
+
+A *constant* is similar to a variable because it stores values. However, the value of a constant never changes. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. By convention, constant names are capitalized and use underscores instead of spaces.
+
+[[drumbeatstrings]]
+=== Beat Strings
+
+Let's first learn some basic concepts about rhythm:
+
+* *Rhythm* is a pattern of sound, often repeated.
+* The *tempo* is the speed of the music in BPM (beats per minute).
+* A *beat* is like the "steady pulse" of a song. When members of an audience clap their hands in a concert, they're clapping on the beat.
+* A *measure* is a musical time unit with a predetermined number of beats. In EarSketch, 1 *measure* is 4 beats long. Since there are 4 beats in 1 measure, beats are also called *quarter (1/4) notes*.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. When you are counting 1/4 notes, you say "1, 2, 3, 4...." When counting 1/8 notes, you can use "ands": "1 and 2 and 3 and 4 and...."
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Note that the sum of all notes in one measure must be equal to 1. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* A *metronome* helps the musician set the rhythm of his or her piece by making a clicking noise on the beat. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
+
+[[imediameasurepng]]
+.A measure
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
+
+[[imediabeatpng]]
+.A beat
+[caption="Figure 3.2.2: "]
+image::../media/U1P1/beat.png[A beat]
+
+[[imediasixteenthnotepng]]
+.A sixteenth note
+[caption="Figure 3.2.3: "]
+image::../media/U1P1/sixteenthnote.png[A sixteenth note]
+
+.PRACTICE
+****
+Listen to your favorite song, and try to clap on the beat. You can do this exercise with your neighbor.
+****
+
+We'll compose each of our rhythms in a *beat* string.
+
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
+
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` starts playing the percussive sound clip (one hit of the drum, for example).
+* `+` extends the audio clip into the next sub-beat. It always follows a `0` or `+`.
+* `-` is a rest, meaning silence.
+
+.PRACTICE
+****
+For each of the following drumbeat strings, try clapping on the zeros. Then listen to the corresponding audio and verify if you were right. This exercise will help you understand how the drumbeat strings work.
+****
+
+Here are some examples of 1-measure beat strings:
+
+Quarter notes: `"0\+++0+++0\+++0+++"`
+(read: "1, 2, 3, 4")
+
+++++
+audioMedia/beatString1.mp3
+++++
+
+Eighth notes: `"0+0+0+0+0+0+0+0+"`
+(read: "1 and 2 and 3 and 4")
+
+++++
+audioMedia/beatString11.mp3
+++++
+
+Sixteenth notes: `"0000000000000000"`
+(that's very fast, depending on the tempo)
+
+++++
+audioMedia/beatString12.mp3
+++++
+
+`"0-0-0---0-0-0---"`
+(read: "1 and 2, 3 and 4")
+
+++++
+audioMedia/beatString2.mp3
+++++
+
+`"0---0---0-0-0---"`
+(read: "1, 2, 3 and 4")
+
+++++
+audioMedia/beatString3.mp3
+++++
+
+`"0---0---0---0000"`
+(read: "1, 2, 3, 4 e and a")
+
+++++
+audioMedia/beatString4.mp3
+++++
+
+{nbsp} +
+
+////
+ADDITIONAL VIDEO TO BE ADDED
+See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+video revamping tab
+////
+
+[[makebeat]]
+=== The `makeBeat()` function
+
+Now let's see how you can make your own beat. Here we use the term "beat" as a shorthand for drumbeat: a repeated rhythmic pattern of percussive sounds. We will use the `makeBeat()` function, with 4 arguments:
+
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
+
+Let's see more details with this video:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12py]]
+video::./videoMedia/3_3_makebeat_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12js]]
+video::./videoMedia/3_3_makebeat_js.mp4[]
+
+Here is the example shown in the video:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-multi-beat.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-multi-beat.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new `beatString1` variable, a 16-character string with the characters `"0"`, `"+"`, and `"-"`.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
+Please note that:
+
+. You should assign your variables with the `=` symbol before using them.
+. Just like `fitMedia()`, the `makeBeat()` function starts with a lowercase letter (`m`) and has an uppercase letter in the middle (`B`).
+. Just like `fitMedia()`, the `makeBeat()` function has 4 parameters separated by commas.
+
+When you hear your music, if you don't like your first version, tweak your beat to make it sound better and better, until you like what you have.
+****
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. You can either play them simultaneously, on two different tracks, or one after the other on one single track.
+****
+
+[[beatsandgenres]]
+=== Create a beat based on your musical genre
+
+Now that you've started working with `makeBeat()` and beat strings, let's explore some basic beat patterns that you can use.
+You've learned that a musical genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Similarly, some genres have signature beat patterns. Below are some examples:
+
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
+
+Here is the corresponding code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-examples-of-beats.js.txt[]
+----
+
+[[chapter3summary]]
+=== Chapter 3 Summary
+
+* In EarSketch, 1 measure is divided into 4 beats, or 4 quarter notes. 1 beat is divided into 4 sixteenth notes.
+* *Variables* create a space in computer memory to store data.
+* You first need to assign the value (data) to the variable name using the sign `=`. Then you can use the variable by writing its name in the code.
+* A *string* is a data type that consists of a series of characters encapsulated by single or double quotes.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Strings are used with the `makeBeat()` function to create rhythmic patterns in EarSketch. `makeBeat()` takes a beat string to define each sixteenth note of its pattern. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` takes four arguments:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these options is a string?
+
+[answers]
+* "Five"
+* 5
+* FIVE
+* Five
+--
+
+[question]
+--
+What does "0" represent in a beat pattern string?
+
+[answers]
+* Start playing the clip
+* Rest
+* Extend the clip
+* End the clip
+--
+
+[question]
+--
+In EarSketch, one measure is...
+
+[answers]
+* 4 beats long
+* 4 sub-beats long
+* 16 beats long
+* 1 quarter note
+--
+
+[question]
+--
+One sixteenth note is...
+
+[answers]
+* a quarter of a quarter note
+* half a beat
+* a quarter of a measure
+* 1 measure
+--
+
+[question]
+--
+To use the `makeBeat()` function, what is the order of parameters you need to provide?
+
+[answers]
+* clip name, track, start measure, beat string
+* tempo, track, start measure, end measure
+* clip name, start measure, end measure, beat string
+* beat string, track, start measure, clip name
+--
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/iu/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..6788ccea1
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // This is the "boom" sound.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/iu/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..39b8de864
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # This is the "boom" sound.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # This is the "ts" sound.
+
+# Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/iu/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/iu/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/iu/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..2bbded58b
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Setup
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/iu/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..02f305a40
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-variables.js.txt b/src/locales/iu/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..892e9ee9e
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Setup
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/add-beats-variables.py.txt b/src/locales/iu/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..615531008
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..b47ffdbce
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..8bfd9ef2b
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..f17f7606e
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..2bb8b3f8e
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/iu/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/iu/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..fe86e34c5
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Setup
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..5e0318ee0
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..b193b59d7
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Setup
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..7c13d7605
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Setup
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..fc4ac0026
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Setup
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..02b9bf3fd
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/iu/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/iu/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/iu/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..5393649b3
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Setup
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/iu/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..e7bcaac25
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-arrays.js.txt b/src/locales/iu/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..6f979e08f
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/iu/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..fc1a83742
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/iu/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..35d2a3f43
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/iu/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/iu/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/iu/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..c3be55257
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/iu/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..ddb76404f
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-list.py.txt b/src/locales/iu/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c6cfcd632
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/iu/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..0ccfffc88
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Setup
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/iu/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..9747b5b4a
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/iu/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..81e2dbe01
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Setup
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/iu/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dae36a455
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/iu/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..5fbe4a7ac
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Setup
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/iu/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..91f9bf807
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..1aaddaf46
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..3c2ae73a2
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..cd446e98c
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Setup
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..ca104ee90
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..a639ba4f0
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..0da37e8be
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..d123caa9a
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Setup
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..b0902254f
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..7221572eb
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..1b2cc9748
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..f5b833522
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Setup
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/iu/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..00ff28b70
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/iu/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..013470826
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Setup
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/iu/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/iu/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..8979b5185
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Setup
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/iu/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/iu/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..02ab97eb8
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/iu/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..ce6ff834d
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/iu/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..998a9d803
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/iu/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..c735d5b8f
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/iu/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..687c5da0f
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Setup
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/iu/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..d1fb96a5c
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/iu/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/iu/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/iu/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..93ca1ae9d
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Setup
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/iu/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..ef85ce675
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Setup
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/iu/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..67ba71708
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Setup
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/iu/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..d7cf9db54
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/iu/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/iu/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/iu/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/iu/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..1f9f0fea3
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..64a5b22b0
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/iu/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/iu/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/iu/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/iu/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..91f3bdf73
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/iu/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..95b76a723
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/iu/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..355a11de2
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/iu/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..f15821b9e
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/iu/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..dfe4c8900
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/iu/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..903928096
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Setup
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/iu/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..c5595e80f
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..79b65068e
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Setup
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..9d1438f4b
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..a0f162eeb
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..14b374cc9
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..9d8960e5c
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Setup
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..b2ac152d1
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..479e0e3fd
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..98ff5f56b
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/your-first-song-comments.js.txt b/src/locales/iu/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..d25a49cec
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Setup
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/iu/v2/code-examples/your-first-song-comments.py.txt b/src/locales/iu/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..a077c3b76
--- /dev/null
+++ b/src/locales/iu/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/iu/v2/custom-functions.adoc b/src/locales/iu/v2/custom-functions.adoc
new file mode 100644
index 000000000..748232c60
--- /dev/null
+++ b/src/locales/iu/v2/custom-functions.adoc
@@ -0,0 +1,285 @@
+[[customfunctionssongstructure]]
+== Custom Functions and Song Structure
+
+:nofooter:
+
+The song structure is the song's organization over time. The goal is to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own function, custom functions, to structure your songs!
+
+[[asongsstructure]]
+=== A song's structure
+
+:nofooter:
+
+A song can be divided into *sections*. A section is made up of several measures (musical time units), and it expresses an idea or feeling. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
+
+A common and simple *form*, or song structure, is ABA. A and B are two different sections, for example chorus and verse. The B section adds variety, while returning to the A section invokes familiarity. The code below creates an ABA form. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
+
+[[imediau2sections_052016png]]
+.An ABA form within the EarSketch DAW
+[caption="Figure 9.2: "]
+image::../media/U2/sections_052016.png[Alt Text]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Select a song that you like. Listen to it and try to notice the different sections. Can you tell when the musicians change sections? How many times do you hear the chorus and verse? What kind of contrasts can you observe? Share your example with your neighbor.
+****
+
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
+
+[[creatingyourcustomfunctions]]
+=== Create your custom functions
+
+In the previous example with the ABA song, the code is large, and the code is repeated for the second A section. There is a way to be more concise, thanks to *custom functions*! We will define a function that will represent section A, then call the function twice.
+
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. Here is how you would define section A:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-untitled1.js.txt[]
+----
+
+. `sectionA()` is the name we chose for our function. You can choose any name you like. Try to name your function in a descriptive way so your code is easier to read.
+. The instructions are the *body* of the function. They are indented.
+
+.PRACTICE
+****
+Paste this code in a new script, and run it. You should see that your DAW remains empty.
+That's because you need to *call* a function to use it.
+To call your function, add the line `sectionA()`, unindented, after your function definition. When running the code, you should see section A in your DAW
+****
+
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. To remedy this issue, we will create *parameters* for our function.
+
+.PRACTICE
+****
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. When you call your function, add the parameters `1` and `5` between the parentheses. Run the code to make sure there is no error.
+1. Add a second function call, this time with the parameters `9` and `13`. Run the code to make sure there is no error.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
+****
+
+Here is what your code could look like:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+----
+
+//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
+
+[role="curriculum-python curriculum-mp4"]
+[[video93py]]
+video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video93js]]
+video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
+
+[[transitionstrategies]]
+=== Transition Strategies
+
+Now that you know how to create custom functions to structure your song, let's look at transitions. *Transitions* help one section smoothly go into the next. They can connect verse and chorus, build up to a drop, mix between tracks (DJing), or change keys. The goal of a transition is to grab the listener's attention and let them know a change is about to occur.
+
+Following are some popular strategies for creating musical transitions:
+
+. *Crash Cymbal*: Placing a crash cymbal on the first beat of a new section.
+. *Drum Fill*: A rhythmic variation to fill the gap before a new section.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Melody Variation*: Introducing a variation of the chords, bass line, or melody before the new section. Often, a folder within the EarSketch sound library contains variations of a similar riff.
+. *Riser*: A note or noise that increases in pitch. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. You can use the search term "riser" in the Sound Browser. A reversed crash cymbal can be used as a riser, like YG_EDM_REVERSE_CRASH_1.
+. *Snare Roll*: A sequence of repeated snare hits, with increasing density, pitch, or amplitude. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping*: Repeating a short segment of melody before a new section.
+. *Crossfading*: Decreasing the volume of one section while increasing the volume of a new section.
+. *Anacrusis*: When the melody of the new section starts a couple beats early.
+
+.PRACTICE
+****
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. You can work in pairs. Once you've thought about it, you can have a look at the examples below.
+
+The transition should be placed one or two measures before the new section. You can use several transition techniques at the same time.
+****
+
+Drum fills:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+----
+
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. An example is shown below.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+----
+
+The next example uses multiple risers and a crash cymbal during the transition.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
+----
+
+{nbsp} +
+
+[[yourfullsong]]
+=== Your full song
+
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. Functions are one kind of abstraction used in computer science. They pack multiple statements into one tool so they can be easily referred to. Abstractions can make the form of a program clearer.
+
+.PRACTICE
+****
+Let's create a full song using all the tools you've discovered in EarSketch! Here is a suggestion of how to work, but you can adapt it as you like:
+
+. Choose a theme for your song. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. Then select a simple structure.
+. And finally, start coding! Start with some `fitMedia()` functions to select sounds.
+. Use `makeBeat()` to add some percussion.
+. You can upload your own sounds.
+. Use `for` loops to reduce repetition in your code.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
+. Add one or several conditional statements.
+. Make sure you use variables to store some information such as sound constants.
+. Make sure you use comments to explain what you are doing.
+. Don't forget to regularly run your code and listen to your song. This will help you modify it until you like the sound of it.
+. Choose a name for your song.
+****
+
+Here is an example of a full song:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+----
+
+In this example, we have used a `for` loop inside a custom function! We have used parameters of the function (`start` and `end`) inside the for loop.
+
+[[chapter7summary]]
+=== Chapter 7 Summary
+
+* *Sections* are related musical units consisting of multiple measures. Each expresses an idea or feeling.
+* *Transitions* are passages of music used to connect consecutive musical sections.
+* The structure and variety found within a song is known as its *form*. A common musical form is A-B-A.
+* *Custom functions* are unique functions written by the programmer to accomplish a specific task. You have to create a custom function to be able to call it. You can create as many parameters as you want.
+* An *abstraction* is the bundling of ideas to form a single, often less complex, concept. Functions are an example of abstraction.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these is NOT an example of a musical section?
+
+[answers]
+* Drums
+* Intro
+* Verse
+* Chorus
+--
+
+[question]
+--
+What is an abstraction?
+
+[answers]
+* A bundling of ideas to form a single concept
+* A variety of sounds throughout sections
+* Parts of a song that are related, but also are distinct from each other
+* A statement that returns a value to the function call
+--
+
+[role="curriculum-python"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
+* `myFunction(2, 5)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
+* `myFunction(2, 5)`
+--
+
+[question]
+--
+Which of these is NOT an example of a transition?
+
+[answers]
+* Melody Consistency
+* Crash Cymbal
+* Riser
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/iu/v2/data-structures.adoc b/src/locales/iu/v2/data-structures.adoc
new file mode 100644
index 000000000..392a3b3e5
--- /dev/null
+++ b/src/locales/iu/v2/data-structures.adoc
@@ -0,0 +1,497 @@
+[[getorganizedwithdatastructures]]
+== Data Structures
+
+:nofooter:
+
+[role="curriculum-python"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called lists, and a new functionality of `makeBeat()`.
+
+[role="curriculum-javascript"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called arrays, and a new functionality of `makeBeat()`.
+
+[[datastructures]]
+=== What is a Data Structure
+
+[role="curriculum-python"]
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-javascript"]
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
+----
+
+[role="curriculum-python"]
+If you have replaced variables with a list, how will you reference the content of the list? We use indices. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+[role="curriculum-javascript"]
+If you have replaced variables with an array, how will you reference the content of the array? We use indices. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+.PRACTICE
+****
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-list.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-arrays.js.txt[]
+----
+
+//.The EarSketch Share window for collaboration (Let Others Edit)
+
+//[caption="Figure 21.4.2: "]
+
+image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
+
+[role="curriculum-python"]
+We've seen that `list[index]` will reference an element of the list. This can also be used to modify an element of the list. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+[role="curriculum-javascript"]
+We've seen that `array[index]` will reference an element of the array. This can also be used to modify an element of the array. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+.PRACTICE
+****
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. You can use the track number as the counter.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
+****
+
+Below is an example. You can have a look in the console to see what is printed when you run the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
+----
+
+[role="curriculum-python"]
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-javascript"]
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-additive-introduction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-additive-introduction.js.txt[]
+----
+
+{nbsp} +
+
+[[usingdatastructureswithmakebeat]]
+=== Use Data Structures with `makeBeat()`
+
+[role="curriculum-python"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
+
+[role="curriculum-javascript"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
+
+[role="curriculum-python"]
+* Like lists, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[role="curriculum-javascript"]
+* Like arrays, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[cols="h,^,^,^,^,^,^,^,^,^"]
+|===
+|Character
+|E
+|a
+|r
+|S
+|k
+|e
+|t
+|c
+|h
+
+|Index
+|0
+|1
+|2
+|3
+|4
+|5
+|6
+|7
+|8
+|===
+
+[role="curriculum-python"]
+* You can concatenate lists together like you do with strings. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
+
+[role="curriculum-javascript"]
+* You can concatenate arrays together like you do with strings. We use the `concat` *method*. A method is similar to a function as it has parentheses which contain parameters. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
+
+[role="curriculum-python"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
+
+[role="curriculum-javascript"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your lists.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your arrays.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+Here is an example of a solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
+----
+
+This is an example of how you can use string operations with `makeBeat()`:
+
+[role="curriculum-python curriculum-mp4"]
+[[video13py]]
+video::./videoMedia/013-03-Substrings-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video13js]]
+video::./videoMedia/013-03-Substrings-JS.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-operations.js.txt[]
+----
+
+[role="curriculum-python"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-javascript"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Copy the code example in chapter 3.4 for beats by genre. Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
+****
+
+Here is the solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-examples-of-beats.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. You can refer to the video in chapter 3.4 for beats by genre. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
+****
+
+{nbsp} +
+
+[[evaluatingcorrectness]]
+=== Evaluate Correctness
+
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Here are some elements that you can check:
+
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Here are some questions that can help you make your code more concise:
+** Did I copy/paste function calls several times in a row? If so, simplify with a loop!
+** Am I reusing any blocks of code? If so, put them in a function!
+** Are there sound constants or mathematical expressions that I use repeatedly throughout my code? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. If your peers are getting lost or confused by your code, it is probably unclear. Here are some questions to help you make your code clear:
+** Are the names of my variables and functions descriptive? If not, rename them.
+** Have I used comments to explain each block of code and any potentially confusing lines of code?
+** Have I used computational structures like custom functions and loops to help organize my code?
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
+
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. When giving feedback:
+
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
+
+Likewise, when receiving feedback:
+
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. This will allow your peers to provide feedback that is most helpful to you.
+* *Listen* - Wait to respond until your peer has finished speaking. Be attentive to the information your peer is conveying. Comment your code based on their feedback. These comments can be useful when revising.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in a list.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in an array.
+****
+
+[[chapter9summary]]
+=== Chapter 9 Summary
+
+[role="curriculum-python"]
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Items stored within a list, or elements, can be any data type.
+* Like strings, list elements get assigned an index. List indices start at 0.
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[role="curriculum-javascript"]
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
+* Like strings, array elements get assigned an index. Array indices start at 0.
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following operations is used to join lists/arrays?
+
+[answers]
+* Concatenation
+* Slicing
+* Combination
+* Addition
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the index number of the first element of a list in Python?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What does `len(myList)` return?
+
+[answers]
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
+[answers]
+* `listA + listB`
+* `listA ++ listB`
+* `listA and listB`
+* `listB + listA`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How can you get a list from oldList without the first and last elements?
+
+[answers]
+* `oldList[1:len(oldList) - 1]`
+* `oldList[1:len(oldList)]`
+* `oldList[0:len(oldList)]`
+* `oldList[2:len(oldList - 1)]`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the index number of the first element of an array in Javascript?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What does `myArray.length` return?
+
+[answers]
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
+[answers]
+* `arrayA.concat(arrayB)`
+* `arrayA.concatenate(arrayB)`
+* `arrayB.concat(arrayA)`
+* `arrayB.concatenate(arrayB)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How can you get an array from `oldArray` without the first and last elements?
+
+[answers]
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
+--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/iu/v2/effects-and-envelopes.adoc b/src/locales/iu/v2/effects-and-envelopes.adoc
new file mode 100644
index 000000000..92b9ab79b
--- /dev/null
+++ b/src/locales/iu/v2/effects-and-envelopes.adoc
@@ -0,0 +1,321 @@
+[[effectsandenvelopes]]
+== Effects and Envelopes
+
+:nofooter:
+
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
+
+[[effectsinearsketch]]
+=== Use Effects in EarSketch
+
+:nofooter:
+
+*Effects* allow us to change qualities of sounds. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
+
+[role="curriculum-python curriculum-mp4"]
+[[video4py]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video4js]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
+
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
+
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+
+.PRACTICE
+****
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
+****
+
+Here is an example below:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
+----
+
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
+
+No effect:
+
+++++
+audioMedia/reference.mp3
+++++
+
+Delay effect:
+
+++++
+audioMedia/delay2.mp3
+++++
+
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
+
+.PRACTICE
+****
+. Read about the delay effect in the list of effects chapter here: <>
+. Then run the code below and listen to the music without effects
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
+----
+
+{nbsp} +
+
+[[functionsandmoreeffects]]
+=== Functions and more effects
+
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Note that the function names always start with a lower-case letter, and are often a verb. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
+
+[role="curriculum-python"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+[role="curriculum-javascript"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
+
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
+
+Now, let's play more with the `setEffect()` function. The following video shows how to use some effects:
+
+////
+VIDEO IS BEEING MADE
+more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+("videos revamping" tab)
+////
+
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
+
+Listen to the clips below to hear the result of adding reverb to a track:
+
+No effect:
+
+++++
+audioMedia/reverbReference.mp3
+++++
+
+Reverb effect:
+
+++++
+audioMedia/reverbEffect.mp3
+++++
+
+{nbsp} +
+
+.PRACTICE
+****
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
+****
+
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
+
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
+
+*Envelopes* allow us to define how an effect changes over time.
+
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
+
+[[envelopepoints]]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
+image::../media/U2/NewEnvelope.png[Alt Text]
+
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
+
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
+
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
+
+Here is an example of fade in:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
+----
+
+Now watch this video for other envelope examples
+
+[role="curriculum-python curriculum-mp4"]
+[[video5b]]
+video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript curriculum-mp4"]
+video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new song. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
+****
+
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+----
+
+And here is an example of fade in and fade out on all the tracks:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter5summary]]
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does an effect allow you to do in EarSketch?
+
+[answers]
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
+--
+
+[question]
+--
+Which of these is NOT a `setEffect()` argument?
+
+[answers]
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
+--
+
+[question]
+--
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
+[answers]
+* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
+* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
+* `fitMedia(DELAY, 3, DELAY_TIME, 50.0)`
+* `setEffect(50, DELAY_FEEDBACK, 1)`
+--
+
+[question]
+--
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
+[answers]
+* Clip Length
+* Start Value
+* Track Number
+* Effect
+--
+
+[question]
+--
+What would the following `setEffect()` function do?
+
+[source,python]
+----
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
+----
+
+[answers]
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/iu/v2/get-user-input.adoc b/src/locales/iu/v2/get-user-input.adoc
new file mode 100644
index 000000000..27edbca84
--- /dev/null
+++ b/src/locales/iu/v2/get-user-input.adoc
@@ -0,0 +1,391 @@
+[[getuserinput]]
+== Get User Input
+
+:nofooter:
+
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. For that, we'll look at return statements and the `readInput()` function.
+
+[[returnstatement]]
+=== Return Statement
+
+Watch this video first:
+
+[role="curriculum-python curriculum-mp4"]
+[[video131py]]
+video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video131js]]
+video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
+
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. B. signals the function to stop. If you have any statements after the `return` keyword, they will be ignored.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
+
+Here is a code example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements.js.txt[]
+----
+
+With the return statement, the complete control flow for a function looks like this:
+
+[[return]]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
+image::../media/U2/Return.png[Alt Text]
+
+.PRACTICE
+****
+Create a function that will implement a musical section with:
+
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
+
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
+
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
+
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
+
+Then call the function at different measures with different variations.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-conditional-statement.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-conditional-statement.js.txt[]
+----
+
+{nbsp} +
+
+[[userinput]]
+=== Get User Input
+
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. The `readInput()` function returns what the user types there.
+
+For example, copy the following code in a new script, and run it:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-untitled1.js.txt[]
+----
+
+We might need to convert the returned user input into a different data type. Here are useful functions:
+
+[role="curriculum-python"]
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
+
+[role="curriculum-javascript"]
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
+
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-1.js.txt[]
+----
+
+Here is another example of what you can do with user input.
+
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ask for a user input to modify something in your song.
+
+Here are ideas of tools you can use:
+
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
+****
+
+{nbsp} +
+
+[[booleanlogic]]
+=== Boolean Logic
+
+We will now combine boolean logic and user input for another example of user interaction.
+
+[role="curriculum-python"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
+
+[role="curriculum-javascript"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
+
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
+
+[role="curriculum-python"]
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
+
+[role="curriculum-javascript"]
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
+
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `True` or `False`?
+
+* `not True`
+* `True and False`
+* `True or False`
+* `True and True`
+* `(True and False) or True`
+* `True and not False`
+* `not (False or False)`
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `true` or `false`?
+
+* `!true`
+* `true && false`
+* `true || false`
+* `true && true`
+* `(true && false) || true`
+* `true && !false`
+* `!(false || false)`
+****
+
+Use the following code to print the answers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
+----
+
+Here is a reminder of boolean creation, and some examples of boolean operations:
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+
+.PRACTICE
+****
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-operations.js.txt[]
+----
+
+{nbsp} +
+
+.CHALLENGE
+****
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
+****
+
+{nbsp} +
+
+[[chapter8summary]]
+=== Chapter 8 Summary
+
+[role="curriculum-python"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[role="curriculum-javascript"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following would be considered an example of data type conversion?
+
+[answers]
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Using `readInput()` to ask a user for a genre.
+* Producing a Boolean through a comparison operator.
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+not (True and (4 > 5))
+----
+
+[answers]
+* `True`
+* `5`
+* `4`
+* `False`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+!(true && (4 > 5));
+----
+
+[answers]
+* `true`
+* `4`
+* `false`
+* `5`
+--
+
+[question]
+--
+Which of the following is an example of concatenation?
+
+[answers]
+* `x = beatstring1 + beatstring2`
+* `x = beatstring1.beatstring2`
+* `x = (beatstring1, beatstring2)`
+* `x = beatstring1[beatstring2]`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How would you obtain the boolean True with the booleans True and False?
+
+[answers]
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How would you obtain the boolean true with the booleans true and false?
+
+[answers]
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/iu/v2/getting-started.adoc b/src/locales/iu/v2/getting-started.adoc
new file mode 100644
index 000000000..c90f659c1
--- /dev/null
+++ b/src/locales/iu/v2/getting-started.adoc
@@ -0,0 +1,386 @@
+[[getstartedwithearsketch]]
+== Getting Started with EarSketch
+
+:nofooter:
+
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
+
+[[discoverearsketch]]
+=== Discover EarSketch
+
+:nofooter:
+
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
+
+////
+TODO: upload video
+////
+
+As you become familiar with EarSketch these are the main panels.
+
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
+
+{nbsp} +
+
+_What is a DAW?_
+
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
+
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
+
+EarSketch is DAW that allows you to create music by writing code.
+
+Here is how to make full use of the DAW:
+
+[role="curriculum-mp4"]
+[[video1b]]
+video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-intro-script.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-intro-script.js.txt[]
+----
+
+{nbsp} +
+
+[[createanewscript]]
+=== Create your first script!
+
+Let's see how to create a script from scratch.
+
+. *Create.* In the editor tabs, click the white "+" icon.
++
+If this is your first script, click the large blue text "Click here to create a new script!"
++
+[[newscriptplus]]
+.Create a new script, open scripts
+[caption="Figure 1.2.1: "]
+image::../media/U1P1/NewScriptPlus.png[Alt Text]
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
++
+[[newscriptpromptpy]]
+.The create a new script dialog box
+[role="curriculum-python"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
+[[newscriptpromptjs]]
+.The create a new script dialog box
+[role="curriculum-javascript"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+
+*_What is a programming language?_*
+
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
+
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
+
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
+
+[[fitmedia]]
+=== The `fitMedia()` function
+
+Now that you have created your first script, let's start working on your music!
+
+Watch this video to see how to add an audio clip to your song:
+
+[role="curriculum-python curriculum-mp4"]
+[[video110py]]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video110js]]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
+
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
+
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
+
+////
+OPTIONAL
+////
+
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
+
+////
+END OF OPTIONAL
+////
+
+////
+OPTIONAL
+////
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia.js.txt[]
+----
+
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using sounds that you like:
+
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
+
+For each exercise, you can have your neighbour listen to your song.
+
+If you have errors when running your code, check out the next chapter about debugging.
+****
+
+[[debugging]]
+=== Debug your code
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. You can use debugging strategies, using the console.
+
+[role="curriculum-python curriculum-mp4"]
+[[video3py]]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video3js]]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+////
+OPTIONAL
+////
+
+What are the different types of errors?
+
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
+
+////
+END OF OPTIONAL
+////
+
+Here are some common errors:
+
+[role="curriculum-python"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
+
+[role="curriculum-javascript"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
+
+Time to practice!
+Find the five errors in the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-finding-errors.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-finding-errors.js.txt[]
+----
+
+////
+OPTIONAL
+////
+
+Here is the answer
+
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
+
+////
+END OF OPTIONAL
+////
+
+Take a look at <> for a description of different error types and what you can do to prevent them.
+
+////
+TODO: when options are ready, modify the link
+////
+
+[[chapter1summary]]
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a panel in the EarSketch workspace?
+
+[answers]
+* The effects browser
+* The code editor
+* The DAW
+* The console
+--
+
+[question]
+--
+How many parameters do you need for your `fitMedia()` function?
+
+[answers]
+* 4
+* 6
+* 2
+* 3
+--
+
+[question]
+--
+One script corresponds to...
+
+[answers]
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
+--
+
+[question]
+--
+What is a measure?
+
+[answers]
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
+--
+
+[question]
+--
+Which of the following is NOT a common type of error found in code?
+
+[answers]
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
+--
+
+[question]
+--
+Where in the EarSketch workspace can you get information about your bugs?
+
+[answers]
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/iu/v2/legacy.adoc b/src/locales/iu/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/iu/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/iu/v2/loops-and-layers.adoc b/src/locales/iu/v2/loops-and-layers.adoc
new file mode 100644
index 000000000..52974c50d
--- /dev/null
+++ b/src/locales/iu/v2/loops-and-layers.adoc
@@ -0,0 +1,414 @@
+[[loopandlayers]]
+== Loops and Layers
+
+:nofooter:
+
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. We will also cover musical layers and textures as well as some debugging tips.
+
+[[forloops]]
+=== `for` loops
+
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
+
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
+
+////
+add new video
+more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=0
+in the "revamping videos" tab (includes link to script)
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
+----
+
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
+
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+
+[[loop-components-PY]]
+.The basic components of a for loop
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.The basic components of a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
+.PRACTICE
+****
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
+[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `print()` call.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-printing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-printing.js.txt[]
+----
+
+Here, you will see in your console the following lines:
+
+----
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
+3
+ok
+4
+ok
+----
+
+and it ends there since measure has to be lower than 5, so 4 is your limit.
+
+[[controlflow]]
+=== Control Flow
+
+Here is another example of how you can use `for` loops:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12bpy]]
+video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12bjs]]
+video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
+
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-no-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-no-loops.js.txt[]
+----
+
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-loops.js.txt[]
+----
+
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
+
+A loop is a *control flow statement*, which changes the order. At the end of a loop body, it jumps back to the top of the loop.
+
+This animation shows how the control flow moves in a `for` loop, and how the value of the loop counter changes on each *iteration*, or repetition of the loop body:
+
+[[loop-py]]
+.Stepping through a for loop
+[role="curriculum-python"]
+[caption="Figure 4.2.1: "]
+image::../media/U1P2/LoopPy_updated.gif[Alt Text]
+
+.Stepping through a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.2.1: "]
+[[loop-js]]
+image::../media/U1P2/LoopJS_updated.gif[Alt Text]
+
+////
+Although it is valid syntax, a `*monospace bold phrase*` causes a build error in AsciidocFX. Might be something to do with DocBook conversion. No bold for now. May see how ES handles it in the future.
+
+BMW
+////
+
+One last interesting thing about `for` loops is incrementation.
+
+[role="curriculum-python"]
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
+
+[role="curriculum-javascript"]
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-incrementing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-incrementing.js.txt[]
+----
+
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. This means measure is now equal to its former value plus one. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
+
+[role="curriculum-python"]
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[role="curriculum-javascript"]
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). The following is a shorthand method for incrementing (or decrementing) a counter:
+
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[[debuggingtips]]
+=== Debugging Tips
+
+Programming is not only writing code. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
+
+[role="curriculum-python"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+[role="curriculum-javascript"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+Below, we walk through an example of printing variables to help debug a script:
+
+[role="curriculum-python curriculum-mp4"]
+[[video15py]]
+video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video15js]]
+video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
+
+You've seen a list of potential errors in Chapter 1. Here are some other errors that you might encounter:
+
+[role="curriculum-python"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+[role="curriculum-javascript"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+Take a look at <> for a full description of different error types and what you can do to prevent them.
+
+[[musicaltips]]
+=== Musical tips
+
+Now that you have many tools to create your music, like `fitMedia()`, `makeBeat()` and `for` loops, we will look at musical ideas.
+
+Let's start with the *key* of your song:
+
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
+
+++++
+audioMedia/MajorMinor.mp3
+++++
+
+Now let's talk about the different types of tracks you can have. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
+
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
+
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
+
+.PRACTICE
+****
+Create a complete song with:
+
+* A theme (please mention your chosen theme in your commented intro in the code)
+* The `fitMedia()` and `makeBeat()` functions
+* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
+* At least four tracks
+* At least sixteen measures
+* At least one uploaded sound
+* Comments and variables to organize your code
+
+Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
+****
+
+{nbsp} +
+
+[[chapter4summary]]
+=== Chapter 4 Summary
+
+[role="curriculum-python"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[role="curriculum-javascript"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a component of a `for` loop?
+
+[answers]
+* Loop interpreter
+* Loop Counter
+* Loop Body
+* Loop Range
+--
+
+[question]
+--
+Which of the following is NOT a good use of loops in a musical composition?
+
+[answers]
+* Creating a beat pattern than never repeats
+* Placing musical clips on every third measure
+* Repeating a beat on several consecutive measures
+* Placing musical clips on odd measures
+--
+
+[question]
+--
+Which of the following is NOT a recommended technique for debugging?
+
+[answers]
+* Copying and pasting code into Google
+* Printing variable values to the console
+* Looking at error lines identified in the console
+* Asking others for help
+--
+
+[question]
+--
+Which of the following is NOT something that can be printed to the console?
+
+[answers]
+* Code Comments
+* Strings
+* Mathematical Expressions
+* Variables
+--
+
+[question]
+--
+____ is a quality of sound that determines how high or low it sounds.
+
+[answers]
+* Pitch
+* Tempo
+* Rhythm
+* Loudness
+--
\ No newline at end of file
diff --git a/src/locales/iu/v2/mixing-with-conditionals.adoc b/src/locales/iu/v2/mixing-with-conditionals.adoc
new file mode 100644
index 000000000..d41a2af7c
--- /dev/null
+++ b/src/locales/iu/v2/mixing-with-conditionals.adoc
@@ -0,0 +1,363 @@
+[[mixingwithconditionnals]]
+== Mix with Conditionals!
+
+:nofooter:
+
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
+
+[[analyzetrack]]
+=== Use `analyzeTrack()`
+
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Import and run the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+----
+
+You can read in your console that the printed loudness is 0.10306035109110138.
+
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
+
+The `analyzeTrack()` function takes 2 arguments:
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
+
+.PRACTICE
+****
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
+. Add a second track and use the `analyzeTrack()` function to print its loudness in the console. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
+****
+
+The parameter for `analyzeTrack()` can either be `RMS_AMPLITUDE`, to evaluate the loudness, or `SPECTRAL_CENTROID` to analyze the brightness of the sound. We'll focus on analyzing loudness in this chapter.
+
+[[booleansandcomparisons]]
+=== Booleans and comparisons
+
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
+
+[role="curriculum-python"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `True` and `False`. `True` and `False` start with a capital letter and do not have quotes.
+
+[role="curriculum-javascript"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `true` and `false`. `true` and `false` start with a lower-case letter and do not have quotes.
+
+[role="curriculum-python"]
+--
+To create a boolean, you can either initialize a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|==
+|is equal to
+
+|!=
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-javascript"]
+--
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|===
+|is equal to
+
+|!==
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
+
+// this video will be cut at 2' to delete the section about boolean operators//
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `true` if the first track is louder than the second track, and `false` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+----
+
+[role="curriculum-python"]
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
+
+[role="curriculum-javascript"]
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
+
+[[conditionalstatements]]
+=== Conditional Statements
+
+What is a conditional statement? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
+
+Below is an example of conditional statement, note the similarity with a for loop:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
+----
+
+.PRACTICE
+****
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+----
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
+----
+
+[[mixingyourtracks]]
+=== Mix your tracks
+
+Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
+****
+
+Let's review some vocabulary:
+
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
+
+Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter6summary]]
+=== Chapter 6 Summary
+
+[role="curriculum-python"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `True` and `False`.
+* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
+
+[role="curriculum-javascript"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `true` and `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `true` or `false`.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following elements is a boolean?
+
+[answers]
+* `5+4 === 5`
+* `measure = 1`
+* `2<3<4`
+* `False()`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[question]
+--
+What is mixing?
+
+[answers]
+* adapting the volume of each track so they sound well balanced
+* adapting the pitch of each track so they sound well balanced
+* adding a fade in
+* adding a fade out
+--
+
+[question]
+--
+How many conditions can you check in a conditional statement?
+
+[answers]
+* any number of conditions
+* 1 condition
+* 2 conditions
+* 3 conditions
+--
\ No newline at end of file
diff --git a/src/locales/iu/v2/optional.adoc b/src/locales/iu/v2/optional.adoc
new file mode 100644
index 000000000..1d412d2ad
--- /dev/null
+++ b/src/locales/iu/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/iu/v2/reference.adoc b/src/locales/iu/v2/reference.adoc
new file mode 100644
index 000000000..d08f7ea27
--- /dev/null
+++ b/src/locales/iu/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effects, Errors, and EarSketch Functions
+
+:nofooter:
+
+In this unit you will find references to all effects, errors and EarSketch API functions.
\ No newline at end of file
diff --git a/src/locales/iu/v2/unit-1.adoc b/src/locales/iu/v2/unit-1.adoc
new file mode 100644
index 000000000..7f48189fe
--- /dev/null
+++ b/src/locales/iu/v2/unit-1.adoc
@@ -0,0 +1,18 @@
+[[unit1]]
+== Unit 1: Compose and Add Beats
+
+:nofooter:
+
+In this unit you will learn how EarSketch works, you will place sounds (clips) into your music, debug your code, customize your song, and add beats based on your musical genre.
+
+Anyone (especially you) can learn to program! Like learning a musical instrument, it takes consistent practice to make progress. Don't get discouraged if you get stuck, this is part of the process. Ask for help in your class or look online if needed.
+
+We wish you the best of luck, and before you start here's an example of what you can do with EarSketch:
+
+[role="curriculum-python curriculum-mp4"]
+[[video1livepy]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video1livejs]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-JS.mp4[]
\ No newline at end of file
diff --git a/src/locales/iu/v2/unit-2.adoc b/src/locales/iu/v2/unit-2.adoc
new file mode 100644
index 000000000..d4fd5122b
--- /dev/null
+++ b/src/locales/iu/v2/unit-2.adoc
@@ -0,0 +1,6 @@
+[[unit2]]
+== Unit 2: Loops, Effects, Mixing
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/iu/v2/unit-3.adoc b/src/locales/iu/v2/unit-3.adoc
new file mode 100644
index 000000000..9f3f26d37
--- /dev/null
+++ b/src/locales/iu/v2/unit-3.adoc
@@ -0,0 +1,8 @@
+[[unit3]]
+== Unit 3: Structure your Songs
+
+:nofooter:
+
+Now that you have many tools to create your song, add effects and mix your tracks, we will be looking at the song's structure. We'll be using custom functions for that: these are functions that you will create yourself!
+
+We will also look at user inputs and how they can be embedded in your code to create personalize songs. Finally, we'll see how you can use data structures to simplify your code.
\ No newline at end of file
diff --git a/src/locales/iu/v2/welcome.adoc b/src/locales/iu/v2/welcome.adoc
new file mode 100644
index 000000000..f89bcfba2
--- /dev/null
+++ b/src/locales/iu/v2/welcome.adoc
@@ -0,0 +1,26 @@
+[[welcome]]
+== Welcome Students and Teachers!
+
+:nofooter:
+
+Welcome to EarSketch!
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
+
+*Students*: Continue below to learn more about EarSketch
+
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
+
+[role="curriculum-mp4"]
+[[video0]]
+video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
+
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+Maybe you'll become a legendary music producer or the industry's most sought-after recording engineer! We wish you good luck on your EarSketch journey.
+
+Click on the right arrow at the top of this text to get started.
+
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/iu/v2/your-first-song.adoc b/src/locales/iu/v2/your-first-song.adoc
new file mode 100644
index 000000000..4e9f6aa2f
--- /dev/null
+++ b/src/locales/iu/v2/your-first-song.adoc
@@ -0,0 +1,290 @@
+[[customizeyourfirstsong]]
+== Customize your first song
+
+:nofooter:
+
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
+
+[[settempo]]
+=== The `setTempo()` function
+
+[role="curriculum-python"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+[role="curriculum-javascript"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. To change the tempo, just change the number between the parentheses of the `setTempo()` function. The higher the tempo, the faster your music. You can select a tempo between _45bpm and 220bpm_.
+
+.PRACTICE
+****
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
+****
+
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
+
+[cols="^3*"]
+|===
+|GENRE |BPM |EXAMPLE
+
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
+|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
+|===
+
+.PRACTICE
+****
+. Select one artist you really like and find out what genre they belong to.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
+****
+
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
+
+[[comments]]
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
+
+[role="curriculum-python"]
+In Python, comments are indicated by a line starting with a pound `#` symbol.
+
+[role="curriculum-javascript"]
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
+
+.PRACTICE
+****
+In your current script, write a comment with a description of your song on the first line.
+****
+
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/your-first-song-comments.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/your-first-song-comments.js.txt[]
+----
+
+{nbsp} +
+
+[[uploadingsounds]]
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
+
+You must be logged in to upload sounds.
+
+Let's explore the first three options.
+
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
+
+[role="curriculum-mp4"]
+[[video101rec]]
+video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
+
+.PRACTICE
+****
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
+****
+
+An active computer program is called a *process*.
+
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
+
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
+
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
+
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
+
+Let's examine recording a sound into EarSketch as an example process. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
+
+Check out the following supplementary video:
+
+[role="curriculum-mp4"]
+[[video11cpu]]
+video::./videoMedia/010-02-ProcessesandMemory-PY-JS.mp4[]
+
+////
+END OF OPTIONAL
+////
+
+[[copyright]]
+=== Use Copyright Wisely
+
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
+
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
+
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
+
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
+
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
+
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
+
+[[chapter2summary]]
+=== Chapter 2 Summary
+
+[role="curriculum-python"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[role="curriculum-javascript"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does `setTempo()` allow you to do in EarSketch?
+
+[answers]
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
+--
+
+[question]
+--
+What is the unit for tempo?
+
+[answers]
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
+--
+
+[question]
+--
+What can you use comments for?
+
+[answers]
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
+--
+
+[question]
+--
+Which of the following statements is true?
+
+[answers]
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
+--
+
+[question]
+--
+How do you get a copyright?
+
+[answers]
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
+--
+
+[question]
+--
+What is a music license?
+
+[answers]
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/ko/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/ko/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/ko/v1/every-effect-explained-in-detail.adoc b/src/locales/ko/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..f52da48f9
--- /dev/null
+++ b/src/locales/ko/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTER
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/ko/v1/every-error-explained-in-detail.adoc b/src/locales/ko/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..9b0dfc157
--- /dev/null
+++ b/src/locales/ko/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*.
+
+The process of finding and fixing bugs is called *debugging*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/ko/v1/the-earSketch-api.adoc b/src/locales/ko/v1/the-earSketch-api.adoc
new file mode 100644
index 000000000..90e09c349
--- /dev/null
+++ b/src/locales/ko/v1/the-earSketch-api.adoc
@@ -0,0 +1,6 @@
+[[ch_27]]
+== The EarSketch API
+
+:nofooter:
+
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/ko/v2/add-beats.adoc b/src/locales/ko/v2/add-beats.adoc
new file mode 100644
index 000000000..3757cb508
--- /dev/null
+++ b/src/locales/ko/v2/add-beats.adoc
@@ -0,0 +1,339 @@
+[[addsomebeats]]
+== Add some Beats!
+
+:nofooter:
+
+In this chapter you will learn how to make your own beats! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
+
+[[variables]]
+=== Variables
+
+[role="curriculum-python curriculum-mp4"]
+[[video2py]]
+video::./videoMedia/002-05-Variables-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video2js]]
+video::./videoMedia/002-05-Variables-JS.mp4[]
+
+What is a variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
+
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
+
+To use a variable,
+
+[role="curriculum-python"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. You can only use the variable after it has been assigned, not before. For example, write `fitMedia(synth1, 1, 1, 3)`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-javascript"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. We also use the command `var` at the beginning of the line. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. For example, write `fitMedia(synth1, 1, 1, 3);`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-instead-of-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-instead-of-this.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+In your previous scripts, use variables to store your sound constants. Look at the examples below for help. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-variables.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-variables.js.txt[]
+----
+
+Note that it's important to name your variable in an understandable and descriptive way. For example, specify `synth1` instead of `music1` or `test`, which don't provide any information. This way, when you or someone else reads your code, they can see what you are referring to.
+
+A *constant* is similar to a variable because it stores values. However, the value of a constant never changes. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. By convention, constant names are capitalized and use underscores instead of spaces.
+
+[[drumbeatstrings]]
+=== Beat Strings
+
+Let's first learn some basic concepts about rhythm:
+
+* *Rhythm* is a pattern of sound, often repeated.
+* The *tempo* is the speed of the music in BPM (beats per minute).
+* A *beat* is like the "steady pulse" of a song. When members of an audience clap their hands in a concert, they're clapping on the beat.
+* A *measure* is a musical time unit with a predetermined number of beats. In EarSketch, 1 *measure* is 4 beats long. Since there are 4 beats in 1 measure, beats are also called *quarter (1/4) notes*.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. When you are counting 1/4 notes, you say "1, 2, 3, 4...." When counting 1/8 notes, you can use "ands": "1 and 2 and 3 and 4 and...."
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Note that the sum of all notes in one measure must be equal to 1. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* A *metronome* helps the musician set the rhythm of his or her piece by making a clicking noise on the beat. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
+
+[[imediameasurepng]]
+.A measure
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
+
+[[imediabeatpng]]
+.A beat
+[caption="Figure 3.2.2: "]
+image::../media/U1P1/beat.png[A beat]
+
+[[imediasixteenthnotepng]]
+.A sixteenth note
+[caption="Figure 3.2.3: "]
+image::../media/U1P1/sixteenthnote.png[A sixteenth note]
+
+.PRACTICE
+****
+Listen to your favorite song, and try to clap on the beat. You can do this exercise with your neighbor.
+****
+
+We'll compose each of our rhythms in a *beat* string.
+
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
+
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` starts playing the percussive sound clip (one hit of the drum, for example).
+* `+` extends the audio clip into the next sub-beat. It always follows a `0` or `+`.
+* `-` is a rest, meaning silence.
+
+.PRACTICE
+****
+For each of the following drumbeat strings, try clapping on the zeros. Then listen to the corresponding audio and verify if you were right. This exercise will help you understand how the drumbeat strings work.
+****
+
+Here are some examples of 1-measure beat strings:
+
+Quarter notes: `"0\+++0+++0\+++0+++"`
+(read: "1, 2, 3, 4")
+
+++++
+audioMedia/beatString1.mp3
+++++
+
+Eighth notes: `"0+0+0+0+0+0+0+0+"`
+(read: "1 and 2 and 3 and 4")
+
+++++
+audioMedia/beatString11.mp3
+++++
+
+Sixteenth notes: `"0000000000000000"`
+(that's very fast, depending on the tempo)
+
+++++
+audioMedia/beatString12.mp3
+++++
+
+`"0-0-0---0-0-0---"`
+(read: "1 and 2, 3 and 4")
+
+++++
+audioMedia/beatString2.mp3
+++++
+
+`"0---0---0-0-0---"`
+(read: "1, 2, 3 and 4")
+
+++++
+audioMedia/beatString3.mp3
+++++
+
+`"0---0---0---0000"`
+(read: "1, 2, 3, 4 e and a")
+
+++++
+audioMedia/beatString4.mp3
+++++
+
+{nbsp} +
+
+////
+ADDITIONAL VIDEO TO BE ADDED
+See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+video revamping tab
+////
+
+[[makebeat]]
+=== The `makeBeat()` function
+
+Now let's see how you can make your own beat. Here we use the term "beat" as a shorthand for drumbeat: a repeated rhythmic pattern of percussive sounds. We will use the `makeBeat()` function, with 4 arguments:
+
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
+
+Let's see more details with this video:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12py]]
+video::./videoMedia/3_3_makebeat_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12js]]
+video::./videoMedia/3_3_makebeat_js.mp4[]
+
+Here is the example shown in the video:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-multi-beat.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-multi-beat.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new `beatString1` variable, a 16-character string with the characters `"0"`, `"+"`, and `"-"`.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
+Please note that:
+
+. You should assign your variables with the `=` symbol before using them.
+. Just like `fitMedia()`, the `makeBeat()` function starts with a lowercase letter (`m`) and has an uppercase letter in the middle (`B`).
+. Just like `fitMedia()`, the `makeBeat()` function has 4 parameters separated by commas.
+
+When you hear your music, if you don't like your first version, tweak your beat to make it sound better and better, until you like what you have.
+****
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. You can either play them simultaneously, on two different tracks, or one after the other on one single track.
+****
+
+[[beatsandgenres]]
+=== Create a beat based on your musical genre
+
+Now that you've started working with `makeBeat()` and beat strings, let's explore some basic beat patterns that you can use.
+You've learned that a musical genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Similarly, some genres have signature beat patterns. Below are some examples:
+
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
+
+Here is the corresponding code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-examples-of-beats.js.txt[]
+----
+
+[[chapter3summary]]
+=== Chapter 3 Summary
+
+* In EarSketch, 1 measure is divided into 4 beats, or 4 quarter notes. 1 beat is divided into 4 sixteenth notes.
+* *Variables* create a space in computer memory to store data.
+* You first need to assign the value (data) to the variable name using the sign `=`. Then you can use the variable by writing its name in the code.
+* A *string* is a data type that consists of a series of characters encapsulated by single or double quotes.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Strings are used with the `makeBeat()` function to create rhythmic patterns in EarSketch. `makeBeat()` takes a beat string to define each sixteenth note of its pattern. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` takes four arguments:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these options is a string?
+
+[answers]
+* "Five"
+* 5
+* FIVE
+* Five
+--
+
+[question]
+--
+What does "0" represent in a beat pattern string?
+
+[answers]
+* Start playing the clip
+* Rest
+* Extend the clip
+* End the clip
+--
+
+[question]
+--
+In EarSketch, one measure is...
+
+[answers]
+* 4 beats long
+* 4 sub-beats long
+* 16 beats long
+* 1 quarter note
+--
+
+[question]
+--
+One sixteenth note is...
+
+[answers]
+* a quarter of a quarter note
+* half a beat
+* a quarter of a measure
+* 1 measure
+--
+
+[question]
+--
+To use the `makeBeat()` function, what is the order of parameters you need to provide?
+
+[answers]
+* clip name, track, start measure, beat string
+* tempo, track, start measure, end measure
+* clip name, start measure, end measure, beat string
+* beat string, track, start measure, clip name
+--
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/ko/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..6788ccea1
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // This is the "boom" sound.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/ko/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..39b8de864
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # This is the "boom" sound.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # This is the "ts" sound.
+
+# Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/ko/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/ko/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/ko/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..2bbded58b
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Setup
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/ko/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..02f305a40
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-variables.js.txt b/src/locales/ko/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..892e9ee9e
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Setup
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/add-beats-variables.py.txt b/src/locales/ko/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..615531008
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..b47ffdbce
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..8bfd9ef2b
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..f17f7606e
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..2bb8b3f8e
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/ko/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/ko/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..fe86e34c5
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Setup
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..5e0318ee0
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..b193b59d7
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Setup
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..7c13d7605
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Setup
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..fc4ac0026
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Setup
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..02b9bf3fd
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/ko/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/ko/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/ko/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..5393649b3
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Setup
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/ko/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..e7bcaac25
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-arrays.js.txt b/src/locales/ko/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..6f979e08f
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/ko/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..fc1a83742
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/ko/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..35d2a3f43
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/ko/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/ko/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/ko/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..c3be55257
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/ko/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..ddb76404f
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-list.py.txt b/src/locales/ko/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c6cfcd632
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/ko/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..0ccfffc88
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Setup
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/ko/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..9747b5b4a
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/ko/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..81e2dbe01
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Setup
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/ko/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dae36a455
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/ko/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..5fbe4a7ac
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Setup
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/ko/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..91f9bf807
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..1aaddaf46
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..3c2ae73a2
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..cd446e98c
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Setup
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..ca104ee90
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..a639ba4f0
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..0da37e8be
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..d123caa9a
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Setup
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..b0902254f
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..7221572eb
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..1b2cc9748
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..f5b833522
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Setup
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/ko/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..00ff28b70
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/ko/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..013470826
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Setup
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/ko/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/ko/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..8979b5185
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Setup
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/ko/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/ko/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..02ab97eb8
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/ko/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..ce6ff834d
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/ko/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..998a9d803
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/ko/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..c735d5b8f
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/ko/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..687c5da0f
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Setup
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/ko/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..d1fb96a5c
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/ko/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/ko/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/ko/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..93ca1ae9d
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Setup
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/ko/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..ef85ce675
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Setup
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/ko/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..67ba71708
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Setup
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/ko/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..d7cf9db54
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/ko/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/ko/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/ko/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/ko/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..1f9f0fea3
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..64a5b22b0
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/ko/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/ko/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/ko/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/ko/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..91f3bdf73
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/ko/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..95b76a723
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/ko/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..355a11de2
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/ko/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..f15821b9e
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/ko/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..dfe4c8900
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/ko/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..903928096
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Setup
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/ko/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..c5595e80f
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..79b65068e
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Setup
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..9d1438f4b
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..a0f162eeb
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..14b374cc9
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..9d8960e5c
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Setup
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..b2ac152d1
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..479e0e3fd
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..98ff5f56b
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/your-first-song-comments.js.txt b/src/locales/ko/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..d25a49cec
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Setup
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/ko/v2/code-examples/your-first-song-comments.py.txt b/src/locales/ko/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..a077c3b76
--- /dev/null
+++ b/src/locales/ko/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/ko/v2/custom-functions.adoc b/src/locales/ko/v2/custom-functions.adoc
new file mode 100644
index 000000000..748232c60
--- /dev/null
+++ b/src/locales/ko/v2/custom-functions.adoc
@@ -0,0 +1,285 @@
+[[customfunctionssongstructure]]
+== Custom Functions and Song Structure
+
+:nofooter:
+
+The song structure is the song's organization over time. The goal is to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own function, custom functions, to structure your songs!
+
+[[asongsstructure]]
+=== A song's structure
+
+:nofooter:
+
+A song can be divided into *sections*. A section is made up of several measures (musical time units), and it expresses an idea or feeling. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
+
+A common and simple *form*, or song structure, is ABA. A and B are two different sections, for example chorus and verse. The B section adds variety, while returning to the A section invokes familiarity. The code below creates an ABA form. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
+
+[[imediau2sections_052016png]]
+.An ABA form within the EarSketch DAW
+[caption="Figure 9.2: "]
+image::../media/U2/sections_052016.png[Alt Text]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Select a song that you like. Listen to it and try to notice the different sections. Can you tell when the musicians change sections? How many times do you hear the chorus and verse? What kind of contrasts can you observe? Share your example with your neighbor.
+****
+
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
+
+[[creatingyourcustomfunctions]]
+=== Create your custom functions
+
+In the previous example with the ABA song, the code is large, and the code is repeated for the second A section. There is a way to be more concise, thanks to *custom functions*! We will define a function that will represent section A, then call the function twice.
+
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. Here is how you would define section A:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-untitled1.js.txt[]
+----
+
+. `sectionA()` is the name we chose for our function. You can choose any name you like. Try to name your function in a descriptive way so your code is easier to read.
+. The instructions are the *body* of the function. They are indented.
+
+.PRACTICE
+****
+Paste this code in a new script, and run it. You should see that your DAW remains empty.
+That's because you need to *call* a function to use it.
+To call your function, add the line `sectionA()`, unindented, after your function definition. When running the code, you should see section A in your DAW
+****
+
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. To remedy this issue, we will create *parameters* for our function.
+
+.PRACTICE
+****
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. When you call your function, add the parameters `1` and `5` between the parentheses. Run the code to make sure there is no error.
+1. Add a second function call, this time with the parameters `9` and `13`. Run the code to make sure there is no error.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
+****
+
+Here is what your code could look like:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+----
+
+//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
+
+[role="curriculum-python curriculum-mp4"]
+[[video93py]]
+video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video93js]]
+video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
+
+[[transitionstrategies]]
+=== Transition Strategies
+
+Now that you know how to create custom functions to structure your song, let's look at transitions. *Transitions* help one section smoothly go into the next. They can connect verse and chorus, build up to a drop, mix between tracks (DJing), or change keys. The goal of a transition is to grab the listener's attention and let them know a change is about to occur.
+
+Following are some popular strategies for creating musical transitions:
+
+. *Crash Cymbal*: Placing a crash cymbal on the first beat of a new section.
+. *Drum Fill*: A rhythmic variation to fill the gap before a new section.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Melody Variation*: Introducing a variation of the chords, bass line, or melody before the new section. Often, a folder within the EarSketch sound library contains variations of a similar riff.
+. *Riser*: A note or noise that increases in pitch. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. You can use the search term "riser" in the Sound Browser. A reversed crash cymbal can be used as a riser, like YG_EDM_REVERSE_CRASH_1.
+. *Snare Roll*: A sequence of repeated snare hits, with increasing density, pitch, or amplitude. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping*: Repeating a short segment of melody before a new section.
+. *Crossfading*: Decreasing the volume of one section while increasing the volume of a new section.
+. *Anacrusis*: When the melody of the new section starts a couple beats early.
+
+.PRACTICE
+****
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. You can work in pairs. Once you've thought about it, you can have a look at the examples below.
+
+The transition should be placed one or two measures before the new section. You can use several transition techniques at the same time.
+****
+
+Drum fills:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+----
+
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. An example is shown below.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+----
+
+The next example uses multiple risers and a crash cymbal during the transition.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
+----
+
+{nbsp} +
+
+[[yourfullsong]]
+=== Your full song
+
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. Functions are one kind of abstraction used in computer science. They pack multiple statements into one tool so they can be easily referred to. Abstractions can make the form of a program clearer.
+
+.PRACTICE
+****
+Let's create a full song using all the tools you've discovered in EarSketch! Here is a suggestion of how to work, but you can adapt it as you like:
+
+. Choose a theme for your song. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. Then select a simple structure.
+. And finally, start coding! Start with some `fitMedia()` functions to select sounds.
+. Use `makeBeat()` to add some percussion.
+. You can upload your own sounds.
+. Use `for` loops to reduce repetition in your code.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
+. Add one or several conditional statements.
+. Make sure you use variables to store some information such as sound constants.
+. Make sure you use comments to explain what you are doing.
+. Don't forget to regularly run your code and listen to your song. This will help you modify it until you like the sound of it.
+. Choose a name for your song.
+****
+
+Here is an example of a full song:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+----
+
+In this example, we have used a `for` loop inside a custom function! We have used parameters of the function (`start` and `end`) inside the for loop.
+
+[[chapter7summary]]
+=== Chapter 7 Summary
+
+* *Sections* are related musical units consisting of multiple measures. Each expresses an idea or feeling.
+* *Transitions* are passages of music used to connect consecutive musical sections.
+* The structure and variety found within a song is known as its *form*. A common musical form is A-B-A.
+* *Custom functions* are unique functions written by the programmer to accomplish a specific task. You have to create a custom function to be able to call it. You can create as many parameters as you want.
+* An *abstraction* is the bundling of ideas to form a single, often less complex, concept. Functions are an example of abstraction.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these is NOT an example of a musical section?
+
+[answers]
+* Drums
+* Intro
+* Verse
+* Chorus
+--
+
+[question]
+--
+What is an abstraction?
+
+[answers]
+* A bundling of ideas to form a single concept
+* A variety of sounds throughout sections
+* Parts of a song that are related, but also are distinct from each other
+* A statement that returns a value to the function call
+--
+
+[role="curriculum-python"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
+* `myFunction(2, 5)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
+* `myFunction(2, 5)`
+--
+
+[question]
+--
+Which of these is NOT an example of a transition?
+
+[answers]
+* Melody Consistency
+* Crash Cymbal
+* Riser
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/ko/v2/data-structures.adoc b/src/locales/ko/v2/data-structures.adoc
new file mode 100644
index 000000000..392a3b3e5
--- /dev/null
+++ b/src/locales/ko/v2/data-structures.adoc
@@ -0,0 +1,497 @@
+[[getorganizedwithdatastructures]]
+== Data Structures
+
+:nofooter:
+
+[role="curriculum-python"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called lists, and a new functionality of `makeBeat()`.
+
+[role="curriculum-javascript"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called arrays, and a new functionality of `makeBeat()`.
+
+[[datastructures]]
+=== What is a Data Structure
+
+[role="curriculum-python"]
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-javascript"]
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
+----
+
+[role="curriculum-python"]
+If you have replaced variables with a list, how will you reference the content of the list? We use indices. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+[role="curriculum-javascript"]
+If you have replaced variables with an array, how will you reference the content of the array? We use indices. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+.PRACTICE
+****
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-list.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-arrays.js.txt[]
+----
+
+//.The EarSketch Share window for collaboration (Let Others Edit)
+
+//[caption="Figure 21.4.2: "]
+
+image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
+
+[role="curriculum-python"]
+We've seen that `list[index]` will reference an element of the list. This can also be used to modify an element of the list. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+[role="curriculum-javascript"]
+We've seen that `array[index]` will reference an element of the array. This can also be used to modify an element of the array. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+.PRACTICE
+****
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. You can use the track number as the counter.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
+****
+
+Below is an example. You can have a look in the console to see what is printed when you run the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
+----
+
+[role="curriculum-python"]
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-javascript"]
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-additive-introduction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-additive-introduction.js.txt[]
+----
+
+{nbsp} +
+
+[[usingdatastructureswithmakebeat]]
+=== Use Data Structures with `makeBeat()`
+
+[role="curriculum-python"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
+
+[role="curriculum-javascript"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
+
+[role="curriculum-python"]
+* Like lists, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[role="curriculum-javascript"]
+* Like arrays, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[cols="h,^,^,^,^,^,^,^,^,^"]
+|===
+|Character
+|E
+|a
+|r
+|S
+|k
+|e
+|t
+|c
+|h
+
+|Index
+|0
+|1
+|2
+|3
+|4
+|5
+|6
+|7
+|8
+|===
+
+[role="curriculum-python"]
+* You can concatenate lists together like you do with strings. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
+
+[role="curriculum-javascript"]
+* You can concatenate arrays together like you do with strings. We use the `concat` *method*. A method is similar to a function as it has parentheses which contain parameters. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
+
+[role="curriculum-python"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
+
+[role="curriculum-javascript"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your lists.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your arrays.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+Here is an example of a solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
+----
+
+This is an example of how you can use string operations with `makeBeat()`:
+
+[role="curriculum-python curriculum-mp4"]
+[[video13py]]
+video::./videoMedia/013-03-Substrings-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video13js]]
+video::./videoMedia/013-03-Substrings-JS.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-operations.js.txt[]
+----
+
+[role="curriculum-python"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-javascript"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Copy the code example in chapter 3.4 for beats by genre. Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
+****
+
+Here is the solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-examples-of-beats.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. You can refer to the video in chapter 3.4 for beats by genre. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
+****
+
+{nbsp} +
+
+[[evaluatingcorrectness]]
+=== Evaluate Correctness
+
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Here are some elements that you can check:
+
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Here are some questions that can help you make your code more concise:
+** Did I copy/paste function calls several times in a row? If so, simplify with a loop!
+** Am I reusing any blocks of code? If so, put them in a function!
+** Are there sound constants or mathematical expressions that I use repeatedly throughout my code? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. If your peers are getting lost or confused by your code, it is probably unclear. Here are some questions to help you make your code clear:
+** Are the names of my variables and functions descriptive? If not, rename them.
+** Have I used comments to explain each block of code and any potentially confusing lines of code?
+** Have I used computational structures like custom functions and loops to help organize my code?
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
+
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. When giving feedback:
+
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
+
+Likewise, when receiving feedback:
+
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. This will allow your peers to provide feedback that is most helpful to you.
+* *Listen* - Wait to respond until your peer has finished speaking. Be attentive to the information your peer is conveying. Comment your code based on their feedback. These comments can be useful when revising.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in a list.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in an array.
+****
+
+[[chapter9summary]]
+=== Chapter 9 Summary
+
+[role="curriculum-python"]
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Items stored within a list, or elements, can be any data type.
+* Like strings, list elements get assigned an index. List indices start at 0.
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[role="curriculum-javascript"]
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
+* Like strings, array elements get assigned an index. Array indices start at 0.
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following operations is used to join lists/arrays?
+
+[answers]
+* Concatenation
+* Slicing
+* Combination
+* Addition
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the index number of the first element of a list in Python?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What does `len(myList)` return?
+
+[answers]
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
+[answers]
+* `listA + listB`
+* `listA ++ listB`
+* `listA and listB`
+* `listB + listA`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How can you get a list from oldList without the first and last elements?
+
+[answers]
+* `oldList[1:len(oldList) - 1]`
+* `oldList[1:len(oldList)]`
+* `oldList[0:len(oldList)]`
+* `oldList[2:len(oldList - 1)]`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the index number of the first element of an array in Javascript?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What does `myArray.length` return?
+
+[answers]
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
+[answers]
+* `arrayA.concat(arrayB)`
+* `arrayA.concatenate(arrayB)`
+* `arrayB.concat(arrayA)`
+* `arrayB.concatenate(arrayB)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How can you get an array from `oldArray` without the first and last elements?
+
+[answers]
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
+--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/ko/v2/effects-and-envelopes.adoc b/src/locales/ko/v2/effects-and-envelopes.adoc
new file mode 100644
index 000000000..92b9ab79b
--- /dev/null
+++ b/src/locales/ko/v2/effects-and-envelopes.adoc
@@ -0,0 +1,321 @@
+[[effectsandenvelopes]]
+== Effects and Envelopes
+
+:nofooter:
+
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
+
+[[effectsinearsketch]]
+=== Use Effects in EarSketch
+
+:nofooter:
+
+*Effects* allow us to change qualities of sounds. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
+
+[role="curriculum-python curriculum-mp4"]
+[[video4py]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video4js]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
+
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
+
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+
+.PRACTICE
+****
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
+****
+
+Here is an example below:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
+----
+
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
+
+No effect:
+
+++++
+audioMedia/reference.mp3
+++++
+
+Delay effect:
+
+++++
+audioMedia/delay2.mp3
+++++
+
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
+
+.PRACTICE
+****
+. Read about the delay effect in the list of effects chapter here: <>
+. Then run the code below and listen to the music without effects
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
+----
+
+{nbsp} +
+
+[[functionsandmoreeffects]]
+=== Functions and more effects
+
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Note that the function names always start with a lower-case letter, and are often a verb. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
+
+[role="curriculum-python"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+[role="curriculum-javascript"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
+
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
+
+Now, let's play more with the `setEffect()` function. The following video shows how to use some effects:
+
+////
+VIDEO IS BEEING MADE
+more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+("videos revamping" tab)
+////
+
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
+
+Listen to the clips below to hear the result of adding reverb to a track:
+
+No effect:
+
+++++
+audioMedia/reverbReference.mp3
+++++
+
+Reverb effect:
+
+++++
+audioMedia/reverbEffect.mp3
+++++
+
+{nbsp} +
+
+.PRACTICE
+****
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
+****
+
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
+
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
+
+*Envelopes* allow us to define how an effect changes over time.
+
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
+
+[[envelopepoints]]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
+image::../media/U2/NewEnvelope.png[Alt Text]
+
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
+
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
+
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
+
+Here is an example of fade in:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
+----
+
+Now watch this video for other envelope examples
+
+[role="curriculum-python curriculum-mp4"]
+[[video5b]]
+video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript curriculum-mp4"]
+video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new song. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
+****
+
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+----
+
+And here is an example of fade in and fade out on all the tracks:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter5summary]]
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does an effect allow you to do in EarSketch?
+
+[answers]
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
+--
+
+[question]
+--
+Which of these is NOT a `setEffect()` argument?
+
+[answers]
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
+--
+
+[question]
+--
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
+[answers]
+* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
+* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
+* `fitMedia(DELAY, 3, DELAY_TIME, 50.0)`
+* `setEffect(50, DELAY_FEEDBACK, 1)`
+--
+
+[question]
+--
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
+[answers]
+* Clip Length
+* Start Value
+* Track Number
+* Effect
+--
+
+[question]
+--
+What would the following `setEffect()` function do?
+
+[source,python]
+----
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
+----
+
+[answers]
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/ko/v2/get-user-input.adoc b/src/locales/ko/v2/get-user-input.adoc
new file mode 100644
index 000000000..27edbca84
--- /dev/null
+++ b/src/locales/ko/v2/get-user-input.adoc
@@ -0,0 +1,391 @@
+[[getuserinput]]
+== Get User Input
+
+:nofooter:
+
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. For that, we'll look at return statements and the `readInput()` function.
+
+[[returnstatement]]
+=== Return Statement
+
+Watch this video first:
+
+[role="curriculum-python curriculum-mp4"]
+[[video131py]]
+video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video131js]]
+video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
+
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. B. signals the function to stop. If you have any statements after the `return` keyword, they will be ignored.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
+
+Here is a code example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements.js.txt[]
+----
+
+With the return statement, the complete control flow for a function looks like this:
+
+[[return]]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
+image::../media/U2/Return.png[Alt Text]
+
+.PRACTICE
+****
+Create a function that will implement a musical section with:
+
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
+
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
+
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
+
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
+
+Then call the function at different measures with different variations.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-conditional-statement.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-conditional-statement.js.txt[]
+----
+
+{nbsp} +
+
+[[userinput]]
+=== Get User Input
+
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. The `readInput()` function returns what the user types there.
+
+For example, copy the following code in a new script, and run it:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-untitled1.js.txt[]
+----
+
+We might need to convert the returned user input into a different data type. Here are useful functions:
+
+[role="curriculum-python"]
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
+
+[role="curriculum-javascript"]
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
+
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-1.js.txt[]
+----
+
+Here is another example of what you can do with user input.
+
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ask for a user input to modify something in your song.
+
+Here are ideas of tools you can use:
+
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
+****
+
+{nbsp} +
+
+[[booleanlogic]]
+=== Boolean Logic
+
+We will now combine boolean logic and user input for another example of user interaction.
+
+[role="curriculum-python"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
+
+[role="curriculum-javascript"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
+
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
+
+[role="curriculum-python"]
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
+
+[role="curriculum-javascript"]
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
+
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `True` or `False`?
+
+* `not True`
+* `True and False`
+* `True or False`
+* `True and True`
+* `(True and False) or True`
+* `True and not False`
+* `not (False or False)`
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `true` or `false`?
+
+* `!true`
+* `true && false`
+* `true || false`
+* `true && true`
+* `(true && false) || true`
+* `true && !false`
+* `!(false || false)`
+****
+
+Use the following code to print the answers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
+----
+
+Here is a reminder of boolean creation, and some examples of boolean operations:
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+
+.PRACTICE
+****
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-operations.js.txt[]
+----
+
+{nbsp} +
+
+.CHALLENGE
+****
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
+****
+
+{nbsp} +
+
+[[chapter8summary]]
+=== Chapter 8 Summary
+
+[role="curriculum-python"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[role="curriculum-javascript"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following would be considered an example of data type conversion?
+
+[answers]
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Using `readInput()` to ask a user for a genre.
+* Producing a Boolean through a comparison operator.
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+not (True and (4 > 5))
+----
+
+[answers]
+* `True`
+* `5`
+* `4`
+* `False`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+!(true && (4 > 5));
+----
+
+[answers]
+* `true`
+* `4`
+* `false`
+* `5`
+--
+
+[question]
+--
+Which of the following is an example of concatenation?
+
+[answers]
+* `x = beatstring1 + beatstring2`
+* `x = beatstring1.beatstring2`
+* `x = (beatstring1, beatstring2)`
+* `x = beatstring1[beatstring2]`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How would you obtain the boolean True with the booleans True and False?
+
+[answers]
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How would you obtain the boolean true with the booleans true and false?
+
+[answers]
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/ko/v2/getting-started.adoc b/src/locales/ko/v2/getting-started.adoc
new file mode 100644
index 000000000..c90f659c1
--- /dev/null
+++ b/src/locales/ko/v2/getting-started.adoc
@@ -0,0 +1,386 @@
+[[getstartedwithearsketch]]
+== Getting Started with EarSketch
+
+:nofooter:
+
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
+
+[[discoverearsketch]]
+=== Discover EarSketch
+
+:nofooter:
+
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
+
+////
+TODO: upload video
+////
+
+As you become familiar with EarSketch these are the main panels.
+
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
+
+{nbsp} +
+
+_What is a DAW?_
+
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
+
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
+
+EarSketch is DAW that allows you to create music by writing code.
+
+Here is how to make full use of the DAW:
+
+[role="curriculum-mp4"]
+[[video1b]]
+video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-intro-script.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-intro-script.js.txt[]
+----
+
+{nbsp} +
+
+[[createanewscript]]
+=== Create your first script!
+
+Let's see how to create a script from scratch.
+
+. *Create.* In the editor tabs, click the white "+" icon.
++
+If this is your first script, click the large blue text "Click here to create a new script!"
++
+[[newscriptplus]]
+.Create a new script, open scripts
+[caption="Figure 1.2.1: "]
+image::../media/U1P1/NewScriptPlus.png[Alt Text]
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
++
+[[newscriptpromptpy]]
+.The create a new script dialog box
+[role="curriculum-python"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
+[[newscriptpromptjs]]
+.The create a new script dialog box
+[role="curriculum-javascript"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+
+*_What is a programming language?_*
+
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
+
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
+
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
+
+[[fitmedia]]
+=== The `fitMedia()` function
+
+Now that you have created your first script, let's start working on your music!
+
+Watch this video to see how to add an audio clip to your song:
+
+[role="curriculum-python curriculum-mp4"]
+[[video110py]]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video110js]]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
+
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
+
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
+
+////
+OPTIONAL
+////
+
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
+
+////
+END OF OPTIONAL
+////
+
+////
+OPTIONAL
+////
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia.js.txt[]
+----
+
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using sounds that you like:
+
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
+
+For each exercise, you can have your neighbour listen to your song.
+
+If you have errors when running your code, check out the next chapter about debugging.
+****
+
+[[debugging]]
+=== Debug your code
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. You can use debugging strategies, using the console.
+
+[role="curriculum-python curriculum-mp4"]
+[[video3py]]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video3js]]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+////
+OPTIONAL
+////
+
+What are the different types of errors?
+
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
+
+////
+END OF OPTIONAL
+////
+
+Here are some common errors:
+
+[role="curriculum-python"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
+
+[role="curriculum-javascript"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
+
+Time to practice!
+Find the five errors in the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-finding-errors.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-finding-errors.js.txt[]
+----
+
+////
+OPTIONAL
+////
+
+Here is the answer
+
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
+
+////
+END OF OPTIONAL
+////
+
+Take a look at <> for a description of different error types and what you can do to prevent them.
+
+////
+TODO: when options are ready, modify the link
+////
+
+[[chapter1summary]]
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a panel in the EarSketch workspace?
+
+[answers]
+* The effects browser
+* The code editor
+* The DAW
+* The console
+--
+
+[question]
+--
+How many parameters do you need for your `fitMedia()` function?
+
+[answers]
+* 4
+* 6
+* 2
+* 3
+--
+
+[question]
+--
+One script corresponds to...
+
+[answers]
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
+--
+
+[question]
+--
+What is a measure?
+
+[answers]
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
+--
+
+[question]
+--
+Which of the following is NOT a common type of error found in code?
+
+[answers]
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
+--
+
+[question]
+--
+Where in the EarSketch workspace can you get information about your bugs?
+
+[answers]
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/ko/v2/legacy.adoc b/src/locales/ko/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/ko/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/ko/v2/loops-and-layers.adoc b/src/locales/ko/v2/loops-and-layers.adoc
new file mode 100644
index 000000000..52974c50d
--- /dev/null
+++ b/src/locales/ko/v2/loops-and-layers.adoc
@@ -0,0 +1,414 @@
+[[loopandlayers]]
+== Loops and Layers
+
+:nofooter:
+
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. We will also cover musical layers and textures as well as some debugging tips.
+
+[[forloops]]
+=== `for` loops
+
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
+
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
+
+////
+add new video
+more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=0
+in the "revamping videos" tab (includes link to script)
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
+----
+
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
+
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+
+[[loop-components-PY]]
+.The basic components of a for loop
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.The basic components of a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
+.PRACTICE
+****
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
+[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `print()` call.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-printing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-printing.js.txt[]
+----
+
+Here, you will see in your console the following lines:
+
+----
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
+3
+ok
+4
+ok
+----
+
+and it ends there since measure has to be lower than 5, so 4 is your limit.
+
+[[controlflow]]
+=== Control Flow
+
+Here is another example of how you can use `for` loops:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12bpy]]
+video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12bjs]]
+video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
+
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-no-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-no-loops.js.txt[]
+----
+
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-loops.js.txt[]
+----
+
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
+
+A loop is a *control flow statement*, which changes the order. At the end of a loop body, it jumps back to the top of the loop.
+
+This animation shows how the control flow moves in a `for` loop, and how the value of the loop counter changes on each *iteration*, or repetition of the loop body:
+
+[[loop-py]]
+.Stepping through a for loop
+[role="curriculum-python"]
+[caption="Figure 4.2.1: "]
+image::../media/U1P2/LoopPy_updated.gif[Alt Text]
+
+.Stepping through a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.2.1: "]
+[[loop-js]]
+image::../media/U1P2/LoopJS_updated.gif[Alt Text]
+
+////
+Although it is valid syntax, a `*monospace bold phrase*` causes a build error in AsciidocFX. Might be something to do with DocBook conversion. No bold for now. May see how ES handles it in the future.
+
+BMW
+////
+
+One last interesting thing about `for` loops is incrementation.
+
+[role="curriculum-python"]
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
+
+[role="curriculum-javascript"]
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-incrementing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-incrementing.js.txt[]
+----
+
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. This means measure is now equal to its former value plus one. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
+
+[role="curriculum-python"]
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[role="curriculum-javascript"]
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). The following is a shorthand method for incrementing (or decrementing) a counter:
+
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[[debuggingtips]]
+=== Debugging Tips
+
+Programming is not only writing code. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
+
+[role="curriculum-python"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+[role="curriculum-javascript"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+Below, we walk through an example of printing variables to help debug a script:
+
+[role="curriculum-python curriculum-mp4"]
+[[video15py]]
+video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video15js]]
+video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
+
+You've seen a list of potential errors in Chapter 1. Here are some other errors that you might encounter:
+
+[role="curriculum-python"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+[role="curriculum-javascript"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+Take a look at <> for a full description of different error types and what you can do to prevent them.
+
+[[musicaltips]]
+=== Musical tips
+
+Now that you have many tools to create your music, like `fitMedia()`, `makeBeat()` and `for` loops, we will look at musical ideas.
+
+Let's start with the *key* of your song:
+
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
+
+++++
+audioMedia/MajorMinor.mp3
+++++
+
+Now let's talk about the different types of tracks you can have. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
+
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
+
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
+
+.PRACTICE
+****
+Create a complete song with:
+
+* A theme (please mention your chosen theme in your commented intro in the code)
+* The `fitMedia()` and `makeBeat()` functions
+* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
+* At least four tracks
+* At least sixteen measures
+* At least one uploaded sound
+* Comments and variables to organize your code
+
+Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
+****
+
+{nbsp} +
+
+[[chapter4summary]]
+=== Chapter 4 Summary
+
+[role="curriculum-python"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[role="curriculum-javascript"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a component of a `for` loop?
+
+[answers]
+* Loop interpreter
+* Loop Counter
+* Loop Body
+* Loop Range
+--
+
+[question]
+--
+Which of the following is NOT a good use of loops in a musical composition?
+
+[answers]
+* Creating a beat pattern than never repeats
+* Placing musical clips on every third measure
+* Repeating a beat on several consecutive measures
+* Placing musical clips on odd measures
+--
+
+[question]
+--
+Which of the following is NOT a recommended technique for debugging?
+
+[answers]
+* Copying and pasting code into Google
+* Printing variable values to the console
+* Looking at error lines identified in the console
+* Asking others for help
+--
+
+[question]
+--
+Which of the following is NOT something that can be printed to the console?
+
+[answers]
+* Code Comments
+* Strings
+* Mathematical Expressions
+* Variables
+--
+
+[question]
+--
+____ is a quality of sound that determines how high or low it sounds.
+
+[answers]
+* Pitch
+* Tempo
+* Rhythm
+* Loudness
+--
\ No newline at end of file
diff --git a/src/locales/ko/v2/mixing-with-conditionals.adoc b/src/locales/ko/v2/mixing-with-conditionals.adoc
new file mode 100644
index 000000000..d41a2af7c
--- /dev/null
+++ b/src/locales/ko/v2/mixing-with-conditionals.adoc
@@ -0,0 +1,363 @@
+[[mixingwithconditionnals]]
+== Mix with Conditionals!
+
+:nofooter:
+
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
+
+[[analyzetrack]]
+=== Use `analyzeTrack()`
+
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Import and run the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+----
+
+You can read in your console that the printed loudness is 0.10306035109110138.
+
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
+
+The `analyzeTrack()` function takes 2 arguments:
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
+
+.PRACTICE
+****
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
+. Add a second track and use the `analyzeTrack()` function to print its loudness in the console. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
+****
+
+The parameter for `analyzeTrack()` can either be `RMS_AMPLITUDE`, to evaluate the loudness, or `SPECTRAL_CENTROID` to analyze the brightness of the sound. We'll focus on analyzing loudness in this chapter.
+
+[[booleansandcomparisons]]
+=== Booleans and comparisons
+
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
+
+[role="curriculum-python"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `True` and `False`. `True` and `False` start with a capital letter and do not have quotes.
+
+[role="curriculum-javascript"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `true` and `false`. `true` and `false` start with a lower-case letter and do not have quotes.
+
+[role="curriculum-python"]
+--
+To create a boolean, you can either initialize a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|==
+|is equal to
+
+|!=
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-javascript"]
+--
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|===
+|is equal to
+
+|!==
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
+
+// this video will be cut at 2' to delete the section about boolean operators//
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `true` if the first track is louder than the second track, and `false` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+----
+
+[role="curriculum-python"]
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
+
+[role="curriculum-javascript"]
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
+
+[[conditionalstatements]]
+=== Conditional Statements
+
+What is a conditional statement? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
+
+Below is an example of conditional statement, note the similarity with a for loop:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
+----
+
+.PRACTICE
+****
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+----
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
+----
+
+[[mixingyourtracks]]
+=== Mix your tracks
+
+Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
+****
+
+Let's review some vocabulary:
+
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
+
+Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter6summary]]
+=== Chapter 6 Summary
+
+[role="curriculum-python"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `True` and `False`.
+* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
+
+[role="curriculum-javascript"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `true` and `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `true` or `false`.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following elements is a boolean?
+
+[answers]
+* `5+4 === 5`
+* `measure = 1`
+* `2<3<4`
+* `False()`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[question]
+--
+What is mixing?
+
+[answers]
+* adapting the volume of each track so they sound well balanced
+* adapting the pitch of each track so they sound well balanced
+* adding a fade in
+* adding a fade out
+--
+
+[question]
+--
+How many conditions can you check in a conditional statement?
+
+[answers]
+* any number of conditions
+* 1 condition
+* 2 conditions
+* 3 conditions
+--
\ No newline at end of file
diff --git a/src/locales/ko/v2/optional.adoc b/src/locales/ko/v2/optional.adoc
new file mode 100644
index 000000000..1d412d2ad
--- /dev/null
+++ b/src/locales/ko/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/ko/v2/reference.adoc b/src/locales/ko/v2/reference.adoc
new file mode 100644
index 000000000..d08f7ea27
--- /dev/null
+++ b/src/locales/ko/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effects, Errors, and EarSketch Functions
+
+:nofooter:
+
+In this unit you will find references to all effects, errors and EarSketch API functions.
\ No newline at end of file
diff --git a/src/locales/ko/v2/unit-1.adoc b/src/locales/ko/v2/unit-1.adoc
new file mode 100644
index 000000000..7f48189fe
--- /dev/null
+++ b/src/locales/ko/v2/unit-1.adoc
@@ -0,0 +1,18 @@
+[[unit1]]
+== Unit 1: Compose and Add Beats
+
+:nofooter:
+
+In this unit you will learn how EarSketch works, you will place sounds (clips) into your music, debug your code, customize your song, and add beats based on your musical genre.
+
+Anyone (especially you) can learn to program! Like learning a musical instrument, it takes consistent practice to make progress. Don't get discouraged if you get stuck, this is part of the process. Ask for help in your class or look online if needed.
+
+We wish you the best of luck, and before you start here's an example of what you can do with EarSketch:
+
+[role="curriculum-python curriculum-mp4"]
+[[video1livepy]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video1livejs]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-JS.mp4[]
\ No newline at end of file
diff --git a/src/locales/ko/v2/unit-2.adoc b/src/locales/ko/v2/unit-2.adoc
new file mode 100644
index 000000000..d4fd5122b
--- /dev/null
+++ b/src/locales/ko/v2/unit-2.adoc
@@ -0,0 +1,6 @@
+[[unit2]]
+== Unit 2: Loops, Effects, Mixing
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/ko/v2/unit-3.adoc b/src/locales/ko/v2/unit-3.adoc
new file mode 100644
index 000000000..9f3f26d37
--- /dev/null
+++ b/src/locales/ko/v2/unit-3.adoc
@@ -0,0 +1,8 @@
+[[unit3]]
+== Unit 3: Structure your Songs
+
+:nofooter:
+
+Now that you have many tools to create your song, add effects and mix your tracks, we will be looking at the song's structure. We'll be using custom functions for that: these are functions that you will create yourself!
+
+We will also look at user inputs and how they can be embedded in your code to create personalize songs. Finally, we'll see how you can use data structures to simplify your code.
\ No newline at end of file
diff --git a/src/locales/ko/v2/welcome.adoc b/src/locales/ko/v2/welcome.adoc
new file mode 100644
index 000000000..f89bcfba2
--- /dev/null
+++ b/src/locales/ko/v2/welcome.adoc
@@ -0,0 +1,26 @@
+[[welcome]]
+== Welcome Students and Teachers!
+
+:nofooter:
+
+Welcome to EarSketch!
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
+
+*Students*: Continue below to learn more about EarSketch
+
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
+
+[role="curriculum-mp4"]
+[[video0]]
+video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
+
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+Maybe you'll become a legendary music producer or the industry's most sought-after recording engineer! We wish you good luck on your EarSketch journey.
+
+Click on the right arrow at the top of this text to get started.
+
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/ko/v2/your-first-song.adoc b/src/locales/ko/v2/your-first-song.adoc
new file mode 100644
index 000000000..4e9f6aa2f
--- /dev/null
+++ b/src/locales/ko/v2/your-first-song.adoc
@@ -0,0 +1,290 @@
+[[customizeyourfirstsong]]
+== Customize your first song
+
+:nofooter:
+
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
+
+[[settempo]]
+=== The `setTempo()` function
+
+[role="curriculum-python"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+[role="curriculum-javascript"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. To change the tempo, just change the number between the parentheses of the `setTempo()` function. The higher the tempo, the faster your music. You can select a tempo between _45bpm and 220bpm_.
+
+.PRACTICE
+****
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
+****
+
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
+
+[cols="^3*"]
+|===
+|GENRE |BPM |EXAMPLE
+
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
+|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
+|===
+
+.PRACTICE
+****
+. Select one artist you really like and find out what genre they belong to.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
+****
+
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
+
+[[comments]]
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
+
+[role="curriculum-python"]
+In Python, comments are indicated by a line starting with a pound `#` symbol.
+
+[role="curriculum-javascript"]
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
+
+.PRACTICE
+****
+In your current script, write a comment with a description of your song on the first line.
+****
+
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/your-first-song-comments.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/your-first-song-comments.js.txt[]
+----
+
+{nbsp} +
+
+[[uploadingsounds]]
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
+
+You must be logged in to upload sounds.
+
+Let's explore the first three options.
+
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
+
+[role="curriculum-mp4"]
+[[video101rec]]
+video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
+
+.PRACTICE
+****
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
+****
+
+An active computer program is called a *process*.
+
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
+
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
+
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
+
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
+
+Let's examine recording a sound into EarSketch as an example process. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
+
+Check out the following supplementary video:
+
+[role="curriculum-mp4"]
+[[video11cpu]]
+video::./videoMedia/010-02-ProcessesandMemory-PY-JS.mp4[]
+
+////
+END OF OPTIONAL
+////
+
+[[copyright]]
+=== Use Copyright Wisely
+
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
+
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
+
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
+
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
+
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
+
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
+
+[[chapter2summary]]
+=== Chapter 2 Summary
+
+[role="curriculum-python"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[role="curriculum-javascript"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does `setTempo()` allow you to do in EarSketch?
+
+[answers]
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
+--
+
+[question]
+--
+What is the unit for tempo?
+
+[answers]
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
+--
+
+[question]
+--
+What can you use comments for?
+
+[answers]
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
+--
+
+[question]
+--
+Which of the following statements is true?
+
+[answers]
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
+--
+
+[question]
+--
+How do you get a copyright?
+
+[answers]
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
+--
+
+[question]
+--
+What is a music license?
+
+[answers]
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/oj/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/oj/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/oj/v1/every-effect-explained-in-detail.adoc b/src/locales/oj/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..f52da48f9
--- /dev/null
+++ b/src/locales/oj/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTER
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/oj/v1/every-error-explained-in-detail.adoc b/src/locales/oj/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..9b0dfc157
--- /dev/null
+++ b/src/locales/oj/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*.
+
+The process of finding and fixing bugs is called *debugging*.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/oj/v1/the-earSketch-api.adoc b/src/locales/oj/v1/the-earSketch-api.adoc
new file mode 100644
index 000000000..90e09c349
--- /dev/null
+++ b/src/locales/oj/v1/the-earSketch-api.adoc
@@ -0,0 +1,6 @@
+[[ch_27]]
+== The EarSketch API
+
+:nofooter:
+
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/oj/v2/add-beats.adoc b/src/locales/oj/v2/add-beats.adoc
new file mode 100644
index 000000000..3757cb508
--- /dev/null
+++ b/src/locales/oj/v2/add-beats.adoc
@@ -0,0 +1,339 @@
+[[addsomebeats]]
+== Add some Beats!
+
+:nofooter:
+
+In this chapter you will learn how to make your own beats! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
+
+[[variables]]
+=== Variables
+
+[role="curriculum-python curriculum-mp4"]
+[[video2py]]
+video::./videoMedia/002-05-Variables-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video2js]]
+video::./videoMedia/002-05-Variables-JS.mp4[]
+
+What is a variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
+
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
+
+To use a variable,
+
+[role="curriculum-python"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. You can only use the variable after it has been assigned, not before. For example, write `fitMedia(synth1, 1, 1, 3)`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-javascript"]
+. You first have to *assign* it. We use the symbol `=`, which is called the *assignment operator*. We also use the command `var` at the beginning of the line. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Then you need to call the variable: use `synth1` in your code. For example, write `fitMedia(synth1, 1, 1, 3);`.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-instead-of-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-instead-of-this.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+In your previous scripts, use variables to store your sound constants. Look at the examples below for help. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-variables.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-variables.js.txt[]
+----
+
+Note that it's important to name your variable in an understandable and descriptive way. For example, specify `synth1` instead of `music1` or `test`, which don't provide any information. This way, when you or someone else reads your code, they can see what you are referring to.
+
+A *constant* is similar to a variable because it stores values. However, the value of a constant never changes. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. By convention, constant names are capitalized and use underscores instead of spaces.
+
+[[drumbeatstrings]]
+=== Beat Strings
+
+Let's first learn some basic concepts about rhythm:
+
+* *Rhythm* is a pattern of sound, often repeated.
+* The *tempo* is the speed of the music in BPM (beats per minute).
+* A *beat* is like the "steady pulse" of a song. When members of an audience clap their hands in a concert, they're clapping on the beat.
+* A *measure* is a musical time unit with a predetermined number of beats. In EarSketch, 1 *measure* is 4 beats long. Since there are 4 beats in 1 measure, beats are also called *quarter (1/4) notes*.
+* Each beat can be divided into *subbeats*. For example, a 1/4 note can be divided into 2 *eighth (1/8) notes*. When you are counting 1/4 notes, you say "1, 2, 3, 4...." When counting 1/8 notes, you can use "ands": "1 and 2 and 3 and 4 and...."
+* An 1/8 note can also be divided into 2 *sixteenth (1/16) notes*. When counting 1/16 notes, you can use "e" and "a" on each side of the "and": "1 e and a 2 e and a 3 e and a 4 e and a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Note that the sum of all notes in one measure must be equal to 1. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* A *metronome* helps the musician set the rhythm of his or her piece by making a clicking noise on the beat. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
+
+[[imediameasurepng]]
+.A measure
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
+
+[[imediabeatpng]]
+.A beat
+[caption="Figure 3.2.2: "]
+image::../media/U1P1/beat.png[A beat]
+
+[[imediasixteenthnotepng]]
+.A sixteenth note
+[caption="Figure 3.2.3: "]
+image::../media/U1P1/sixteenthnote.png[A sixteenth note]
+
+.PRACTICE
+****
+Listen to your favorite song, and try to clap on the beat. You can do this exercise with your neighbor.
+****
+
+We'll compose each of our rhythms in a *beat* string.
+
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
+
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` starts playing the percussive sound clip (one hit of the drum, for example).
+* `+` extends the audio clip into the next sub-beat. It always follows a `0` or `+`.
+* `-` is a rest, meaning silence.
+
+.PRACTICE
+****
+For each of the following drumbeat strings, try clapping on the zeros. Then listen to the corresponding audio and verify if you were right. This exercise will help you understand how the drumbeat strings work.
+****
+
+Here are some examples of 1-measure beat strings:
+
+Quarter notes: `"0\+++0+++0\+++0+++"`
+(read: "1, 2, 3, 4")
+
+++++
+audioMedia/beatString1.mp3
+++++
+
+Eighth notes: `"0+0+0+0+0+0+0+0+"`
+(read: "1 and 2 and 3 and 4")
+
+++++
+audioMedia/beatString11.mp3
+++++
+
+Sixteenth notes: `"0000000000000000"`
+(that's very fast, depending on the tempo)
+
+++++
+audioMedia/beatString12.mp3
+++++
+
+`"0-0-0---0-0-0---"`
+(read: "1 and 2, 3 and 4")
+
+++++
+audioMedia/beatString2.mp3
+++++
+
+`"0---0---0-0-0---"`
+(read: "1, 2, 3 and 4")
+
+++++
+audioMedia/beatString3.mp3
+++++
+
+`"0---0---0---0000"`
+(read: "1, 2, 3, 4 e and a")
+
+++++
+audioMedia/beatString4.mp3
+++++
+
+{nbsp} +
+
+////
+ADDITIONAL VIDEO TO BE ADDED
+See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+video revamping tab
+////
+
+[[makebeat]]
+=== The `makeBeat()` function
+
+Now let's see how you can make your own beat. Here we use the term "beat" as a shorthand for drumbeat: a repeated rhythmic pattern of percussive sounds. We will use the `makeBeat()` function, with 4 arguments:
+
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
+
+Let's see more details with this video:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12py]]
+video::./videoMedia/3_3_makebeat_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12js]]
+video::./videoMedia/3_3_makebeat_js.mp4[]
+
+Here is the example shown in the video:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-multi-beat.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-multi-beat.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new `beatString1` variable, a 16-character string with the characters `"0"`, `"+"`, and `"-"`.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
+Please note that:
+
+. You should assign your variables with the `=` symbol before using them.
+. Just like `fitMedia()`, the `makeBeat()` function starts with a lowercase letter (`m`) and has an uppercase letter in the middle (`B`).
+. Just like `fitMedia()`, the `makeBeat()` function has 4 parameters separated by commas.
+
+When you hear your music, if you don't like your first version, tweak your beat to make it sound better and better, until you like what you have.
+****
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. You can either play them simultaneously, on two different tracks, or one after the other on one single track.
+****
+
+[[beatsandgenres]]
+=== Create a beat based on your musical genre
+
+Now that you've started working with `makeBeat()` and beat strings, let's explore some basic beat patterns that you can use.
+You've learned that a musical genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Similarly, some genres have signature beat patterns. Below are some examples:
+
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
+
+Here is the corresponding code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-examples-of-beats.js.txt[]
+----
+
+[[chapter3summary]]
+=== Chapter 3 Summary
+
+* In EarSketch, 1 measure is divided into 4 beats, or 4 quarter notes. 1 beat is divided into 4 sixteenth notes.
+* *Variables* create a space in computer memory to store data.
+* You first need to assign the value (data) to the variable name using the sign `=`. Then you can use the variable by writing its name in the code.
+* A *string* is a data type that consists of a series of characters encapsulated by single or double quotes.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Strings are used with the `makeBeat()` function to create rhythmic patterns in EarSketch. `makeBeat()` takes a beat string to define each sixteenth note of its pattern. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` takes four arguments:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these options is a string?
+
+[answers]
+* "Five"
+* 5
+* FIVE
+* Five
+--
+
+[question]
+--
+What does "0" represent in a beat pattern string?
+
+[answers]
+* Start playing the clip
+* Rest
+* Extend the clip
+* End the clip
+--
+
+[question]
+--
+In EarSketch, one measure is...
+
+[answers]
+* 4 beats long
+* 4 sub-beats long
+* 16 beats long
+* 1 quarter note
+--
+
+[question]
+--
+One sixteenth note is...
+
+[answers]
+* a quarter of a quarter note
+* half a beat
+* a quarter of a measure
+* 1 measure
+--
+
+[question]
+--
+To use the `makeBeat()` function, what is the order of parameters you need to provide?
+
+[answers]
+* clip name, track, start measure, beat string
+* tempo, track, start measure, end measure
+* clip name, start measure, end measure, beat string
+* beat string, track, start measure, clip name
+--
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/oj/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..6788ccea1
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // This is the "boom" sound.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/oj/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..39b8de864
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # This is the "boom" sound.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # This is the "ts" sound.
+
+# Rock beat on measure 1
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop beat on measure 3
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz beat on measure 5
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/oj/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/oj/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/oj/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..2bbded58b
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Setup
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/oj/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..02f305a40
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-variables.js.txt b/src/locales/oj/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..892e9ee9e
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Setup
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/add-beats-variables.py.txt b/src/locales/oj/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..615531008
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..b47ffdbce
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..8bfd9ef2b
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..f17f7606e
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Setup
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..2bb8b3f8e
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/oj/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/oj/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..fe86e34c5
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Setup
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..5e0318ee0
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..b193b59d7
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Setup
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..7c13d7605
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Setup
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..fc4ac0026
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Setup
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..02b9bf3fd
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/oj/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/oj/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/oj/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..5393649b3
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Setup
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/oj/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..e7bcaac25
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-arrays.js.txt b/src/locales/oj/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..6f979e08f
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/oj/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..fc1a83742
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Examples of beats: Creating beats in different genres
+
+// Setup
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/oj/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..35d2a3f43
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Examples of beats: Creating beats in different genres
+
+# Setup
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock beat on measure 1
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop beat on measure 3
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz beat on measure 5
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembow (latin, caribbean) beat on measure 7
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/oj/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/oj/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/oj/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..c3be55257
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Setup
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/oj/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..ddb76404f
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-list.py.txt b/src/locales/oj/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c6cfcd632
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/oj/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..0ccfffc88
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Setup
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/oj/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..9747b5b4a
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/oj/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..81e2dbe01
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Setup
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/oj/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dae36a455
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/oj/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..5fbe4a7ac
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Setup
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/oj/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..91f9bf807
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..1aaddaf46
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..3c2ae73a2
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..cd446e98c
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Setup
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..ca104ee90
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..a639ba4f0
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..0da37e8be
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..d123caa9a
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Setup
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..b0902254f
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..7221572eb
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..1b2cc9748
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..f5b833522
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Setup
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/oj/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..00ff28b70
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/oj/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..013470826
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Setup
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/oj/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/oj/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..8979b5185
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Setup
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/oj/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/oj/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..02ab97eb8
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/oj/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..ce6ff834d
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/oj/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..998a9d803
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Setup
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/oj/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..c735d5b8f
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/oj/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..687c5da0f
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Setup
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/oj/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..d1fb96a5c
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Setup
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/oj/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/oj/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/oj/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..93ca1ae9d
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Setup
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/oj/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..ef85ce675
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Setup
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/oj/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..67ba71708
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Setup
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/oj/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..d7cf9db54
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/oj/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/oj/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/oj/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/oj/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..1f9f0fea3
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Setup
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..64a5b22b0
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/oj/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/oj/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/oj/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/oj/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..91f3bdf73
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/oj/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..95b76a723
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/oj/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..355a11de2
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/oj/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..f15821b9e
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Setup
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/oj/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..dfe4c8900
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/oj/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..903928096
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Setup
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/oj/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..c5595e80f
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..79b65068e
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Setup
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..9d1438f4b
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..a0f162eeb
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..14b374cc9
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..9d8960e5c
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Setup
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..b2ac152d1
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..479e0e3fd
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Setup
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..98ff5f56b
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Setup
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/your-first-song-comments.js.txt b/src/locales/oj/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..d25a49cec
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Setup
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/oj/v2/code-examples/your-first-song-comments.py.txt b/src/locales/oj/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..a077c3b76
--- /dev/null
+++ b/src/locales/oj/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Setup
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/oj/v2/custom-functions.adoc b/src/locales/oj/v2/custom-functions.adoc
new file mode 100644
index 000000000..748232c60
--- /dev/null
+++ b/src/locales/oj/v2/custom-functions.adoc
@@ -0,0 +1,285 @@
+[[customfunctionssongstructure]]
+== Custom Functions and Song Structure
+
+:nofooter:
+
+The song structure is the song's organization over time. The goal is to create meaningful sections and transitions for the flow of your music. In this chapter, you'll create your own function, custom functions, to structure your songs!
+
+[[asongsstructure]]
+=== A song's structure
+
+:nofooter:
+
+A song can be divided into *sections*. A section is made up of several measures (musical time units), and it expresses an idea or feeling. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
+
+A common and simple *form*, or song structure, is ABA. A and B are two different sections, for example chorus and verse. The B section adds variety, while returning to the A section invokes familiarity. The code below creates an ABA form. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
+
+[[imediau2sections_052016png]]
+.An ABA form within the EarSketch DAW
+[caption="Figure 9.2: "]
+image::../media/U2/sections_052016.png[Alt Text]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Select a song that you like. Listen to it and try to notice the different sections. Can you tell when the musicians change sections? How many times do you hear the chorus and verse? What kind of contrasts can you observe? Share your example with your neighbor.
+****
+
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
+
+[[creatingyourcustomfunctions]]
+=== Create your custom functions
+
+In the previous example with the ABA song, the code is large, and the code is repeated for the second A section. There is a way to be more concise, thanks to *custom functions*! We will define a function that will represent section A, then call the function twice.
+
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. Here is how you would define section A:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-untitled1.js.txt[]
+----
+
+. `sectionA()` is the name we chose for our function. You can choose any name you like. Try to name your function in a descriptive way so your code is easier to read.
+. The instructions are the *body* of the function. They are indented.
+
+.PRACTICE
+****
+Paste this code in a new script, and run it. You should see that your DAW remains empty.
+That's because you need to *call* a function to use it.
+To call your function, add the line `sectionA()`, unindented, after your function definition. When running the code, you should see section A in your DAW
+****
+
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. To remedy this issue, we will create *parameters* for our function.
+
+.PRACTICE
+****
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. When you call your function, add the parameters `1` and `5` between the parentheses. Run the code to make sure there is no error.
+1. Add a second function call, this time with the parameters `9` and `13`. Run the code to make sure there is no error.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
+****
+
+Here is what your code could look like:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+----
+
+//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
+
+[role="curriculum-python curriculum-mp4"]
+[[video93py]]
+video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video93js]]
+video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
+
+[[transitionstrategies]]
+=== Transition Strategies
+
+Now that you know how to create custom functions to structure your song, let's look at transitions. *Transitions* help one section smoothly go into the next. They can connect verse and chorus, build up to a drop, mix between tracks (DJing), or change keys. The goal of a transition is to grab the listener's attention and let them know a change is about to occur.
+
+Following are some popular strategies for creating musical transitions:
+
+. *Crash Cymbal*: Placing a crash cymbal on the first beat of a new section.
+. *Drum Fill*: A rhythmic variation to fill the gap before a new section.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Melody Variation*: Introducing a variation of the chords, bass line, or melody before the new section. Often, a folder within the EarSketch sound library contains variations of a similar riff.
+. *Riser*: A note or noise that increases in pitch. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. You can use the search term "riser" in the Sound Browser. A reversed crash cymbal can be used as a riser, like YG_EDM_REVERSE_CRASH_1.
+. *Snare Roll*: A sequence of repeated snare hits, with increasing density, pitch, or amplitude. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Looping*: Repeating a short segment of melody before a new section.
+. *Crossfading*: Decreasing the volume of one section while increasing the volume of a new section.
+. *Anacrusis*: When the melody of the new section starts a couple beats early.
+
+.PRACTICE
+****
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. You can work in pairs. Once you've thought about it, you can have a look at the examples below.
+
+The transition should be placed one or two measures before the new section. You can use several transition techniques at the same time.
+****
+
+Drum fills:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+----
+
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. An example is shown below.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+----
+
+The next example uses multiple risers and a crash cymbal during the transition.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
+----
+
+{nbsp} +
+
+[[yourfullsong]]
+=== Your full song
+
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. Functions are one kind of abstraction used in computer science. They pack multiple statements into one tool so they can be easily referred to. Abstractions can make the form of a program clearer.
+
+.PRACTICE
+****
+Let's create a full song using all the tools you've discovered in EarSketch! Here is a suggestion of how to work, but you can adapt it as you like:
+
+. Choose a theme for your song. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. Then select a simple structure.
+. And finally, start coding! Start with some `fitMedia()` functions to select sounds.
+. Use `makeBeat()` to add some percussion.
+. You can upload your own sounds.
+. Use `for` loops to reduce repetition in your code.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
+. Add one or several conditional statements.
+. Make sure you use variables to store some information such as sound constants.
+. Make sure you use comments to explain what you are doing.
+. Don't forget to regularly run your code and listen to your song. This will help you modify it until you like the sound of it.
+. Choose a name for your song.
+****
+
+Here is an example of a full song:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+----
+
+In this example, we have used a `for` loop inside a custom function! We have used parameters of the function (`start` and `end`) inside the for loop.
+
+[[chapter7summary]]
+=== Chapter 7 Summary
+
+* *Sections* are related musical units consisting of multiple measures. Each expresses an idea or feeling.
+* *Transitions* are passages of music used to connect consecutive musical sections.
+* The structure and variety found within a song is known as its *form*. A common musical form is A-B-A.
+* *Custom functions* are unique functions written by the programmer to accomplish a specific task. You have to create a custom function to be able to call it. You can create as many parameters as you want.
+* An *abstraction* is the bundling of ideas to form a single, often less complex, concept. Functions are an example of abstraction.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these is NOT an example of a musical section?
+
+[answers]
+* Drums
+* Intro
+* Verse
+* Chorus
+--
+
+[question]
+--
+What is an abstraction?
+
+[answers]
+* A bundling of ideas to form a single concept
+* A variety of sounds throughout sections
+* Parts of a song that are related, but also are distinct from each other
+* A statement that returns a value to the function call
+--
+
+[role="curriculum-python"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
+* `myFunction(2, 5)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Which of these options correctly defines the function `myFunction()` with the parameters `startMeasure` and `endMeasure` ?
+
+[answers]
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
+* `myFunction(2, 5)`
+--
+
+[question]
+--
+Which of these is NOT an example of a transition?
+
+[answers]
+* Melody Consistency
+* Crash Cymbal
+* Riser
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/oj/v2/data-structures.adoc b/src/locales/oj/v2/data-structures.adoc
new file mode 100644
index 000000000..392a3b3e5
--- /dev/null
+++ b/src/locales/oj/v2/data-structures.adoc
@@ -0,0 +1,497 @@
+[[getorganizedwithdatastructures]]
+== Data Structures
+
+:nofooter:
+
+[role="curriculum-python"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called lists, and a new functionality of `makeBeat()`.
+
+[role="curriculum-javascript"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. This chapter will help you organize your code further, in particular using a special abstraction called arrays, and a new functionality of `makeBeat()`.
+
+[[datastructures]]
+=== What is a Data Structure
+
+[role="curriculum-python"]
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-javascript"]
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
+----
+
+[role="curriculum-python"]
+If you have replaced variables with a list, how will you reference the content of the list? We use indices. Each element of a list is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+[role="curriculum-javascript"]
+If you have replaced variables with an array, how will you reference the content of the array? We use indices. Each element of an array is assigned an index, starting at `0`. In the previous example, `drums[0]` is calling `OS_KICK03`, `drums[1]` is calling `OS_OPENHAT01` and `drums[2]` is calling `OS_SNARE05`.
+
+.PRACTICE
+****
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-list.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-arrays.js.txt[]
+----
+
+//.The EarSketch Share window for collaboration (Let Others Edit)
+
+//[caption="Figure 21.4.2: "]
+
+image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
+
+[role="curriculum-python"]
+We've seen that `list[index]` will reference an element of the list. This can also be used to modify an element of the list. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+[role="curriculum-javascript"]
+We've seen that `array[index]` will reference an element of the array. This can also be used to modify an element of the array. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the array to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. It uses the *assignment operator* `=`.
+
+.PRACTICE
+****
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. You can use the track number as the counter.
+The index number must start at `0` while your track starts at `1`. Inside your for loop, you'll need to create an `index` variable equal to the track number minus one.
+****
+
+Below is an example. You can have a look in the console to see what is printed when you run the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
+----
+
+[role="curriculum-python"]
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. So `list[0]` is the first element of `list`, and `list[len(list) - 1]` is the last one. For example, if `list = ["Hello", "fellow", "EarSketchers"]`, `len(list)` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-javascript"]
+A useful tip: the `length` property (`array.length`) returns the number of elements of the array. So `array[0]` is the first element of `array`, and `array[array.length - 1]` is the last one. For example, if `array = ["Hello", "fellow", "EarSketchers"];`, `array.length` returns `3`. The indices are `0`, `1` and `2`. The last index is 3-1 = 2.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `len()` function.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Like in the previous example, you can use `track` as your counter, and you'll need to create an `index` variable. In addition, you can create a `measure` variable, using the `length` property.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-additive-introduction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-additive-introduction.js.txt[]
+----
+
+{nbsp} +
+
+[[usingdatastructureswithmakebeat]]
+=== Use Data Structures with `makeBeat()`
+
+[role="curriculum-python"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and lists are:
+
+[role="curriculum-javascript"]
+We will see two ways you can use data structures with `makeBeat()`. First, let's have a look at how similar strings and arrays are:
+
+[role="curriculum-python"]
+* Like lists, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the function `len()` with strings, which returns the number of characters in the string. The last character is at index `len(string) - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[role="curriculum-javascript"]
+* Like arrays, strings have indices. An *index* represents the position of a particular character in a string, starting at 0. For example `"Sarah"[3]` returns `a`.
+* You can use the property `.length` with strings, which returns the number of characters in the string. The last character is at index `string.length - 1`.
+The indices of the string `"EarSketch"` are shown in the table below.
+
+[cols="h,^,^,^,^,^,^,^,^,^"]
+|===
+|Character
+|E
+|a
+|r
+|S
+|k
+|e
+|t
+|c
+|h
+
+|Index
+|0
+|1
+|2
+|3
+|4
+|5
+|6
+|7
+|8
+|===
+
+[role="curriculum-python"]
+* You can concatenate lists together like you do with strings. Use the concatenation operator (`+`): the syntax is `newList = listA + listB`.
+
+[role="curriculum-javascript"]
+* You can concatenate arrays together like you do with strings. We use the `concat` *method*. A method is similar to a function as it has parentheses which contain parameters. To use it, place it after your array name, with a dot: the syntax is `newArray = arrayA.concat(arrayB)`. This is called *dot-notation*.
+
+[role="curriculum-python"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString[startIndex: endIndex]`. The substring includes the character at `startIndex` but not the character at `endIndex`. For example, `"Sarah[1:4]"` will return `"ara"`. You can do the same with lists: `newList = oldList[startIndex: endIndex]`.
+
+[role="curriculum-javascript"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Its syntax is `newString = oldString.substring(startIndex, endIndex)`. The substring includes the character at `startIndex` but not the character at `endIndex`.For example, `"Sarah.substring(1, 4)"` will return `"ara"`. You can do the same with arrays, using the `slice()` method: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` and `slice()` are methods and all use the dot notation.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your lists.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your arrays.
+. Create and print `stringC`, the concatenation of `stringA` and `stringB`.
+. Create and print `soundsC`, the concatenation your `soundsA`, `soundsB` and `soundsA` again.
+. Create and print `stringD`, the slice of `stringC` from the second to the fifth characters included.
+. Create and print `soundsD`, the slice of `soundsC` from the third to the last elements included.
+****
+
+Here is an example of a solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
+----
+
+This is an example of how you can use string operations with `makeBeat()`:
+
+[role="curriculum-python curriculum-mp4"]
+[[video13py]]
+video::./videoMedia/013-03-Substrings-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video13js]]
+video::./videoMedia/013-03-Substrings-JS.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-operations.js.txt[]
+----
+
+[role="curriculum-python"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass a list of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-javascript"]
+Finally, `makeBeat()` can handle multiple sounds at once. This allows you to place all the percussive sounds on one track with just one `makeBeat()` line. Instead of passing your sound file as a first argument, you will pass an array of sounds. In your beat string, instead of using just `0` to play a sound, you can use numbers from `0` to `9`. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Copy the code example in chapter 3.4 for beats by genre. Modify the code to have just one `makeBeat()` line for each genre. Sometimes, the hihat is playing at the same time as the kick or snare. In that case, you can have one `makeBeat()` line just for the hihat.
+****
+
+Here is the solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-examples-of-beats.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using what you have learned in this chapter, create rhythms that you like with `makeBeat()`. You can refer to the video in chapter 3.4 for beats by genre. Don't forget that you can run your code, listen to what you've created, and modify it until it sounds good to you.
+****
+
+{nbsp} +
+
+[[evaluatingcorrectness]]
+=== Evaluate Correctness
+
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Here are some elements that you can check:
+
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Here are some questions that can help you make your code more concise:
+** Did I copy/paste function calls several times in a row? If so, simplify with a loop!
+** Am I reusing any blocks of code? If so, put them in a function!
+** Are there sound constants or mathematical expressions that I use repeatedly throughout my code? If so, assign them to variables! A list might also be useful.
+* *Clarity* relates to how well code communicates its function and the programmer's intent. If your peers are getting lost or confused by your code, it is probably unclear. Here are some questions to help you make your code clear:
+** Are the names of my variables and functions descriptive? If not, rename them.
+** Have I used comments to explain each block of code and any potentially confusing lines of code?
+** Have I used computational structures like custom functions and loops to help organize my code?
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
+
+*Peer Feedback* is common in programming and helps you improve your code and music thanks to comments from others. Feedback must be *constructive*, meaning it builds a peer up, rather them breaking them down. When giving feedback:
+
+* *Be specific* - Refer to specific blocks and lines of code and to specific measures and tracks of music.
+* *Be descriptive* - Describe your reasoning and the process you would take to improve a script.
+* *Be sensitive to your peer's musical vision/goals* - Your own musical tastes should not factor in to an evaluation of your peer's music.
+* *Be positive* - In addition to what needs improvement, point out code blocks and musical passages that are strong.
+* *Don't compare* - Treat your peer's code as their own, not as a competition with your own or other peers' code.
+
+Likewise, when receiving feedback:
+
+* *Be specific* - Point out blocks or lines of code and tracks or measures of music that are causing issues. This will allow your peers to provide feedback that is most helpful to you.
+* *Listen* - Wait to respond until your peer has finished speaking. Be attentive to the information your peer is conveying. Comment your code based on their feedback. These comments can be useful when revising.
+* *Ask questions* - Ask about logic you are unsure of, issues, bugs, musical coherence, or any element of correctness.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in a list.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* It's always recommended to think about a theme for your song and a structure before getting started. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Create sound and beat string variables, and use `fitMedia()` and `makeBeat()` calls. You can upload your own sounds.
+* Whenever it's useful, create for-loops and custom functions.
+* Add some effects with `setEffect()`. You can add a fade in, fade out, some delay, reverb...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in an array.
+****
+
+[[chapter9summary]]
+=== Chapter 9 Summary
+
+[role="curriculum-python"]
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Items stored within a list, or elements, can be any data type.
+* Like strings, list elements get assigned an index. List indices start at 0.
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The function `len()` returns the number of elements in a list, or the number of characters in a string. The syntax is `len(list)`.
+* Lists and arrays can be concatenated and sliced using *list operations*, a set of tools for modifying a list.
+* The syntax for creating a subset of a list from a larger, existing list is `newList = oldList[startIndex: endIndex]`.
+* Lists can be combined using the concatenation operator, `+`, like `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[role="curriculum-javascript"]
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
+* Like strings, array elements get assigned an index. Array indices start at 0.
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* The property `length` returns the number of elements in an array, or the number of characters in a string. The syntax is `array.length` or `string.length`.
+* Arrays can be concatenated and sliced using *array operations*, a set of tools for modifying an array.
+* The syntax for slicing out an array from a larger, existing array is `newArray = oldArray.slice(startIndex, endIndex)`.
+* The syntax for slicing out a substring from a larger string is `newString = oldString.substring(startIndex, endIndex)`.
+* Arrays can be combined using the `concat()` method, like `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Exchanging constructive information with others is a form of *peer feedback*. It provides the opportunity to learn from others.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following operations is used to join lists/arrays?
+
+[answers]
+* Concatenation
+* Slicing
+* Combination
+* Addition
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the index number of the first element of a list in Python?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What does `len(myList)` return?
+
+[answers]
+* The number of elements in `myList`
+* The data types of `myList`
+* The elements of `myList`
+* The width of `myList`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the syntax to concatenate two lists (`listA` and `listB`)?
+
+[answers]
+* `listA + listB`
+* `listA ++ listB`
+* `listA and listB`
+* `listB + listA`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How can you get a list from oldList without the first and last elements?
+
+[answers]
+* `oldList[1:len(oldList) - 1]`
+* `oldList[1:len(oldList)]`
+* `oldList[0:len(oldList)]`
+* `oldList[2:len(oldList - 1)]`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the index number of the first element of an array in Javascript?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What does `myArray.length` return?
+
+[answers]
+* The number of elements in `myArray`
+* The data types of `myArray`
+* The elements of `myArray`
+* The width of `myArray`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the syntax to concatenate two arrays (`arrayA` and `arrayB`)?
+
+[answers]
+* `arrayA.concat(arrayB)`
+* `arrayA.concatenate(arrayB)`
+* `arrayB.concat(arrayA)`
+* `arrayB.concatenate(arrayB)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How can you get an array from `oldArray` without the first and last elements?
+
+[answers]
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
+--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/oj/v2/effects-and-envelopes.adoc b/src/locales/oj/v2/effects-and-envelopes.adoc
new file mode 100644
index 000000000..92b9ab79b
--- /dev/null
+++ b/src/locales/oj/v2/effects-and-envelopes.adoc
@@ -0,0 +1,321 @@
+[[effectsandenvelopes]]
+== Effects and Envelopes
+
+:nofooter:
+
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. This is achieved through the `setEffect()` function, the focus of this chapter.
+
+[[effectsinearsketch]]
+=== Use Effects in EarSketch
+
+:nofooter:
+
+*Effects* allow us to change qualities of sounds. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
+
+[role="curriculum-python curriculum-mp4"]
+[[video4py]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video4js]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
+
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
+
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+
+.PRACTICE
+****
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
+****
+
+Here is an example below:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
+----
+
+We've seen the `VOLUME` effect. Let's now look at `DELAY`. Listen to the 2 clips below, one without and one with a *delay* effect applied.
+
+No effect:
+
+++++
+audioMedia/reference.mp3
+++++
+
+Delay effect:
+
+++++
+audioMedia/delay2.mp3
+++++
+
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
+
+.PRACTICE
+****
+. Read about the delay effect in the list of effects chapter here: <>
+. Then run the code below and listen to the music without effects
+. Then uncomment the first `setEffect()` line and listen to the difference
+. Then uncomment the second `setEffect()` line and listen to the difference ("uncomment" means to erase the comment syntax, `#` or `//` from a block of code)
+Note that the delay time, 500ms, is the length of one beat. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
+----
+
+{nbsp} +
+
+[[functionsandmoreeffects]]
+=== Functions and more effects
+
+So far, you've been using several functions in EarSketch like `fitMedia()` or `setEffect()`. Note that the function names always start with a lower-case letter, and are often a verb. The parentheses tell the computer to *call*, or *execute*, the function. *Arguments*, or parameters, between the parentheses are separated by commas.
+
+[role="curriculum-python"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+[role="curriculum-javascript"]
+* `setTempo()`, `fitMedia()`, `makeBeat()`, and now `setEffect()` take arguments. They are part of the EarSketch *Application Programming Interface*, or *API*. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* In a later chapter, you'll also learn how to create your own custom functions.
+
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
+
+* *Numbers*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Floating point* numbers are rational numbers like 0.125 or -21.0. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
+
+Now, let's play more with the `setEffect()` function. The following video shows how to use some effects:
+
+////
+VIDEO IS BEEING MADE
+more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+("videos revamping" tab)
+////
+
+*Reverb* (short for reverberation) is sound bouncing off walls and returning to your ears. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. The `REVERB` effect has parameters to control the decay time (`REVERB_DECAY`) and amount of the effect present (`MIX`).
+
+Listen to the clips below to hear the result of adding reverb to a track:
+
+No effect:
+
+++++
+audioMedia/reverbReference.mp3
+++++
+
+Reverb effect:
+
+++++
+audioMedia/reverbEffect.mp3
+++++
+
+{nbsp} +
+
+.PRACTICE
+****
+Go to <> for a complete list of effects.
+Create a song with a volume effect and two other effects. Don't forget to write what you are doing in the comments and to create variables when necessary.
+****
+
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
+
+You've started using effects, and maybe you'd like for one effect to change over time. For example, you might want a fade in (volume getting higher) at the beginning of your song.
+
+*Envelopes* allow us to define how an effect changes over time.
+
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. The envelope creates a line between these points, called a *ramp*:
+
+[[envelopepoints]]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
+image::../media/U2/NewEnvelope.png[Alt Text]
+
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
+
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
+
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
+
+Here is an example of fade in:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
+----
+
+Now watch this video for other envelope examples
+
+[role="curriculum-python curriculum-mp4"]
+[[video5b]]
+video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript curriculum-mp4"]
+video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new song. Use one `for` loop to add an envelope to all the tracks (for example: fade in and fade out for all your tracks), or to repeat an effect on the same track. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
+****
+
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+----
+
+And here is an example of fade in and fade out on all the tracks:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter5summary]]
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Volume* is related to loudness. *Delay* creates an echo. *Reverb* makes it feel like the sound is played in a large room. *Panning* places your music on the left or right side.
+* Effects are implemented in EarSketch with the `setEffect()` function. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Functions* contain instructions for the computer to execute. Data is sent to functions by *arguments*, which affect how the function executes. The syntax of a function *call* with two arguments is `myFunction(argument1, argument2)`. An example of syntax used in a function *call* with 4 arguments is `makeBeat(kick, 2, measure, kickBeat)`.
+* A complete list of EarSketch effects and their parameters can be found in <>, along with descriptions for each.
+* *Envelopes* define how an effect parameter changes over time. They are described with value-time pairs, like _(value, time, value, time)_.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does an effect allow you to do in EarSketch?
+
+[answers]
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
+--
+
+[question]
+--
+Which of these is NOT a `setEffect()` argument?
+
+[answers]
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
+--
+
+[question]
+--
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
+[answers]
+* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
+* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
+* `fitMedia(DELAY, 3, DELAY_TIME, 50.0)`
+* `setEffect(50, DELAY_FEEDBACK, 1)`
+--
+
+[question]
+--
+Which of the following is not a parameter used with `setEffect()` envelopes?
+
+[answers]
+* Clip Length
+* Start Value
+* Track Number
+* Effect
+--
+
+[question]
+--
+What would the following `setEffect()` function do?
+
+[source,python]
+----
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
+----
+
+[answers]
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/oj/v2/get-user-input.adoc b/src/locales/oj/v2/get-user-input.adoc
new file mode 100644
index 000000000..27edbca84
--- /dev/null
+++ b/src/locales/oj/v2/get-user-input.adoc
@@ -0,0 +1,391 @@
+[[getuserinput]]
+== Get User Input
+
+:nofooter:
+
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. For that, we'll look at return statements and the `readInput()` function.
+
+[[returnstatement]]
+=== Return Statement
+
+Watch this video first:
+
+[role="curriculum-python curriculum-mp4"]
+[[video131py]]
+video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video131js]]
+video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
+
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* The *return statement* is a statement inside the function body that: A. tells a function to return a value when called. B. signals the function to stop. If you have any statements after the `return` keyword, they will be ignored.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` and `setEffect()` are examples of functions that don't return anything.
+
+Here is a code example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements.js.txt[]
+----
+
+With the return statement, the complete control flow for a function looks like this:
+
+[[return]]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
+image::../media/U2/Return.png[Alt Text]
+
+.PRACTICE
+****
+Create a function that will implement a musical section with:
+
+* Only one parameter, called `start`, which represents the start measure.
+* One `return` statement that returns the end measure.
+* A body function with `fitMedia()` functions.
+
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Let's say you have a section A, but you want it to vary slightly when it's called at different moments of the song. You will create a function called `sectionA()` with two `fitMedia()` calls.
+
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
+
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
+
+Then call the function at different measures with different variations.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-conditional-statement.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-conditional-statement.js.txt[]
+----
+
+{nbsp} +
+
+[[userinput]]
+=== Get User Input
+
+We'll see how to ask for user input when the "run" button is pressed. This is possible thanks to the `readInput()` function. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. The `readInput()` function returns what the user types there.
+
+For example, copy the following code in a new script, and run it:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-untitled1.js.txt[]
+----
+
+We might need to convert the returned user input into a different data type. Here are useful functions:
+
+[role="curriculum-python"]
+* `str()` - converts any value into a string.
+* `int()` - converts a string containing digits into an integer (for example: `"3"` becomes `3`).
+* `float()` - convert a string containing digits with a decimal point into a float (for example: `"3.5"` becomes `3.5`).
+
+[role="curriculum-javascript"]
+* `String()` - converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter.
+* `Number()` - converts a string into a number (for example: `"3.5"` becomes `3.5`).
+
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-1.js.txt[]
+----
+
+Here is another example of what you can do with user input.
+
+*Concatenation* is a means to link strings together, using the `+` symbol. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. The number is concatenated with `DUBSTEP_BASS_WOBBLE_0` to form a complete clip name like `DUBSTEP_BASS_WOBBLE_010`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ask for a user input to modify something in your song.
+
+Here are ideas of tools you can use:
+
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
+****
+
+{nbsp} +
+
+[[booleanlogic]]
+=== Boolean Logic
+
+We will now combine boolean logic and user input for another example of user interaction.
+
+[role="curriculum-python"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
+
+[role="curriculum-javascript"]
+Let's first look at boolean logic. You know that *comparison operators* help create a boolean. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
+
+Now let's look at *boolean operators*: these help combine several booleans. There are three boolean operators:
+
+[role="curriculum-python"]
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
+
+[role="curriculum-javascript"]
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
+
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `True` or `False`?
+
+* `not True`
+* `True and False`
+* `True or False`
+* `True and True`
+* `(True and False) or True`
+* `True and not False`
+* `not (False or False)`
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `true` or `false`?
+
+* `!true`
+* `true && false`
+* `true || false`
+* `true && true`
+* `(true && false) || true`
+* `true && !false`
+* `!(false || false)`
+****
+
+Use the following code to print the answers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
+----
+
+Here is a reminder of boolean creation, and some examples of boolean operations:
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+
+.PRACTICE
+****
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Depending on the user's answer, select a beat string that is works well with the genre. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-operations.js.txt[]
+----
+
+{nbsp} +
+
+.CHALLENGE
+****
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Depending on the user's answer, create a song that goes with the genre.
+****
+
+{nbsp} +
+
+[[chapter8summary]]
+=== Chapter 8 Summary
+
+[role="curriculum-python"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` converts any value into a string.
+`int()` converts a string containing digits into an integer. `float()` converts a string containing digits with a decimal point into a float.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[role="curriculum-javascript"]
+* *Return statements* can be included in a function definition to output a result when the function is called.
+* `readInput()` will request a user input when you run your code. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` converts any value into a string. Note that, for once, it's a function name that starts with an uppercase letter. `Number()` converts a string into a number.
+* You can *concatenate* (link) strings together: "Hello"+"World" will evaluate to "HelloWorld".
+* *Boolean logic* includes boolean operations. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following would be considered an example of data type conversion?
+
+[answers]
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Using `readInput()` to ask a user for a genre.
+* Producing a Boolean through a comparison operator.
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+not (True and (4 > 5))
+----
+
+[answers]
+* `True`
+* `5`
+* `4`
+* `False`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+!(true && (4 > 5));
+----
+
+[answers]
+* `true`
+* `4`
+* `false`
+* `5`
+--
+
+[question]
+--
+Which of the following is an example of concatenation?
+
+[answers]
+* `x = beatstring1 + beatstring2`
+* `x = beatstring1.beatstring2`
+* `x = (beatstring1, beatstring2)`
+* `x = beatstring1[beatstring2]`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How would you obtain the boolean True with the booleans True and False?
+
+[answers]
+* `True or False`
+* `not True`
+* `True and False`
+* `true or false`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How would you obtain the boolean true with the booleans true and false?
+
+[answers]
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/oj/v2/getting-started.adoc b/src/locales/oj/v2/getting-started.adoc
new file mode 100644
index 000000000..c90f659c1
--- /dev/null
+++ b/src/locales/oj/v2/getting-started.adoc
@@ -0,0 +1,386 @@
+[[getstartedwithearsketch]]
+== Getting Started with EarSketch
+
+:nofooter:
+
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
+
+[[discoverearsketch]]
+=== Discover EarSketch
+
+:nofooter:
+
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
+
+////
+TODO: upload video
+////
+
+As you become familiar with EarSketch these are the main panels.
+
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
+
+{nbsp} +
+
+_What is a DAW?_
+
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
+
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
+
+EarSketch is DAW that allows you to create music by writing code.
+
+Here is how to make full use of the DAW:
+
+[role="curriculum-mp4"]
+[[video1b]]
+video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+Let's try running a code example in EarSketch! On the box below, press the blue clipboard icon in the top right corner. This will paste the example code onto a new file in the *code editor*. No need to understand the code yet, just press the _run_ button and your music will show up in the DAW. You can press the _play_ button to hear it.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-intro-script.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-intro-script.js.txt[]
+----
+
+{nbsp} +
+
+[[createanewscript]]
+=== Create your first script!
+
+Let's see how to create a script from scratch.
+
+. *Create.* In the editor tabs, click the white "+" icon.
++
+If this is your first script, click the large blue text "Click here to create a new script!"
++
+[[newscriptplus]]
+.Create a new script, open scripts
+[caption="Figure 1.2.1: "]
+image::../media/U1P1/NewScriptPlus.png[Alt Text]
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
++
+[[newscriptpromptpy]]
+.The create a new script dialog box
+[role="curriculum-python"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
+[[newscriptpromptjs]]
+.The create a new script dialog box
+[role="curriculum-javascript"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+
+*_What is a programming language?_*
+
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
+
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
+
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
+
+[[fitmedia]]
+=== The `fitMedia()` function
+
+Now that you have created your first script, let's start working on your music!
+
+Watch this video to see how to add an audio clip to your song:
+
+[role="curriculum-python curriculum-mp4"]
+[[video110py]]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video110js]]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
+
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
+
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. A *statement* tells the computer to carry out an action.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
+
+////
+OPTIONAL
+////
+
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
+
+////
+END OF OPTIONAL
+////
+
+////
+OPTIONAL
+////
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia.js.txt[]
+----
+
+For an extra challenge, add more `fitMedia()` calls to your script like we do below. Notice that we use a different track number for each `fitMedia()` call:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using sounds that you like:
+
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
+
+For each exercise, you can have your neighbour listen to your song.
+
+If you have errors when running your code, check out the next chapter about debugging.
+****
+
+[[debugging]]
+=== Debug your code
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. In programming, coding faults are called *errors*, or *bugs*. The process of finding and fixing bugs is called *debugging*. You can use debugging strategies, using the console.
+
+[role="curriculum-python curriculum-mp4"]
+[[video3py]]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video3js]]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+////
+OPTIONAL
+////
+
+What are the different types of errors?
+
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Runtime errors*: Your program starts to run but halts due to an error.
+. *Logic errors*: Your program runs, but it doesn't do what is expected. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
+
+////
+END OF OPTIONAL
+////
+
+Here are some common errors:
+
+[role="curriculum-python"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Punctuation:* Missing commas or other punctuation errors
+
+[role="curriculum-javascript"]
+. *Misspelling:* Check the spelling when using a function like `fitMedia()` or sound constants.
+. *Case sensitivity:* Most words used in programming are case-sensitive (the computer recognizes the difference between capitalized and uncapitalized letters). Pay attention to lowercase and uppercase letters. For example, write `fitMedia()` and not `FitMedia()` or `fitmedia()`. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Parentheses:* Forgetting an opening or closing parenthesis where needed will cause a <>.
+. *Punctuation:* Missing commas or other punctuation errors
+
+Time to practice!
+Find the five errors in the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-finding-errors.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-finding-errors.js.txt[]
+----
+
+////
+OPTIONAL
+////
+
+Here is the answer
+
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. The first `fitMedia()` is missing a comma between the third and fourth parameters
+. The second `fitMedia()` is missing an uppercase `M`
+. In the second `fitMedia()`, the order of parameters is not correct: it should be sound clip name then track number
+
+////
+END OF OPTIONAL
+////
+
+Take a look at <> for a description of different error types and what you can do to prevent them.
+
+////
+TODO: when options are ready, modify the link
+////
+
+[[chapter1summary]]
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* The *console* shows information about the state of a program, making it useful for debugging syntax errors.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a panel in the EarSketch workspace?
+
+[answers]
+* The effects browser
+* The code editor
+* The DAW
+* The console
+--
+
+[question]
+--
+How many parameters do you need for your `fitMedia()` function?
+
+[answers]
+* 4
+* 6
+* 2
+* 3
+--
+
+[question]
+--
+One script corresponds to...
+
+[answers]
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
+--
+
+[question]
+--
+What is a measure?
+
+[answers]
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
+--
+
+[question]
+--
+Which of the following is NOT a common type of error found in code?
+
+[answers]
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
+--
+
+[question]
+--
+Where in the EarSketch workspace can you get information about your bugs?
+
+[answers]
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/oj/v2/legacy.adoc b/src/locales/oj/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/oj/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/oj/v2/loops-and-layers.adoc b/src/locales/oj/v2/loops-and-layers.adoc
new file mode 100644
index 000000000..52974c50d
--- /dev/null
+++ b/src/locales/oj/v2/loops-and-layers.adoc
@@ -0,0 +1,414 @@
+[[loopandlayers]]
+== Loops and Layers
+
+:nofooter:
+
+In this chapter you will learn about `for` loops and how you can create repetition in your code and music. We will also cover musical layers and textures as well as some debugging tips.
+
+[[forloops]]
+=== `for` loops
+
+Just like musicians can play a pattern again and again in a *loop*, programmers can ask the computer to complete tasks again and again... in a *loop*! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
+
+For example, if you want to repeat a `makeBeat()` that you have created, instead of writing down several lines of `makeBeat()` functions, you can create a `for` loop.
+
+////
+add new video
+more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=0
+in the "revamping videos" tab (includes link to script)
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
+----
+
+[role="curriculum-python"]
+`for` loops in Python consist of 3 basic parts:
+
+[role="curriculum-javascript"]
+`for` loops in JavaScript consist of 4 basic parts:
+
+[[loop-components-PY]]
+.The basic components of a for loop
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.The basic components of a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Loop Counter*: Creates a variable to be used as a loop counter. You can have more than one line of instructions inside the `for` loop.
+* *Range*: A function that makes a list of numbers for the loop counter to count through. The keyword `in` connects the loop counter to the range. `range()` takes two arguments, a starting point (inclusive) and ending point (exclusive): `range(startingNumber, endingNumber)`.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It includes everything that is *indented* (using the _tab_ key) directly after the colon `:`.
+
+[role="curriculum-javascript"]
+* *Initialization*: This creates a variable to be used as a *loop counter* before the first loop runs.
+* *Loop Condition*: This checks whether the loop should run again. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Iteration Statement*: A statement that updates the loop counter. It counts up each time the loop repeats.
+* *Loop Body*: The body of a loop contains statements that will execute repeatedly. It is surrounded by curly braces `{ }` and is *indented* (using the _tab_ key). You can have more than one line of instructions inside the `for` loop.
+
+.PRACTICE
+****
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. Then modify your counter name, pick a track and measures, and create the appropriate `for` loop
+. Show your neighbor your last `for` loop, and have them find which track your beat is on, which measures it's going to be on, and what your counter's name is.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
+[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `print()` call.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `println()` call.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-printing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-printing.js.txt[]
+----
+
+Here, you will see in your console the following lines:
+
+----
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
+3
+ok
+4
+ok
+----
+
+and it ends there since measure has to be lower than 5, so 4 is your limit.
+
+[[controlflow]]
+=== Control Flow
+
+Here is another example of how you can use `for` loops:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12bpy]]
+video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12bjs]]
+video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
+
+We can create repetition in our music by typing `fitMedia()` again and again, with different measure numbers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-no-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-no-loops.js.txt[]
+----
+
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-loops.js.txt[]
+----
+
+The *interpreter* reads and executes a script. The order it is executed in is called the *control flow*. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
+
+A loop is a *control flow statement*, which changes the order. At the end of a loop body, it jumps back to the top of the loop.
+
+This animation shows how the control flow moves in a `for` loop, and how the value of the loop counter changes on each *iteration*, or repetition of the loop body:
+
+[[loop-py]]
+.Stepping through a for loop
+[role="curriculum-python"]
+[caption="Figure 4.2.1: "]
+image::../media/U1P2/LoopPy_updated.gif[Alt Text]
+
+.Stepping through a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.2.1: "]
+[[loop-js]]
+image::../media/U1P2/LoopJS_updated.gif[Alt Text]
+
+////
+Although it is valid syntax, a `*monospace bold phrase*` causes a build error in AsciidocFX. Might be something to do with DocBook conversion. No bold for now. May see how ES handles it in the future.
+
+BMW
+////
+
+One last interesting thing about `for` loops is incrementation.
+
+[role="curriculum-python"]
+Incrementation means increasing the counter's value. In `for` loops we used the `range()` function to increment the counter. We've seen two parameters for range: `startingNumber` and `endingNumber`. There is an optional third parameter: `increment`. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
+
+[role="curriculum-javascript"]
+Incrementation means increasing the counter's value. In `for` loops we used the terms `measure = measure + 1`. This increments the counter `measure` by `1` for on each repeat. It's possible to increment it by more than one, like `measure = measure + 4`.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-incrementing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-incrementing.js.txt[]
+----
+
+[role="curriculum-python"]
+Here we used the `range()` function, but you can also increment (increase) or decrement (decrease) a variable using this type of expression: `measure = measure + 1`. This means measure is now equal to its former value plus one. You can use the shorthand `+=` to increment or `-=` to decrement. Here is how: `measure += 1` is equivalent to `measure = measure + 1`. And `measure -=1` is equivalent to `measure = measure - 1`
+
+[role="curriculum-python"]
+* `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[role="curriculum-javascript"]
+Here we wrote `measure = measure + 4`, which means measure is now equal to its former value plus four. You can use some shorthands:
+ `+=` (or `-=` to decrement). The following is a shorthand method for incrementing (or decrementing) a counter:
+
+[role="curriculum-javascript"]
+* `measure++`, or `measure += 1` increments measure by 1. If you want to increment by more than one, use `measure += 2`.
+* `measure--`, or `measure -= 1` decrements measure by 1. If you want to decrement by more than one, use `measure -= 2`.
+
+[[debuggingtips]]
+=== Debugging Tips
+
+Programming is not only writing code. It's also debugging and maintaining it. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
+
+[role="curriculum-python"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+[role="curriculum-javascript"]
+. *Read the console for clues*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. You can narrow down an error by putting comment syntax around a block of code, or *commenting it out*, and running the code. If there is no error, the error is somewhere in the commented block.
+.. *Print debugging* can also be used to locate an error. Read through the problem section of your code and try to follow the logic. Insert `println()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Squash the bug:* Check for errors and edit the offending code, then run it to verify its correctness.
+. *Ask for help:* If you find you have spent too much time on a bug, then ask someone for help! A fresh pair of eyes can do wonders for spotting mistakes.
+
+Below, we walk through an example of printing variables to help debug a script:
+
+[role="curriculum-python curriculum-mp4"]
+[[video15py]]
+video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video15js]]
+video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
+
+You've seen a list of potential errors in Chapter 1. Here are some other errors that you might encounter:
+
+[role="curriculum-python"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should assign a value to your variable before using it later.
+. *Comments:* Improper commenting will cause a <>. Python comments must start with a `#` symbol.
+. *Indentation:* Indentation is critical in Python. Lack of indentation in `for` loop bodies will cause an <>.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+[role="curriculum-javascript"]
+. *Initializing variables*: A variable must be initialized before it can be used in a script. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Comments:* Improper commenting will cause a <>. JavaScript comments must start with `//`.
+. *Quotations:* Forgetting an opening or closing quotation mark can also cause a <>.
+. *Arguments:* Mistakes with function arguments can lead to all kinds of errors. You must provide the correct number and type of arguments to a function call.
+
+Take a look at <> for a full description of different error types and what you can do to prevent them.
+
+[[musicaltips]]
+=== Musical tips
+
+Now that you have many tools to create your music, like `fitMedia()`, `makeBeat()` and `for` loops, we will look at musical ideas.
+
+Let's start with the *key* of your song:
+
+* *Pitch* is how high or low a note sounds. We order relative musical tones on a *scale*, or set of musical notes, based on how we hear the frequency of the sound.
+* The *key* of a song indicates the scale, or group of pitches, in which the music is composed. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Selecting sounds from different keys might sound... off-key! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
+
+++++
+audioMedia/MajorMinor.mp3
+++++
+
+Now let's talk about the different types of tracks you can have. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
+
+* *Melody* is the main idea that's often higher pitched, or "the notes that the lead sings." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Harmony* is the longer toned notes that "support the melody" like the chords on a piano, strumming guitar, or a collection of strings.
+* You also have a *bass line*. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Then there is *percussion*. If you're using `makeBeat()`, this can take several tracks. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+
+These are basic ideas that create the structure of your song's texture. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
+
+Finally, let's discuss *repetition* and *contrast*. Humans enjoy repetition because of what psychologists call the _mere exposure effect_. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
+
+.PRACTICE
+****
+Create a complete song with:
+
+* A theme (please mention your chosen theme in your commented intro in the code)
+* The `fitMedia()` and `makeBeat()` functions
+* One or more `for` loop(s) either with `fitMedia()` or `makeBeat()`
+* At least four tracks
+* At least sixteen measures
+* At least one uploaded sound
+* Comments and variables to organize your code
+
+Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
+****
+
+{nbsp} +
+
+[[chapter4summary]]
+=== Chapter 4 Summary
+
+[role="curriculum-python"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, loop counter, and range. The code in the loop body must be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[role="curriculum-javascript"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` loops consist of a loop body, initialization, iteration statement, and loop condition. The code in the loop body should be indented.
+* The *control flow* represents the order in which statements are executed by the computer.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Revisit the expanded list of common programming errors: <>.
+* The *pitch* of a sound determines how high or low it sounds on a relative scale.
+* The *key* of a song defines the *scale*, or group of pitches, in which the piece is composed, as well as the *tonic* note. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a component of a `for` loop?
+
+[answers]
+* Loop interpreter
+* Loop Counter
+* Loop Body
+* Loop Range
+--
+
+[question]
+--
+Which of the following is NOT a good use of loops in a musical composition?
+
+[answers]
+* Creating a beat pattern than never repeats
+* Placing musical clips on every third measure
+* Repeating a beat on several consecutive measures
+* Placing musical clips on odd measures
+--
+
+[question]
+--
+Which of the following is NOT a recommended technique for debugging?
+
+[answers]
+* Copying and pasting code into Google
+* Printing variable values to the console
+* Looking at error lines identified in the console
+* Asking others for help
+--
+
+[question]
+--
+Which of the following is NOT something that can be printed to the console?
+
+[answers]
+* Code Comments
+* Strings
+* Mathematical Expressions
+* Variables
+--
+
+[question]
+--
+____ is a quality of sound that determines how high or low it sounds.
+
+[answers]
+* Pitch
+* Tempo
+* Rhythm
+* Loudness
+--
\ No newline at end of file
diff --git a/src/locales/oj/v2/mixing-with-conditionals.adoc b/src/locales/oj/v2/mixing-with-conditionals.adoc
new file mode 100644
index 000000000..d41a2af7c
--- /dev/null
+++ b/src/locales/oj/v2/mixing-with-conditionals.adoc
@@ -0,0 +1,363 @@
+[[mixingwithconditionnals]]
+== Mix with Conditionals!
+
+:nofooter:
+
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
+
+[[analyzetrack]]
+=== Use `analyzeTrack()`
+
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. We’ll use an EarSketch function called `analyzeTrack()`. Import and run the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+----
+
+You can read in your console that the printed loudness is 0.10306035109110138.
+
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
+
+The `analyzeTrack()` function takes 2 arguments:
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
+
+.PRACTICE
+****
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
+. Add a second track and use the `analyzeTrack()` function to print its loudness in the console. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
+****
+
+The parameter for `analyzeTrack()` can either be `RMS_AMPLITUDE`, to evaluate the loudness, or `SPECTRAL_CENTROID` to analyze the brightness of the sound. We'll focus on analyzing loudness in this chapter.
+
+[[booleansandcomparisons]]
+=== Booleans and comparisons
+
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
+
+[role="curriculum-python"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `True` and `False`. `True` and `False` start with a capital letter and do not have quotes.
+
+[role="curriculum-javascript"]
+*Booleans* are a data type. The boolean data type only has 2 possible values, `true` and `false`. `true` and `false` start with a lower-case letter and do not have quotes.
+
+[role="curriculum-python"]
+--
+To create a boolean, you can either initialize a variable (`variable1 = True`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|==
+|is equal to
+
+|!=
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are identical: `==`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-javascript"]
+--
+To create a boolean, you can either initialize a variable (`var variable1 = true;`), or you can use a comparison. To make a comparison, we use a *comparison operator*. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|===
+|is equal to
+
+|!==
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are equal: `===`
+1. Assigning a value to a variable: `=`
+--
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
+
+// this video will be cut at 2' to delete the section about boolean operators//
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `True` if the first track is louder than the second track, and `False` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `True`, if not, print `False`.
+* You can use additional print statements before printing `True` or `False` so that when you read the console, you know what is `True` or `False`. For example, you can first print the track number and then 'True' or 'False'.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Print `true` if the first track is louder than the second track, and `false` otherwise.
+* Use a for loop with the counter `track` to check for each track if the loudness is strictly greater than 0.01. If it is, print `true`, if not, print `false`.
+* You can use additional print statements before printing `true` or `false` so that when you read the console, you know what is `true` or `false`. For example, you can first print the track number and then 'true' or 'false'.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+----
+
+[role="curriculum-python"]
+In this example, we used `print()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings, and the function str() to convert numbers to strings.
+
+[role="curriculum-javascript"]
+In this example, we used `println()` with strings to help read the content of the console. We used the operator `+` to *concatenate*, or add strings.
+
+[[conditionalstatements]]
+=== Conditional Statements
+
+What is a conditional statement? A *statement* is an instruction for the computer. A *conditional statement* is an instruction that must be executed only if a certain *condition* is true. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. If no, don't do anything (keep going).
+
+Below is an example of conditional statement, note the similarity with a for loop:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
+----
+
+.PRACTICE
+****
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+----
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
+----
+
+[[mixingyourtracks]]
+=== Mix your tracks
+
+Let's use all these tools to mix your song. Mixing is modifying the volume of tracks so that they sound well balanced together.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
+* If your main track is not louder than the other tracks, make sure to increase its volume using the `setEffect()` function. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
+****
+
+Let's review some vocabulary:
+
+1. *Operator*: a character that represents an action. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Expression*: A combination of values, constants, variables, operators, and functions. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Statements*: instructions for the computer to execute.
+
+Below is an example of automated mixing. We can say it's automated because if you change one or more sounds, you won't have to check their loudness and modify the volume accordingly yourself, since it's already included in the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter6summary]]
+=== Chapter 6 Summary
+
+[role="curriculum-python"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `True` and `False`.
+* Boolean values are generated by comparison operators: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* `==` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `True` or `False`.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
+
+[role="curriculum-javascript"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* The *boolean* data type has only two possible values, `true` and `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* An *operator* is a character that represents an action.
+* *Expressions* are evaluated by the computer to produce a value.
+* A *statement* is an instruction for the computer.
+* A *condition* is an expression that evaluates to `true` or `false`.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following elements is a boolean?
+
+[answers]
+* `5+4 === 5`
+* `measure = 1`
+* `2<3<4`
+* `False()`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[question]
+--
+What is mixing?
+
+[answers]
+* adapting the volume of each track so they sound well balanced
+* adapting the pitch of each track so they sound well balanced
+* adding a fade in
+* adding a fade out
+--
+
+[question]
+--
+How many conditions can you check in a conditional statement?
+
+[answers]
+* any number of conditions
+* 1 condition
+* 2 conditions
+* 3 conditions
+--
\ No newline at end of file
diff --git a/src/locales/oj/v2/optional.adoc b/src/locales/oj/v2/optional.adoc
new file mode 100644
index 000000000..1d412d2ad
--- /dev/null
+++ b/src/locales/oj/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/oj/v2/reference.adoc b/src/locales/oj/v2/reference.adoc
new file mode 100644
index 000000000..d08f7ea27
--- /dev/null
+++ b/src/locales/oj/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effects, Errors, and EarSketch Functions
+
+:nofooter:
+
+In this unit you will find references to all effects, errors and EarSketch API functions.
\ No newline at end of file
diff --git a/src/locales/oj/v2/unit-1.adoc b/src/locales/oj/v2/unit-1.adoc
new file mode 100644
index 000000000..7f48189fe
--- /dev/null
+++ b/src/locales/oj/v2/unit-1.adoc
@@ -0,0 +1,18 @@
+[[unit1]]
+== Unit 1: Compose and Add Beats
+
+:nofooter:
+
+In this unit you will learn how EarSketch works, you will place sounds (clips) into your music, debug your code, customize your song, and add beats based on your musical genre.
+
+Anyone (especially you) can learn to program! Like learning a musical instrument, it takes consistent practice to make progress. Don't get discouraged if you get stuck, this is part of the process. Ask for help in your class or look online if needed.
+
+We wish you the best of luck, and before you start here's an example of what you can do with EarSketch:
+
+[role="curriculum-python curriculum-mp4"]
+[[video1livepy]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video1livejs]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-JS.mp4[]
\ No newline at end of file
diff --git a/src/locales/oj/v2/unit-2.adoc b/src/locales/oj/v2/unit-2.adoc
new file mode 100644
index 000000000..d4fd5122b
--- /dev/null
+++ b/src/locales/oj/v2/unit-2.adoc
@@ -0,0 +1,6 @@
+[[unit2]]
+== Unit 2: Loops, Effects, Mixing
+
+:nofooter:
+
+In this unit you will learn about for loops, which allow you to repeat code instructions efficiently. We'll also go over sound effects and envelopes - the evolution of effects over time. Finally, you learn about mixing your tracks and using conditionals.
\ No newline at end of file
diff --git a/src/locales/oj/v2/unit-3.adoc b/src/locales/oj/v2/unit-3.adoc
new file mode 100644
index 000000000..9f3f26d37
--- /dev/null
+++ b/src/locales/oj/v2/unit-3.adoc
@@ -0,0 +1,8 @@
+[[unit3]]
+== Unit 3: Structure your Songs
+
+:nofooter:
+
+Now that you have many tools to create your song, add effects and mix your tracks, we will be looking at the song's structure. We'll be using custom functions for that: these are functions that you will create yourself!
+
+We will also look at user inputs and how they can be embedded in your code to create personalize songs. Finally, we'll see how you can use data structures to simplify your code.
\ No newline at end of file
diff --git a/src/locales/oj/v2/welcome.adoc b/src/locales/oj/v2/welcome.adoc
new file mode 100644
index 000000000..f89bcfba2
--- /dev/null
+++ b/src/locales/oj/v2/welcome.adoc
@@ -0,0 +1,26 @@
+[[welcome]]
+== Welcome Students and Teachers!
+
+:nofooter:
+
+Welcome to EarSketch!
+
+*Teachers*: View our https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[new curriculum guide^], and visit our https://www.teachers.earsketch.org[EarSketch Teacher Site^] for additional resources.
+
+*Students*: Continue below to learn more about EarSketch
+
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
+
+[role="curriculum-mp4"]
+[[video0]]
+video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
+
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+Maybe you'll become a legendary music producer or the industry's most sought-after recording engineer! We wish you good luck on your EarSketch journey.
+
+Click on the right arrow at the top of this text to get started.
+
+Teachers, get access to free teacher materials and community https://www.teachers.earsketch.org/[here^]!
\ No newline at end of file
diff --git a/src/locales/oj/v2/your-first-song.adoc b/src/locales/oj/v2/your-first-song.adoc
new file mode 100644
index 000000000..4e9f6aa2f
--- /dev/null
+++ b/src/locales/oj/v2/your-first-song.adoc
@@ -0,0 +1,290 @@
+[[customizeyourfirstsong]]
+== Customize your first song
+
+:nofooter:
+
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
+
+[[settempo]]
+=== The `setTempo()` function
+
+[role="curriculum-python"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. the `from earsketch import*` line, which adds the EarSketch functions (like `fitMedia()`) to the project
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+[role="curriculum-javascript"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `//`: we'll cover that in next section
+. the `setTempo(120)` function, which we will see in detail below
+--
+
+The `setTempo()` function will determine the speed of your song. The *tempo* is a number of beats per minute (bpm) in Western music. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. To change the tempo, just change the number between the parentheses of the `setTempo()` function. The higher the tempo, the faster your music. You can select a tempo between _45bpm and 220bpm_.
+
+.PRACTICE
+****
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
+****
+
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
+
+[cols="^3*"]
+|===
+|GENRE |BPM |EXAMPLE
+
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
+|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
+|===
+
+.PRACTICE
+****
+. Select one artist you really like and find out what genre they belong to.
+. Search that genre (on https://soundcloud.com/[Soundcloud] or something similar) and listen to a few snippets of songs in that genre.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
+****
+
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
+
+[[comments]]
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
+
+[role="curriculum-python"]
+In Python, comments are indicated by a line starting with a pound `#` symbol.
+
+[role="curriculum-javascript"]
+In JavaScript, comments are indicated by a line starting with two forward slashes, `//`.
+
+.PRACTICE
+****
+In your current script, write a comment with a description of your song on the first line.
+****
+
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/your-first-song-comments.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/your-first-song-comments.js.txt[]
+----
+
+{nbsp} +
+
+[[uploadingsounds]]
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
+
+You must be logged in to upload sounds.
+
+Let's explore the first three options.
+
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
+
+[role="curriculum-mp4"]
+[[video101rec]]
+video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
+
+.PRACTICE
+****
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. It can be a feeling that you'd like to share, or a story.
+
+. Think about what you'd like to express
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
+****
+
+An active computer program is called a *process*.
+
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
+
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
+
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Secondary storage* holds high volumes of data for long periods of time, even after a computer is shut down. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
+
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Inputs* are the signals or data received by the computer, like audio from a microphone. Likewise, *outputs* are the signals or data sent from it, like audio through a speaker. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
+
+Let's examine recording a sound into EarSketch as an example process. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. The EarSketch server saves the sound file from memory to the server's secondary storage so that you can access it in the future.
+
+Check out the following supplementary video:
+
+[role="curriculum-mp4"]
+[[video11cpu]]
+video::./videoMedia/010-02-ProcessesandMemory-PY-JS.mp4[]
+
+////
+END OF OPTIONAL
+////
+
+[[copyright]]
+=== Use Copyright Wisely
+
+*Copyright* is the part of law that covers *intellectual property*, or ownership of creative work, like music. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
+
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
+
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
+
+*Copyright infringement* is a violation of copyright, like illegally downloading music. In the United States, *fair use* allows for use of copyrighted content under certain conditions, like educational or critical purposes, reusing only small amounts of the work. Fair use disputes are determined by a judge on a case-by-case basis.
+
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
+
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
+
+[[chapter2summary]]
+=== Chapter 2 Summary
+
+[role="curriculum-python"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` adds the EarSketch API to your project.
+* `setTempo()` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[role="curriculum-javascript"]
+* *Tempo* is the speed at which a piece of music is played, specified in beats per minute (bpm). Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` lets you specify the tempo of your song. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Processing is carried out by a computer's *CPU*, which is responsible for executing program instructions.
+* *Memory* (a.k.a RAM or primary storage) holds data and processing instructions temporarily for the CPU to use.
+* *Secondary storage* refers to long term storage of data, often in high volumes. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. It is important to musicians because it defines how another person's work can be used and shared.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* *Licensing* a piece of music gives others permission to use it.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does `setTempo()` allow you to do in EarSketch?
+
+[answers]
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
+--
+
+[question]
+--
+What is the unit for tempo?
+
+[answers]
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
+--
+
+[question]
+--
+What can you use comments for?
+
+[answers]
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
+--
+
+[question]
+--
+Which of the following statements is true?
+
+[answers]
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
+--
+
+[question]
+--
+How do you get a copyright?
+
+[answers]
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
+--
+
+[question]
+--
+What is a music license?
+
+[answers]
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
new file mode 100644
index 000000000..412cab2d2
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-import-error-correction.py.txt
@@ -0,0 +1 @@
+from earsketch import *
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-import-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
new file mode 100644
index 000000000..4e2425894
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-import-error.py.txt
@@ -0,0 +1 @@
+from EarSketch import *
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
new file mode 100644
index 000000000..c84f11033
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt
@@ -0,0 +1,6 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
new file mode 100644
index 000000000..9bbd2af9d
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-indentation-error.py.txt
@@ -0,0 +1,5 @@
+for measure in range(1, 9, 2):
+ fitMedia(melody, 1, measure, measure + 2)
+ makeBeat(kick, 2, measure, beatString)
+ makeBeat(kick, 2, measure + 1, beatString)
+fitMedia(beat, 3, 3, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
new file mode 100644
index 000000000..0a5d0a535
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error-correction.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Correction
+
+setTempo(100);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[0], 1, 1, 17);
+fitMedia(orch[1], 2, 5, 17);
+fitMedia(orch[2], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
new file mode 100644
index 000000000..c8fa82e5f
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error-correction.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Correction
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[0], 1, 1, 17)
+fitMedia(orch[1], 2, 5, 17)
+fitMedia(orch[2], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
new file mode 100644
index 000000000..a97c585a3
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error.js.txt
@@ -0,0 +1,9 @@
+// Index Error: Example
+
+setTempo(120);
+
+var orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2];
+
+fitMedia(orch[1], 1, 1, 17);
+fitMedia(orch[2], 2, 5, 17);
+fitMedia(orch[3], 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
new file mode 100644
index 000000000..8492954ac
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-index-error.py.txt
@@ -0,0 +1,10 @@
+# Index Error: Example
+
+from earsketch import *
+setTempo(100)
+
+orch = [Y18_STRINGS_2_3, HIPHOP_DUSTYGROOVE_002, Y41_STRINGS_2]
+
+fitMedia(orch[1], 1, 1, 17)
+fitMedia(orch[2], 2, 5, 17)
+fitMedia(orch[3], 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
new file mode 100644
index 000000000..5c3185d74
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-name-error-correction.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + today)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-name-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
new file mode 100644
index 000000000..a90629268
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-name-error.py.txt
@@ -0,0 +1,7 @@
+# Name Error: Example
+
+from earsketch import *
+setTempo(120)
+
+today = readInput("What day is it?")
+print("Today is " + Today)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
new file mode 100644
index 000000000..4d7a23277
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-parse-error-correction.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Correction
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder)
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
new file mode 100644
index 000000000..d922ac0a4
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-parse-error.py.txt
@@ -0,0 +1,17 @@
+# Parse Error: Example
+
+from earsketch import *
+setTempo(98)
+
+soundFolder = HIP_HOP_98_BPM__HHDUSTYGROOVE
+
+chords1 = RD_WORLD_PERCUSSION_PAN_FLUTE_1
+chords2 = RD_WORLD_PERCUSSION_PAN_FLUTE_2
+
+fitMedia(chords1, 1, 1, 9)
+fitMedia(chords2, 1, 9, 17)
+
+for measure in range(1, 17, 2):
+ # select a random clip with EarSketch API function
+ beat = selectRandomFile(soundFolder
+ fitMedia(beat, 2, measure, measure + 2)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
new file mode 100644
index 000000000..924483c6a
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-range-error-correction.js.txt
@@ -0,0 +1,8 @@
+// Range error: Correction
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "0+2+0+110+1+0+13";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-range-error.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
new file mode 100644
index 000000000..1f315a54d
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-range-error.js.txt
@@ -0,0 +1,8 @@
+// Range Error: Example
+
+setTempo(120);
+
+var drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001];
+var beatString = "1+3+1+221+2+1+24";
+
+makeBeat(drumKit, 1, 1, beatString);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
new file mode 100644
index 000000000..f2bdc12d4
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-reference-error-correction.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Correction
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + today);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
new file mode 100644
index 000000000..1aa333dec
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-reference-error.js.txt
@@ -0,0 +1,6 @@
+// Reference Error: Example
+
+setTempo(120);
+
+var today = readInput("What day is it?");
+println("Today is " + Today);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
new file mode 100644
index 000000000..e0539d0c7
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Correction
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++) {
+ if (measure % 4 === 0) {
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
new file mode 100644
index 000000000..12151b9ae
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 == 0:
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
new file mode 100644
index 000000000..253aa7318
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error.js.txt
@@ -0,0 +1,14 @@
+// Syntax Error: Example
+
+setTempo(120);
+
+var clap = RD_TRAP_ARCADEFIRESFX_1;
+var beatString = "00+-0-00+0+-0+++";
+
+for (var measure = 1; measure < 32; measure++){
+ if (measure % 4 = 0)
+ // Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString);
+ }
+ makeBeat(clap, 1, measure, beatString);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
new file mode 100644
index 000000000..9171d92d6
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-syntax-error.py.txt
@@ -0,0 +1,13 @@
+# Syntax Error: Example
+
+from earsketch import *
+setTempo(120)
+
+clap = RD_TRAP_ARCADEFIRESFX_1
+beatString = "00+-0-00+0+-0+++"
+
+for measure in range(1, 32):
+ if measure % 4 = 0
+ # Use EarSketch API function to shuffle beat string
+ beatString = shuffleString(beatString)
+ makeBeat(clap, 1, measure, beatString)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
new file mode 100644
index 000000000..cfed47a26
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error-correction.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Correction
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, Number(measureTotal) + 1);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
new file mode 100644
index 000000000..b1431d922
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error-correction.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Correction
+
+from earsketch import *
+setTempo(120)
+
+soundClips = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClips, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + str(measureTotal) + " measures long.")
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error.js.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
new file mode 100644
index 000000000..120fdad67
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error.js.txt
@@ -0,0 +1,10 @@
+// Type Error: Example
+
+setTempo(120);
+
+var soundClip = DUBSTEP_DRUMLOOP_MAIN_006;
+var measureTotal = readInput("How many measures?");
+
+println(measureTotal);
+
+fitMedia(soundClip, 1, 1, measureTotal + 1);
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
new file mode 100644
index 000000000..e135814d9
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-type-error.py.txt
@@ -0,0 +1,14 @@
+# Type Error: Example
+
+from earsketch import *
+setTempo(120)
+
+soundClip = DUBSTEP_DRUMLOOP_MAIN_006
+beatString = "0+000+++0--0-0--"
+measureTotal = 0
+
+for measure in range(1, 9):
+ makeBeat(soundClip, 1, measure, beatString)
+ measureTotal += 1
+
+print("Your beat is " + measureTotal + " measures long.")
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
new file mode 100644
index 000000000..67a6b74d9
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-value-error-correction.py.txt
@@ -0,0 +1,9 @@
+# Value error: Correction
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "0+2+0+110+1+0+13"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/uz/v1/code-examples/every-error-explained-in-detail-value-error.py.txt b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
new file mode 100644
index 000000000..a3da72325
--- /dev/null
+++ b/src/locales/uz/v1/code-examples/every-error-explained-in-detail-value-error.py.txt
@@ -0,0 +1,9 @@
+# Value Error: Example
+
+from earsketch import *
+setTempo(120)
+
+drumKit = [OS_KICK06, RD_UK_HOUSE_SOLODRUMPART_15, OS_COWBELL01, TECHNO_ACIDBASS_001]
+beatString = "1+3+1+221+2+1+24"
+
+makeBeat(drumKit, 1, 1, beatString)
\ No newline at end of file
diff --git a/src/locales/uz/v1/every-effect-explained-in-detail.adoc b/src/locales/uz/v1/every-effect-explained-in-detail.adoc
new file mode 100644
index 000000000..f52da48f9
--- /dev/null
+++ b/src/locales/uz/v1/every-effect-explained-in-detail.adoc
@@ -0,0 +1,720 @@
+[[ch_28]]
+== Every Effect Explained in Detail
+
+:nofooter:
+
+[[bandpass]]
+=== BANDPASS
+
+++++
+
+ With Effect:
+ audioMedia/bandpass_wet.mp3
+ Without Effect:
+ audioMedia/bandpass_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000)
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9)
+setEffect(1, BANDPASS, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, BANDPASS, BANDPASS_FREQ, 1000);
+setEffect(1, BANDPASS, BANDPASS_RESONANCE, 0.9);
+setEffect(1, BANDPASS, MIX, 1);
+----
+
+`BANDPASS` is a filter that only lets through (passes) an adjustable window (band) of frequencies. All other frequencies are suppressed. By creating a narrower band of frequencies (setting `BANDPASS_RESONANCE` closer to 1), you can make a telephone or megaphone-like sound. By creating a wider band of frequencies (setting `BANDPASS_RESONANCE` closer to 0), you can make sounds that seem overpowering blend better with other sounds in the mix.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|BANDPASS_FREQ |The center frequency (in Hz) of the window of frequencies to pass through. |800.0 |20.0 |20000.0
+
+|BANDPASS_RESONANCE |The boost of frequncies around the BANDPASS_FREQ level. Higher values of resonance strongly boost a small window (band)of frequencies, while lower values of resonance subtly boost a larger window (band). |0.5 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.1 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[chorus]]
+=== CHORUS
+
+++++
+
+ With Effect:
+ audioMedia/chorus_wet.mp3
+ Without Effect:
+ audioMedia/chorus_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, CHORUS, CHORUS_LENGTH, 15)
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1)
+setEffect(1, CHORUS, CHORUS_RATE, 10)
+setEffect(1, CHORUS, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, CHORUS, CHORUS_LENGTH, 15);
+setEffect(1, CHORUS, CHORUS_NUMVOICES, 1);
+setEffect(1, CHORUS, CHORUS_RATE, 10);
+setEffect(1, CHORUS, MIX, 0.5);
+----
+
+`CHORUS` creates a subtle ensemble-like effect by making various copies of the sound, changing them slightly in pitch, and mixing them back into the sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|CHORUS_LENGTH |The length of time (in ms) from the original sound within which the chorus effect is activated. |15.0 |1.0 |250.0
+
+|CHORUS_NUMVOICES |The number of copies of the original sound that is used. Larger values create a bigger ensemble-like effect. |1.0 |1.0 |8.0
+
+|CHORUS_RATE |The rate (in Hz) which the pitch cycles or "wobbles" at. Lower values create smoothly-cycling sounds, while higher values create more wobbly-sounding effects. |0.5 |0.1 |16.0
+
+|CHORUS_MOD |The depth of the pitch wobbling (i.e. how much pitch cycling is used). Low settings create a more natural sound, while higher settings create a more artificial-like sound. |0.7 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[compressor]]
+=== COMPRESSOR
+
+++++
+
+ With Effect:
+ audioMedia/compressor_wet.mp3
+ Without Effect:
+ audioMedia/compressor_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30)
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, COMPRESSOR, COMPRESSOR_THRESHOLD, -30);
+setEffect(1, COMPRESSOR, COMPRESSOR_RATIO, 100);
+----
+
+`COMPRESSOR` reduces the volume of the loudest sections of a sound and amplifies the quietest sections. This creates a smaller dynamic range, which means that the volume of the track stays more constant throughout. Music producers often use compressors to fine-tune and add “punch” to drums.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|COMPRESSOR_THRESHOLD |The amplitude (volume) level (in dB) above which the compressor starts to reduce volume. |-18.0 |-30.0 |0.0
+
+|COMPRESSOR_RATIO |The amount of specified gain reduction. A ratio of 3:1 means that if the original sound is 3 dB over the threshold, then the affected sound will be 1 dB over the threshold. |10.0 |1.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[delay]]
+=== DELAY
+
+++++
+
+ With Effect:
+ audioMedia/delay_wet.mp3
+ Without Effect:
+ audioMedia/delay_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3)
+setEffect(1, DELAY, DELAY_TIME, 370)
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5)
+setEffect(1, DELAY, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 3);
+setEffect(1, DELAY, DELAY_TIME, 370);
+setEffect(1, DELAY, DELAY_FEEDBACK, -3.5);
+setEffect(1, DELAY, MIX, 1);
+----
+
+`DELAY` creates a repeated echo of the original sound. It does this by playing the original sound as well as a delayed, quieter version of the original. After this first echo, it plays an echo of the echo (quieter than the first), then an echo of the echo of the echo (even quieter), and so on. If you set the time between each echo (`DELAY_TIME`) to the length of a beat, you can create an interesting rhythmic effect.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DELAY_TIME |The time amount in milliseconds (ms) that the original track is delayed, and the time between successive repeats of the delay. |300.0 |0.0 |4000.0
+
+|DELAY_FEEDBACK |The relative amount of repeats that the delay generates. Higher values create more "echoes". Be careful of applying "too much" feedback! |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.5 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[distortion]]
+=== DISTORTION
+
+++++
+
+ With Effect:
+ audioMedia/distortion_wet.mp3
+ Without Effect:
+ audioMedia/distortion_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, DISTORTION, DISTO_GAIN, 27)
+setEffect(1, DISTORTION, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, DISTORTION, DISTO_GAIN, 27);
+setEffect(1, DISTORTION, MIX, 1);
+----
+
+`DISTORTION` adds a dirty, fuzzy, and gritty effect to a sound by overdriving it, which clips the sound wave and adds overtones (higher frequencies related to the original sound). `DISTORTION` is commonly used on electric guitars in rock and grunge music, but you can use it for many different sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|DISTO_GAIN |The amount of overdrive of the original sound. |20.0 |0.0 |50.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[eq3band]]
+=== EQ3BAND
+
+++++
+
+ With Effect:
+ audioMedia/eq3band_wet.mp3
+ Without Effect:
+ audioMedia/eq3band_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15)
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15)
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000)
+setEffect(1, EQ3BAND, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, EQ3BAND, EQ3BAND_LOWGAIN, -15);
+setEffect(1, EQ3BAND, EQ3BAND_MIDGAIN, -5);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHGAIN, 15);
+setEffect(1, EQ3BAND, EQ3BAND_HIGHFREQ, 2000);
+setEffect(1, EQ3BAND, MIX, 1);
+----
+
+`EQ3BAND` is a three-band equalizer, which is a tool used to adjust the volume of three separate frequency ranges in an audio track: bass, midrange, and treble (low, mid, high). EQ is used in music production to get rid of unwanted frequencies, create balance between tracks to get a radio-ready mix, or simply change the "vibe" of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|EQ3BAND_LOWGAIN |The gain (in dB) of the low range of frequencies of the EQ. Negative values lower the volume of the low frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_LOWFREQ |Specifies the highest frequency (in Hz) of the low range. |200.0 |20.0 |20000.0
+
+|EQ3BAND_MIDGAIN |The gain (in dB) of the mid range of frequencies of the EQ. Negative values lower the volume of the mid frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_MIDFREQ |Specifies the center frequency (in Hz) of the mid range. |2000.0 |20.0 |20000.0
+
+|EQ3BAND_HIGHGAIN |The gain (in dB) of the high range of frequencies of the EQ. Negative values lower the volume of the high frequencies, while positive values boost them. |0.0 |-24.0 |18.0
+
+|EQ3BAND_HIGHFREQ |Specifies the cutoff frequency (in Hz) of the high range. |2000.0 |20.0 |20000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[filter]]
+=== FILTER
+
+++++
+
+ With Effect:
+ audioMedia/filter_wet.mp3
+ Without Effect:
+ audioMedia/filter_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3)
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9)
+setEffect(1, FILTER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, FILTER, FILTER_FREQ, 20, 1, 4000, 3);
+setEffect(1, FILTER, FILTER_RESONANCE, 0.9);
+setEffect(1, FILTER, MIX, 1);
+----
+
+`FILTER` can soften, darken, or add depth to sound. It does this by applying a low-pass filter which lowers the volume of high frequencies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FILTER_FREQ |The cutoff frequency (Hz), which means that all frequencies higher than this value are rolled-off (become lower and lower in volume the higher they are from this value). |1000.0 |20.0 |20000.0
+
+|FILTER_RESONANCE |The boost of frequencies near the FILTER_FREQ level. Higher values of resonance strongly boost a small window of frequencies near the FILTER_FREQ, creating a sharper, more ringing sound around those frequencies, while lower values of resonance subtly boost a larger window. |0.8 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[flanger]]
+=== FLANGER
+
+++++
+
+ With Effect:
+ audioMedia/flanger_wet.mp3
+ Without Effect:
+ audioMedia/flanger_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, FLANGER, FLANGER_LENGTH, 10)
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5)
+setEffect(1, FLANGER, FLANGER_RATE, 20)
+setEffect(1, FLANGER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, FLANGER, FLANGER_LENGTH, 10);
+setEffect(1, FLANGER, FLANGER_FEEDBACK, -5);
+setEffect(1, FLANGER, FLANGER_RATE, 20);
+setEffect(1, FLANGER, MIX, 1);
+----
+
+`FLANGER` creates a "whoosh"-like effect by making various copies of the sound, adjusting their delay time very slightly, and then mixing them back into the original sound. At extreme values of parameter settings, `FLANGER` produces more artificial and "robot-like" sounds.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|FLANGER_LENGTH |The length of delay time (in ms) from the original sound within which the flanger effect is activated. |6.0 |0.0 |200.0
+
+|FLANGER_FEEDBACK |The amount (in dB) that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-50.0 |-80.0 |-1.0
+
+|FLANGER_RATE |The rate (in Hz) which the pitch cycles or "whooshes" at. Lower values create more smoothly-cycling sounds, while higher values create more whooshing-sounding effects and sonic artifacts. |0.6 |0.001 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pan]]
+=== PAN
+
+++++
+
+ With Effect:
+ audioMedia/pan_wet.mp3
+ Without Effect:
+ audioMedia/pan_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PAN, LEFT_RIGHT, -100, 1.5, 100, 2.5);
+----
+
+`PAN` affects the mix between the left and right audio channels. If you are wearing headphones, adjusting `PAN` changes how much of the sound you hear in your left ear versus the right.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|LEFT_RIGHT |Specifies the left/right location of the original sound within the stereo field (0.0 is center, -100.0 is fully left, 100.0 is fully right). |0.0 |-100.0 |100.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[phaser]]
+=== PHASER
+
+++++
+
+ With Effect:
+ audioMedia/phaser_wet.mp3
+ Without Effect:
+ audioMedia/phaser_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, PHASER, PHASER_RATE, 0.7)
+setEffect(1, PHASER, PHASER_RANGEMIN, 440)
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600)
+setEffect(1, PHASER, PHASER_FEEDBACK, -2)
+setEffect(1, PHASER, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, PHASER, PHASER_RATE, 0.7);
+setEffect(1, PHASER, PHASER_RANGEMIN, 440);
+setEffect(1, PHASER, PHASER_RANGEMIN, 1600);
+setEffect(1, PHASER, PHASER_FEEDBACK, -2);
+setEffect(1, PHASER, MIX, 1);
+----
+
+`PHASER` creates a sweeping-sounding effect by making a copy of the original sound, delaying it slightly, and playing it against the original. When this happens, some of the frequencies in the original sound and the copy temporarily cancel each other out by going "in and out of phase" with each other.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PHASER_RATE |The rate (in Hz) that the slight delay time changes back and forth. Lower values create more smoothly-cycling sounds, while higher values create more robotic-sounding effects and sonic artifacts. |0.5 |0.0 |10.0
+
+|PHASER_RANGEMIN |The low value (in Hz) of the affected frequency range. |440.0 |40.0 |20000.0
+
+|PHASER_RANGEMAX |The high value (in Hz) of the affected frequency range. |1600.0 |40.0 |20000.0
+
+|PHASER_FEEDBACK |The amount that the affected sound is "fed back" into the effect. Higher values create more artificial-like sounds. |-3.0 |-120.0 |-1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[pitchshift]]
+=== PITCHSHIFT
+
+++++
+
+ With Effect:
+ audioMedia/pitchshift_wet.mp3
+ Without Effect:
+ audioMedia/pitchshift_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, PITCHSHIFT, PITCHSHIFT_SHIFT, -10);
+----
+
+`PITCHSHIFT` raises or lowers the pitch of a sound. It can be helpful for making multiple tracks sound better together.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|PITCHSHIFT_SHIFT |Specifies the amount to adjust the pitch of the original sound in semitones (and fractions of a semitone, given by values after the decimal point). 12 semitones equal 1 octave. |0.0 |-12.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[reverb]]
+=== REVERB
+
+++++
+
+ With Effect:
+ audioMedia/reverb_wet.mp3
+ Without Effect:
+ audioMedia/reverb_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, REVERB, REVERB_TIME, 2000)
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000)
+setEffect(1, REVERB, MIX, 0.5)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, REVERB, REVERB_TIME, 2000);
+setEffect(1, REVERB, REVERB_DAMPFREQ, 18000);
+setEffect(1, REVERB, MIX, 0.5);
+----
+
+`REVERB` adds a slowly decaying ambience to a sound, making it sound denser, dreamier, or as if it was recorded in a smaller or larger room than it actually was.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|REVERB_TIME |The decaying time of the ambiance in milliseconds (ms). When modulating REVERB_TIME over time using automation curve, due to the nature of convolution-based reverb, the value is updated only at every quarter note (time=0.25) in a "stair-case" manner from the starting point of the automation. (You will, however, hardly notice that.) |1500.0 |100.0 |4000.0
+
+|REVERB_DAMPFREQ |The cutoff frequency (in Hz) of the lowpass filter applied to the ambiance. The lower the value, the darker the reverberation will sound. |10000.0 |200.0 |18000.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |0.3 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[ringmod]]
+=== RINGMOD
+
+++++
+
+ With Effect:
+ audioMedia/ringmod_wet.mp3
+ Without Effect:
+ audioMedia/ringmod_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+ffitMedia(YG_TECHNO_VOX_2, 1, 1, 2)
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100)
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80)
+setEffect(1, RINGMOD, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(YG_TECHNO_VOX_2, 1, 1, 2);
+setEffect(1, RINGMOD, RINGMOD_MODFREQ, 100);
+setEffect(1, RINGMOD, RINGMOD_FEEDBACK, 80);
+setEffect(1, RINGMOD, MIX, 1);
+----
+
+`RINGMOD` creates many different artificial-sounding effects by multiplying the signals from the original and a pure sine wave (which sounds like a tuning fork). Some parameter settings will produce effects similar to ones used in old science fiction movies.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|RINGMOD_MODFREQ |The frequency (in Hz) of the sine wave oscillator that is being multiplied into your original sound. |40.0 |0.0 |100.0
+
+|RINGMOD_FEEDBACK |The amount of affected sound that is fed-back into the effect. High values create more robotic-type sounds and sonic artifacts. |0.0 |0.0 |100.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[tremolo]]
+=== TREMOLO
+
+++++
+
+ With Effect:
+ audioMedia/tremolo_wet.mp3
+ Without Effect:
+ audioMedia/tremolo_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5)
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10)
+setEffect(1, TREMOLO, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, TREMOLO, TREMOLO_FREQ, 7.5);
+setEffect(1, TREMOLO, TREMOLO_AMOUNT, -10);
+setEffect(1, TREMOLO, MIX, 1);
+----
+
+`TREMOLO` produces a wobbly-sounding effect by quickly changing the volume of the sound back and forth.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|TREMOLO_FREQ |The rate (in Hz) that the volume is changed back and forth. |4.0 |0.0 |100.0
+
+|TREMOLO_AMOUNT |The amount (in dB) that the volume changes back and forth over during each cycle. |-6.0 |-60.0 |0.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[volume]]
+=== VOLUME
+
+++++
+
+ With Effect:
+ audioMedia/volume_wet.mp3
+ Without Effect:
+ audioMedia/volume_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3)
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(EIGHT_BIT_ANALOG_DRUM_LOOP_001, 1, 1, 3);
+setEffect(1, VOLUME, GAIN, -55, 1, 0, 3);
+----
+
+`VOLUME` allows you to change the loudness of a sound.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|GAIN |Specifies the output volume level of the original sound. |0.0 |-60.0 |12.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
+
+[[wah]]
+=== WAH
+
+++++
+
+ With Effect:
+ audioMedia/wah_wet.mp3
+ Without Effect:
+ audioMedia/wah_dry.mp3
+
+++++
+
+[role="curriculum-python"]
+[source,python]
+----
+from earsketch import *
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3)
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2)
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3)
+setEffect(1, WAH, MIX, 1)
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+fitMedia(RD_UK_HOUSE_ACOUSTICGUITAR_1, 1, 1, 3);
+setEffect(1, WAH, WAH_POSITION, 0, 1, 0.5, 2);
+setEffect(1, WAH, WAH_POSITION, 0, 2, 0.5, 3);
+setEffect(1, WAH, MIX, 1);
+----
+
+`WAH` can make the sound mimic someone saying "Wah Wah" when the `WAH_POSITION` parameter is changed over time using the setEffect() function. It is a resonant bandpass filter, which means it lowers the volume of high and low frequencies while boosting a narrow window of frequencies in the middle.
+
+|===
+|Parameter |Description |Default Value |minValue |maxValue
+
+|WAH_POSITION |The center frequency of the boosted fixed-width frequency range. |0.0 |0.0 |1.0
+
+|MIX |The amount of the sound effect that is mixed into the original sound. At the minimum value 0.0, it only plays the original ("dry") audio. At the maximum value 1.0, it only plays the affected ("wet") audio. |1.0 |0.0 |1.0
+
+|BYPASS |When you bypass an effect, the effect turns off. The only valid values for `BYPASS` are 1.0 (to turn the effect off) and 0.0 (to keep the effect on). |0.0 |0.0 |1.0
+|===
\ No newline at end of file
diff --git a/src/locales/uz/v1/every-error-explained-in-detail.adoc b/src/locales/uz/v1/every-error-explained-in-detail.adoc
new file mode 100644
index 000000000..17ee01de1
--- /dev/null
+++ b/src/locales/uz/v1/every-error-explained-in-detail.adoc
@@ -0,0 +1,396 @@
+[[ch_29]]
+== Every Error Explained in Detail
+
+:nofooter:
+
+[[othererrors]]
+=== Overview
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. Dasturlashda kodlash xatoliklari *xatolar* yoki *nosozliklar* deb ataladi.
+
+Xatolarni topish va tuzatish jarayoni *Nosozliklarni tuzatish* deb ataladi.
+
+Check the console for details and the line number. In some cases you may need to fix _the preceding line_ to resolve the error.
+
+Guidance on addressing the most common errors is given in the next sections.
+
+[role="curriculum-python"]
+See the official https://docs.python.org/3/library/exceptions.html#concrete-exceptions[Python documentation^] for a full list of errors.
+
+[role="curriculum-javascript"]
+See Mozilla's https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors[JavaScript documentation^] for a full list of errors.
+
+[[modulenotfounderror]]
+=== ModuleNotFoundError
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* ModuleNotFoundError: No module named 'missing_module_name'
+
+[role="curriculum-python"]
+*Description:* A ModuleNotFoundError occurs when a program fails to load the module given in a `from...import` statement, like `from module import *`. This could be due to a misspelling, or maybe the module to be imported does not exist.
+
+[role="curriculum-python"]
+*Example:* Although the snippet below shows the word "EarSketch" with its usual styling, Python modules are specified in all lowercase.
+
+////
+Can't turn off pasted without this appearing in JS mode.
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error.py.txt[]
+----
+
+[role="curriculum-python"]
+Instead, our statement should read:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-import-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check your `from...import` statements at the top of your script for typos and letter case.
+
+[role="curriculum-javascript"]
+ModuleNotFoundErrors do not occur in JavaScript. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indentationerror]]
+=== Indentation Error
+
+//Python only
+
+[role="curriculum-python"]
+*Console message:* IndentationError: There is an indentation error in the code (lack of or extra spaces).
+
+[role="curriculum-python"]
+*Description:* Recall that proper indentation is needed in Python when using loops, functions, and conditional statements - any statement that ends with a colon (`:`). An indentation error is thrown when an incorrect amount of indentation is used, either not enough or too much.
+
+[role="curriculum-python"]
+*Example:* The EarSketch Code Editor automatically indents lines of code following a colon, but the programmer may accidentally change indentation manually, perhaps when making changes to a body of code. In the snippet below, it is unclear which lines should fall within the loop, both to user and the interpreter.
+
+////
+Can't turn off pasting without this appearing in JS mode
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error.py.txt[]
+----
+
+[role="curriculum-python"]
+A properly indented body should instead look like the snippet below. The for-loop body is indented by one tab and it is clear that the last `fitMedia()` call is outside the loop.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-indentation-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Try deleting all the spaces in front of the code in the body so each line is against the left edge of the code editor. Then, indent the body line by line, ensuring that all indentation is constant.
+
+[role="curriculum-javascript"]
+Indentation errors do not occur in JavaScript, though you should still use proper indentation for readability. Open a Python script for an explanation of this error type, or move on to <>.
+
+[[indexerror]]
+=== Index Error
+
+[role="curriculum-python"]
+*Console message:* IndexError: There is an error using an out of range index.
+
+[role="curriculum-javascript"]
+*Console message:* TypeError: There is an error using an out of range index.
+
+[role="curriculum-python"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within a list or string.
+
+[role="curriculum-javascript"]
+*Description:* An index error is thrown when trying to access an index that is out of range or does not exist within an array or string. It is thrown as a type error in JavaScript. For an explanation of more general type errors, see the section on <>.
+
+[role="curriculum-python"]
+*Example:* In the following code, we attempt to create an additive structure using clips from a list.
+
+[role="curriculum-javascript"]
+*Example:* In the following code, we attempt to create an additive structure using clips from an array.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error.js.txt[]
+----
+
+[role="curriculum-python"]
+An Index Error is thrown and the console points us to line 19, stating the index is out of range. We have three sound clips, but we forgot that list indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-javascript"]
+A Type Error is thrown and the console states that a different data type was expected on line 17. An out of range value was provided to the last `fitMedia()` call. We have three sound clips, but we forgot that array indices start at 0, so the last index we should be accessing is index 2:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-index-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Write down the name of each clip in your list and label each with its associated index, starting at 0. This helps you understand the structure of the list and what may be causing an index error.
+
+[role="curriculum-javascript"]
+*Solution:* Write down the name of each clip in your array and label each with its associated index, starting at 0. This helps you understand the structure of the array and what may be causing an index error.
+
+[[nameerror]]
+=== Name Error
+
+[role="curriculum-python"]
+*Console message:* NameError: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-javascript"]
+*Console message:* Reference Error: There is an error with a variable or function name that is not defined.
+
+[role="curriculum-python"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo.
+
+Often there is a missing `from earsketch import *` statement at the top of the script.
+
+[role="curriculum-javascript"]
+*Description:* A name error occurs when a program tries to use a variable or call a function that was never defined, most often due to a typo. JavaScript specifically refers to this type of error as a reference error.
+
+[role="curriculum-python"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake with the print statement prevents the script from running.
+
+[role="curriculum-javascript"]
+*Example:* Below is a simple script to print the string assigned to the `today` variable. However, a mistake within the `println()` function prevents the script from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error.js.txt[]
+----
+
+In this case, the variable containing the string to be concatenated was not referred to by the correct name; a lowercase "t" should have been used.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-name-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-reference-error-correction.js.txt[]
+----
+
+*Solution:* Check the spelling and case of your variables and functions. When using a variable or calling a function, make sure each has been defined previously. Make sure you define a function before it is called. Although you can paste the names in directly, ensure your sound constant names align with the clip names in the Sound Browser.
+
+[[parseerror]]
+=== Parse Error
+
+[role="curriculum-python"]
+*Console message:* ParseError: There is an error when reading the code.
+
+[role="curriculum-python"]
+*Description:* *Parsing* means converting one form of information into another. Therefore, a parse error occurs when the interpreter is unable to convert your code into information that the computer can use to make music. Code formatting, like brackets and parentheses, is often the cause of a parse error.
+
+[role="curriculum-python"]
+*Example:* In the following example, we attempt to have some fun by selecting random beats to play over a melody, but something is preventing the code from running.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error.py.txt[]
+----
+
+////
+The parse error included in the example above breaks AsciiDoc syntax highlighting here for some reason. Same happens in Ch. 3. If removed while editing, the closing parentheses of selectRandomFile() should be omitted.
+////
+
+[role="curriculum-python"]
+Upon running the code, the console points us to line 26. This line looks fine, but the `selectRandomFile()` function in the previous line is missing its closing parentheses. In many cases, parse errors can be fixed quickly.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-parse-error-correction.py.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Check the console for an indication of where the offending line may be. Make sure all function definitions, function calls, and other expressions have opening and closing parentheses. Check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. Finally, check spelling of the arguments you pass to functions.
+
+[role="curriculum-javascript"]
+Parse errors are interpreted broadly as syntax errors in JavaScript, which is covered <>.
+
+[[syntaxerror]]
+=== Syntax Error
+
+*Console message:* SyntaxError: There is an error with the syntax (or arrangement) of code.
+
+*Description:* A syntax error occurs when a program encounters a mistake in the script's syntax, the rules of a particular language.
+
+*Example:* The following script is supposed to create dynamically changing futuristic bleeps. However it contains two common bugs that cause syntax errors.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error.js.txt[]
+----
+
+[role="curriculum-python"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to end our _if_ statement with a colon. On the same line, we also gave an invalid condition; we should be using the equality operator `==` instead of the assignment operator `=`.
+
+[role="curriculum-javascript"]
+For this script, the code editor flags the offending line for us. Notice that we forgot to open our _if_ statement body with a curly brace. On the same line, we also gave an invalid condition; we should be using the strict equality operator `===` instead of the assignment operator `=`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-syntax-error-correction.js.txt[]
+----
+
+[role="curriculum-python"]
+*Solution:* Always check the console and code editor for clues. Beyond the common errors given above, check for opening and closing quotations and make sure you are not using Python keywords as variable names.
+
+////
+Added solution from parse error to JS version below.
+////
+
+[role="curriculum-javascript"]
+*Solution:* Always check the console and code editor for clues.
+Beyond the common errors given above, check for opening and closing quotations and ensure all function definitions, function calls, and other expressions have opening and closing parentheses. Also, check for missing or extra punctuation marks in other areas of your script. Additionally, check for missing function definitions and arguments. You cannot use JavaScript reserved words as variable names. Finally, check spelling of the arguments you pass to functions.
+
+[[typeerror]]
+=== Type Error
+
+*Console message:* TypeError: There is an error with the expected data type.
+
+*Description:* A type error occurs when a particular operation or function is expecting one data type, but receives another.
+
+[role="curriculum-python"]
+*Example:* Suppose you have written a script that keeps track of the total measures used with an updating variable. In the snippet below, we attempt to print a message stating the length of a song.
+
+[role="curriculum-javascript"]
+*Example:* Suppose you have written a script that takes user input to determine the length of the song. The user's value is passed to `fitMedia()`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error.js.txt[]
+----
+
+[role="curriculum-python"]
+A type error is thrown because the number type cannot be concatenated into a string. Instead, we can use data type conversion to first convert the `measureTotal` value into a string:
+
+[role="curriculum-javascript"]
+A type error is thrown because we accidentally passed a string as the last `fitMedia()` argument. Instead, we can use data type conversion to first convert the `measureTotal` string into a number:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-type-error-correction.js.txt[]
+----
+
+*Solution:* The EarSketch console gives the offending data type and points to a specific line number. Check for consistent data types within arithmetic expressions, data structure operations, and function arguments. In addition, make sure your function calls have the correct number of arguments.
+
+////
+(ex. trying to concatenate something into string that isn't string, modifying a string value instead of concatenating something in, function call with too few arguments)
+////
+
+[[valueerror]]
+=== Value Error
+
+[role="curriculum-python"]
+*Console message:* ValueError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-javascript"]
+*Console message:* RangeError: A provided argument is not within the set or range of acceptable values for a function.
+
+[role="curriculum-python"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value.
+
+[role="curriculum-javascript"]
+*Description:* A value error occurs when a function receives an argument of the correct type but inappropriate value. JavaScript specifically refers to this type of error as a range error.
+
+[role="curriculum-python"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with lists.
+
+[role="curriculum-javascript"]
+*Example:* The following snippet attempts to create an interesting beat by using `makeBeat()` with arrays.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error.js.txt[]
+----
+
+[role="curriculum-python"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that list indices start at zero.
+
+[role="curriculum-javascript"]
+`makeBeat()` 's fourth argument is the appropriate type, but one of the index values it must access is invalid. In this scenario, it is likely that the programmer forgot that array indices start at zero.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/every-error-explained-in-detail-value-error-correction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/every-error-explained-in-detail-range-error-correction.js.txt[]
+----
+
+*Solution:* Check your beat strings to ensure values fall within the correct range. Also, confirm any arguments provided to `setEffect()` are within the effect's required range.
\ No newline at end of file
diff --git a/src/locales/uz/v1/the-earSketch-api.adoc b/src/locales/uz/v1/the-earSketch-api.adoc
new file mode 100644
index 000000000..90e09c349
--- /dev/null
+++ b/src/locales/uz/v1/the-earSketch-api.adoc
@@ -0,0 +1,6 @@
+[[ch_27]]
+== The EarSketch API
+
+:nofooter:
+
+link:[Click Here] to open the EarSketch API.
\ No newline at end of file
diff --git a/src/locales/uz/v2/add-beats.adoc b/src/locales/uz/v2/add-beats.adoc
new file mode 100644
index 000000000..a5d17c1a3
--- /dev/null
+++ b/src/locales/uz/v2/add-beats.adoc
@@ -0,0 +1,339 @@
+[[addsomebeats]]
+== Add some Beats!
+
+:nofooter:
+
+In this chapter you will learn how to make your own beats! We'll look at variables, a new function called `makeBeat()`, and beats from different genres.
+
+[[variables]]
+=== Variables
+
+[role="curriculum-python curriculum-mp4"]
+[[video2py]]
+video::./videoMedia/002-05-Variables-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video2js]]
+video::./videoMedia/002-05-Variables-JS.mp4[]
+
+What is a variable? A *variable* is a name given to a piece of data that we plan to use later in our program.
+
+In EarSketch, the variables in your scripts may point to:
+
+* A *number*, like a track number or a measure number
+* A *file*, like an audio file
+* A *string*, like the name of a sound clip or some lyrics
+* A *character*, like `A`, `a`, `2`, or `=`
+
+A *character* can be any number, letter or symbol. A *string* is a series of characters with quotation marks around it, like `"Hello World 123!"`.
+
+To use a variable,
+
+[role="curriculum-python"]
+. Avval uni *tayinlash* kerak. We use the symbol `=`, which is called the *assignment operator*. Writing `synth1 = HIPHOP_SYNTHPLUCKLEAD_005` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Keyin o'zgaruvchini chaqirishingiz kerak: kodingizda `synth1` dan foydalaning. You can only use the variable after it has been assigned, not before. Masalan, `fitMedia(synth1, 1, 1, 3)` deb yozing.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-javascript"]
+. Avval uni *tayinlash* kerak. We use the symbol `=`, which is called the *assignment operator*. Biz satr boshida `var` buyrug'idan ham foydalanamiz. Writing `var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;` means that you create a variable called `synth1` and you store the data `HIPHOP_SYNTHPLUCKLEAD_005` into that variable.
+. `HIPHOP_SYNTHPLUCKLEAD_005` is the *value* of `synth1`.
+. Keyin o'zgaruvchini chaqirishingiz kerak: kodingizda `synth1` dan foydalaning. Masalan, `fitMedia(synth1, 1, 1, 3);` deb yozing.
+. When you run the code, the computer will understand that it must use the sound clip name `HIPHOP_SYNTHPLUCKLEAD_005` when it reads `synth1`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-instead-of-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-instead-of-this.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+In your previous scripts, use variables to store your sound constants. Look at the examples below for help. Make sure that your variables have short and understandable names (like `bass` or `voice_1`).
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-variables.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-variables.js.txt[]
+----
+
+E'tibor bering, o'zgaruvchini tushunarli va tavsiflovchi tarzda nomlash muhim. Misol uchun, hech qanday ma'lumot bermaydigan `music1` yoki `test` o'rniga `synth1` ni belgilang. This way, when you or someone else reads your code, they can see what you are referring to.
+
+*Konstanta* o'zgaruvchiga o'xshaydi, chunki u o'zida qiymatlarni saqlaydi. However, the value of a constant never changes. For example, in EarSketch, `TECHNO_SYNTHPLUCK_001` is a constant, it refers to the corresponding sound constant. By convention, constant names are capitalized and use underscores instead of spaces.
+
+[[drumbeatstrings]]
+=== Beat Strings
+
+Keling, avval ritm haqidagi ba'zi asosiy tushunchalarni bilib olaylik:
+
+* *Rhythm* is a pattern of sound, often repeated.
+* *Temp* - bu musiqaning DZMdagi tezligi (daqiqada zarba miqdori).
+* *Zarba* qo'shiqning "barqaror yurak urishi"ga o'xshaydi. Tomoshabinlar kontsertda qarsak chalsa, bir maromdagi zarbdor qarsak hosil bo'ladi.
+* *O'lchov* - bu oldindan belgilangan zarbalar soniga ega musiqiy vaqt birligi. EarSketch-da 1 *o'lchov* 4 zarba uzunligidadir. 1 oʻlchovda 4 ta zarba boʻlgani uchun zarbalar *chorak (1/4) notalar* deb ham ataladi.
+* Har bir zarba *quyi-zarbalar* ga bo'linishi mumkin. Masalan, 1/4 nota 2 ta *sakkizinchi (1/8) nota*ga boʻlinishi mumkin. 1/4 notalarni sanayotganingizda “1, 2, 3, 4...” deb aytasiz 1/8 notalarni sanayotganda siz "va" dan foydalanishingiz mumkin: "1 va 2 va 3 va 4 va...."
+* 1/8 nota esa 2 ta *o‘n oltinchi (1/16) nota*ga bo‘linishi mumkin. 1/16 notalarni sanayotganda siz "va" ning har bir tomonida "e" va "a" dan foydalanishingiz mumkin: "1 e va a 2 e va a 3 e va a 4 e va a...."
+* 1 measure is 4 x (1/4) notes, 8 x (1/8) notes, or 16 x (1/16) notes. Note that the sum of all notes in one measure must be equal to 1. They can be mixed and matched like (1/4) + (1/4) + (1/8 + 1/8) + (1/16 + 1/16 + 1/16 + 1/16) = 1.
+* *Metronom* musiqachiga zarbani chertish orqali o'z asarining ritmini o'rnatishga yordam beradi. In the EarSketch DAW, you can turn the metronome on or off using the "toggle metronome" icon.
+
+[[imediameasurepng]]
+.A measure
+[caption="Figure 3.2.1: "]
+image::../media/U1P1/measure.png[A measure]
+
+[[imediabeatpng]]
+.A beat
+[caption="Figure 3.2.2: "]
+image::../media/U1P1/beat.png[A beat]
+
+[[imediasixteenthnotepng]]
+.A sixteenth note
+[caption="Figure 3.2.3: "]
+image::../media/U1P1/sixteenthnote.png[A sixteenth note]
+
+.PRACTICE
+****
+Listen to your favorite song, and try to clap on the beat. You can do this exercise with your neighbor.
+****
+
+We'll compose each of our rhythms in a *beat* string.
+
+A *beat* string is a string that uses the characters `0`, `+`, or `-`. As a reminder, a string is a data type that contains a series of characters (like `0` or `+`) inside quotation marks.
+
+For example: `"0-00-00-0+++0+0+"`
+
+* `0` zarbdor ovozli klipni ijro eta boshlaydi (masalan, barabanning bir zarbasi).
+* `+` audio klipni keyingi quyi-zarbaga kengaytiradi. U har doim `0` yoki `+` dan keyin keladi.
+* `-` sukut, sukunat degan ma’noni anglatadi.
+
+.PRACTICE
+****
+For each of the following drumbeat strings, try clapping on the zeros. Then listen to the corresponding audio and verify if you were right. This exercise will help you understand how the drumbeat strings work.
+****
+
+Here are some examples of 1-measure beat strings:
+
+Chorak notalar: `"0+++0+++0+++0+++"`
+(o'qing: "1, 2, 3, 4")
+
+++++
+audioMedia/beatString1.mp3
+++++
+
+Sakkizinchi notalar: `"0+0+0+0+0+0+0+0+"`
+(o'qing: "1 va 2 va 3 va 4")
+
+++++
+audioMedia/beatString11.mp3
+++++
+
+O'n oltinchi notalar: `"0000000000000000"`
+(bu juda tez, tempga bog'liq)
+
+++++
+audioMedia/beatString12.mp3
+++++
+
+`"0-0-0---0-0-0---"`
+(o'qing: "1 va 2, 3 va 4")
+
+++++
+audioMedia/beatString2.mp3
+++++
+
+`"0---0---0-0-0---"`
+(o'qing: "1, 2, 3 va 4")
+
+++++
+audioMedia/beatString3.mp3
+++++
+
+`"0---0---0---0000"`
+(o'qing: "1, 2, 3, 4 e va a")
+
+++++
+audioMedia/beatString4.mp3
+++++
+
+{nbsp} +
+
+////
+ADDITIONAL VIDEO TO BE ADDED
+See https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+video revamping tab
+////
+
+[[makebeat]]
+=== `makeBeat()` funktsiyasi
+
+Endi shaxsiy zarbangizni qanday yarishingiz mumkinligini ko'rib chiqaylik. Here we use the term "beat" as a shorthand for drumbeat: a repeated rhythmic pattern of percussive sounds. Biz `makeBeat()` funktsiyasidan 4 ta argument bilan foydalanamiz:
+
+. *Sound*: A sound constant. You may want to use the genre filter in the Sound Browser to select "MAKEBEAT". These are short sounds appropriate for beat patterns.
+. *Track*: The track number
+. *Start*: The starting measure
+. *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+
+For example: `makeBeat(DUBSTEP_FILTERCHORD_002, 1, 1, "0--0--000--00-0-")` will place your pattern `0--0--000--00-0-` on track 1, at measure 1, using the sound `DUBSTEP_FILTERCHORD_002`.
+
+Keling, ushbu video orqali batafsil ma'lumotni ko'ramiz:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12py]]
+video::./videoMedia/3_3_makebeat_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12js]]
+video::./videoMedia/3_3_makebeat_js.mp4[]
+
+Here is the example shown in the video:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-multi-beat.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-multi-beat.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Yangi `beatString1` o'zgaruvchisi, `"0"`, `"+"` va `"-"` belgilaridan iborat 16 ta belgili satr yarating.
+Use the `makeBeat()` function to add your beat pattern to your song on track `1`.
+Please note that:
+
+. You should assign your variables with the `=` symbol before using them.
+. Xuddi `fitMedia()` kabi, `makeBeat()` funktsiyasi ham kichik (`m`) harf bilan boshlanadi va oʻrtada katta (`B`) harfi bo'ladi.
+. Xuddi `fitMedia()` kabi, `makeBeat()` funktsiyasi vergul bilan ajratilgan 4 ta parametrga ega.
+
+Musiqangizni tinglaganingizda, agar sizga birinchi versiya yoqmasa, u sizga yoqmagunga qadar, uni yanada yaxshiroq yangrashi uchun zarbangizni o'zgartiring.
+****
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new script and add two or three sounds using `fitMedia()`. Use variables to store your sound constants.
+Use the `makeBeat()` function to add at least two different beats. You can either play them simultaneously, on two different tracks, or one after the other on one single track.
+****
+
+[[beatsandgenres]]
+=== Create a beat based on your musical genre
+
+Endi siz `makeBeat()` va zarba satrlari bilan ishlashni boshlaganingizdan so'ng, keling, siz foydalanishingiz mumkin bo'lgan bir nechta asosiy zarba andozalarini ko'rib chiqamiz.
+Siz musiqiy janr - bu shakl, uslub yoki mavzu bo'yicha o'xshashlik bilan tavsiflangan badiiy kompozitsiya (masalan, musiqa) toifasi ekanligini bilib oldingiz. Similarly, some genres have signature beat patterns. Below are some examples:
+
+We will use three types of sounds: kick (track `1`), snare (track `2`), and hihat (track `3`). We will use one `makeBeat()` function for each of these sounds, on three different tracks.
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/3_4_beat_by_genre.mp4[]
+
+Here is the corresponding code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/add-beats-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/add-beats-examples-of-beats.js.txt[]
+----
+
+[[chapter3summary]]
+=== Chapter 3 Summary
+
+* In EarSketch, 1 measure is divided into 4 beats, or 4 quarter notes. 1 beat is divided into 4 sixteenth notes.
+* *O'zgaruvchilar* ma'lumotlarni saqlash uchun kompyuter xotirasida bo'sh joy yaratadi.
+* Siz avval `=` belgisi yordamida o'zgaruvchi nomiga qiymatni (ma'lumotlarni) belgilashingiz kerak. Then you can use the variable by writing its name in the code.
+* *Satr* - bu birtirnoq yoki qo'shtirnoq bilan qoplangan belgilar qatoridan iborat ma'lumotlar turi.
+* Percussive sounds can be found using the GENRE filter in the Sound Browser: select the artist MAKEBEAT.
+* Satrlar EarSketch da ritmik andozalar yaratish uchun `makeBeat()` funktsiyasi bilan ishlatiladi. `makeBeat()` o'z andozasining har o'n oltinchi notasini aniqlash uchun zarba satrini oladi. A `0` starts playing a sound, a `+` extends the note for the next sub-beat, and `-` creates a rest.
+* `makeBeat()` to'rtta argument oladi:
+** *Sound*: A sound constant
+** *Track*: The track number
+** *Start*: The starting measure
+** *Beat*: A string composed of the characters `"0"`, `"+"`, and `"-"`.
+* Different beat patterns often correspond to different musical genres.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these options is a string?
+
+[answers]
+* "Five"
+* 5
+* FIVE
+* Five
+--
+
+[question]
+--
+What does "0" represent in a beat pattern string?
+
+[answers]
+* Start playing the clip
+* Rest
+* Extend the clip
+* End the clip
+--
+
+[question]
+--
+EarSketch-da bir o'lchov...
+
+[answers]
+* 4 beats long
+* 4 sub-beats long
+* 16 beats long
+* 1 quarter note
+--
+
+[question]
+--
+1/16 nota...
+
+[answers]
+* a quarter of a quarter note
+* half a beat
+* a quarter of a measure
+* 1 measure
+--
+
+[question]
+--
+`makeBeat()` funktsiyasidan foydalanish uchun parametrlar tartibi qanday boʻlishi kerak?
+
+[answers]
+* clip name, track, start measure, beat string
+* tempo, track, start measure, end measure
+* clip name, start measure, end measure, beat string
+* beat string, track, start measure, clip name
+--
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-examples-of-beats.js.txt b/src/locales/uz/v2/code-examples/add-beats-examples-of-beats.js.txt
new file mode 100644
index 000000000..04855cb83
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-examples-of-beats.js.txt
@@ -0,0 +1,26 @@
+// Zarbalarga misollar: Turli janrlarda zarbalar yaratish
+
+// Sozlash
+setTempo(120);
+
+// Sounds
+var kick = OS_KICK05; // Bu "bum" tovushi.
+var snare = OS_SNARE01; // This is the "bap" sound.
+var hihat = OS_CLOSEDHAT01; // This is the "ts" sound.
+
+// Rock zarbasi 1-o'lchovda
+makeBeat(kick, 1, 1, "0+++----0+++----");
+makeBeat(snare, 2, 1, "----0+++----0+++");
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+");
+
+// Hip hop zarbasi 3-o'lchovda
+makeBeat(kick, 1, 3, "0+++------0+++--");
+makeBeat(snare, 2, 3, "----0++0+0++0+++");
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+");
+
+// Jazz zarbasi 5-o'lchovda
+makeBeat(hihat, 3, 5, "0++0+00++0+0");
+
+// Dembou (lotin, karib dengizi) zarbasi 7-o'lchovda
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++");
+makeBeat(snare, 2, 7, "---0++0+---0++0+");
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-examples-of-beats.py.txt b/src/locales/uz/v2/code-examples/add-beats-examples-of-beats.py.txt
new file mode 100644
index 000000000..6ef674ebf
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-examples-of-beats.py.txt
@@ -0,0 +1,27 @@
+# Zarbalarga misollar: Turli janrlarda zarbalar yaratish
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Sounds
+kick = OS_KICK05 # Bu "bum" tovushi.
+snare = OS_SNARE01 # This is the "bap" sound.
+hihat = OS_CLOSEDHAT01 # Bu "ts" tovushi.
+
+# Rock zarbasi 1-o'lchovda
+makeBeat(kick, 1, 1, "0+++----0+++----")
+makeBeat(snare, 2, 1, "----0+++----0+++")
+makeBeat(hihat, 3, 1, "0+0+0+0+0+0+0+0+")
+
+# Hip hop zarbasi 3-o'lchovda
+makeBeat(kick, 1, 3, "0+++------0+++--")
+makeBeat(snare, 2, 3, "----0++0+0++0+++")
+makeBeat(hihat, 3, 3, "0+0+0+0+0+0+0+0+")
+
+# Jazz zarbasi 5-o'lchovda
+makeBeat(hihat, 3, 5, "0++0+00++0+0")
+
+# Dembou (lotin, karib dengizi) zarbasi 7-o'lchovda
+makeBeat(kick, 1, 7, "0+++0+++0+++0+++")
+makeBeat(snare, 2, 7, "---0++0+---0++0+")
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-instead-of-this.js.txt b/src/locales/uz/v2/code-examples/add-beats-instead-of-this.js.txt
new file mode 100644
index 000000000..a0a04e6fa
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-instead-of-this.js.txt
@@ -0,0 +1,6 @@
+// Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2);
+
+// We write this:
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005;
+fitMedia(synth1, 1, 1, 2);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-instead-of-this.py.txt b/src/locales/uz/v2/code-examples/add-beats-instead-of-this.py.txt
new file mode 100644
index 000000000..8d730a259
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-instead-of-this.py.txt
@@ -0,0 +1,6 @@
+# Instead of this:
+fitMedia(HIPHOP_SYNTHPLUCKLEAD_005, 1, 1, 2)
+
+# We write this:
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+fitMedia(synth1, 1, 1, 2)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-multi-beat.js.txt b/src/locales/uz/v2/code-examples/add-beats-multi-beat.js.txt
new file mode 100644
index 000000000..cc20d560b
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-multi-beat.js.txt
@@ -0,0 +1,13 @@
+// Multi Beat: Using several makeBeat calls with different rhythms
+
+// Sozlash
+setTempo(120);
+
+// Music
+var synth = DUBSTEP_FILTERCHORD_002;
+var cymbal = OS_CLOSEDHAT01;
+var beat1 = "-00-00+++00--0-0";
+var beat2 = "0--0--000--00-0-";
+
+makeBeat(synth, 1, 1, beat1);
+makeBeat(cymbal, 2, 1, beat2);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-multi-beat.py.txt b/src/locales/uz/v2/code-examples/add-beats-multi-beat.py.txt
new file mode 100644
index 000000000..d38286fa6
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-multi-beat.py.txt
@@ -0,0 +1,14 @@
+# Multi Beat: Using several makeBeat calls with different rhythms
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+synth = DUBSTEP_FILTERCHORD_002
+cymbal = OS_CLOSEDHAT01
+beat1 = "-00-00+++00--0-0"
+beat2 = "0--0--000--00-0-"
+
+makeBeat(synth, 1, 1, beat1)
+makeBeat(cymbal, 2, 1, beat2)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-variables.js.txt b/src/locales/uz/v2/code-examples/add-beats-variables.js.txt
new file mode 100644
index 000000000..475ae80f1
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-variables.js.txt
@@ -0,0 +1,18 @@
+// Variables: Using variables to store sounds and simplify edits
+
+// Sozlash
+setTempo(100);
+
+// Sounds
+var synth1 = HIPHOP_SYNTHPLUCKLEAD_005; // Assigns a sound to the variable "synth1".
+var synth2 = HIPHOP_SOLOMOOGLEAD_001;
+var drums = HIPHOP_TRAPHOP_BEAT_008;
+
+// fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2);
+fitMedia(synth2, 1, 2, 3);
+fitMedia(synth1, 1, 3, 4);
+fitMedia(synth2, 1, 4, 5);
+
+// fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/add-beats-variables.py.txt b/src/locales/uz/v2/code-examples/add-beats-variables.py.txt
new file mode 100644
index 000000000..5861a730f
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/add-beats-variables.py.txt
@@ -0,0 +1,19 @@
+# Variables: Using variables to store sounds and simplify edits
+
+# Sozlash
+from earsketch import *
+setTempo(100)
+
+# Sounds
+synth1 = HIPHOP_SYNTHPLUCKLEAD_005
+synth2 = HIPHOP_SOLOMOOGLEAD_001
+drums = HIPHOP_TRAPHOP_BEAT_008
+
+# fitMedia() adds the sounds synth1 and synth2 alternatively on track 1.
+fitMedia(synth1, 1, 1, 2)
+fitMedia(synth2, 1, 2, 3)
+fitMedia(synth1, 1, 3, 4)
+fitMedia(synth2, 1, 4, 5)
+
+# fitMedia() adds the drums on track 2.
+fitMedia(drums, 2, 1, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
new file mode 100644
index 000000000..80982e2c2
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt
@@ -0,0 +1,29 @@
+// A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+// Sozlash
+setTempo(120);
+
+// Music
+
+// Create an A section function
+function sectionA(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure); // bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure); // increasing volume of bass line
+}
+
+// Create a B section function
+function sectionB(startMeasure, endMeasure) {
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure); // main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure); // drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure); // contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure); // increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure); // rattling: adding a new element
+}
+
+// Call my functions
+sectionA(1, 5);
+sectionB(5, 9);
+sectionA(9, 13);
+sectionB(13, 17);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
new file mode 100644
index 000000000..6f5700ded
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt
@@ -0,0 +1,28 @@
+# A-B-A-B Form and custom functions: A song with A and B sections, using custom functions
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section function
+def sectionA(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, startMeasure, endMeasure) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, startMeasure, endMeasure) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, startMeasure, endMeasure) # bass line
+ setEffect(3, VOLUME, GAIN, -20, startMeasure, 0, endMeasure) # increasing volume of bass line
+
+# Create a B section function
+def sectionB(startMeasure, endMeasure):
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, startMeasure, endMeasure) # main melody differs
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, startMeasure, endMeasure) # drums differ
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, startMeasure, endMeasure) # contrasting bass: it's slower and louder
+ setEffect(3, VOLUME, GAIN, 5, startMeasure, 5, endMeasure) # increasing bass volume
+ fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, startMeasure, endMeasure) # rattling: adding a new element
+
+# Call my functions
+sectionA(1, 5)
+sectionB(5, 9)
+sectionA(9, 13)
+sectionB(13, 17)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-a-b-a-form.js.txt b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-form.js.txt
new file mode 100644
index 000000000..96cf86004
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-form.js.txt
@@ -0,0 +1,28 @@
+// A-B-A Form: A song with A and B sections
+
+// Sozlash
+setTempo(120);
+
+// Music
+
+// Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+
+// Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9); // main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9); // drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9); // contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9); // increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9); // rattling: adding a new element
+
+// Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13); // main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13); // drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13); // bass line
+setEffect(3, VOLUME, GAIN, -20, 9, 0, 13); // increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-a-b-a-form.py.txt b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-form.py.txt
new file mode 100644
index 000000000..25d37ccc7
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-a-b-a-form.py.txt
@@ -0,0 +1,29 @@
+# A-B-A Form: A song with A and B sections
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+
+# Create an A section
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+
+# Create a 4 measure B section between measures 5 and 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_1, 1, 5, 9) # main melody differs
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_5, 2, 5, 9) # drums differ
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_3, 3, 5, 9) # contrasting bass: it's slower and louder
+setEffect(3, VOLUME, GAIN, 5, 5, 5, 9) # increasing bass volume
+fitMedia(RD_WORLD_PERCUSSION_SEEDSRATTLE_1, 4, 5, 9) # rattling: adding a new element
+
+# Then back to section A at measure 9
+
+fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 9, 13) # main
+fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 9, 13) # drums
+fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 9, 13) # bass line
+setEffect(3, VOLUME, GAIN, 0, 9, -20, 13) # increasing volume of bass line
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt b/src/locales/uz/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
new file mode 100644
index 000000000..4bbe763dc
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-total-atlanta-song-of-summer.js.txt
@@ -0,0 +1,83 @@
+// Total Atlanta Song of Summer: creating a complete song with abstractions
+
+setTempo(110);
+
+// Sound variables
+var melody1 = EIGHT_BIT_ATARI_BASSLINE_005;
+var melody2 = DUBSTEP_LEAD_018;
+var melody3 = DUBSTEP_LEAD_017;
+var melody4 = DUBSTEP_LEAD_013;
+var bass1 = HIPHOP_BASSSUB_001;
+var bass2 = RD_TRAP_BASSDROPS_2;
+var brass1 = Y30_BRASS_4;
+var shout = CIARA_SET_TALK_ADLIB_AH_4;
+var piano = YG_RNB_PIANO_4;
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT03;
+
+// FUNCTION DEFINITIONS
+
+// Adding drums:
+function addingDrums(start, end, pattern) {
+ // first, we create beat strings, depending on the parameter pattern:
+ if (pattern === "heavy") {
+ var beatStringKick = "0---0---0---00--";
+ var beatStringHihat = "-----000----0-00";
+ } else if (pattern === "light") {
+ beatStringKick = "0-------0---0---";
+ beatStringHihat = "--0----0---0---";
+ }
+ // then we create the beat,
+ // on track 3 for the kick and track 4 for the hihat,
+ // from measures start to end:
+ for (var measure = start; measure < end; measure++) {
+ // here we will place our beat on "measure",
+ // which is first equal to "start",
+ // which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick);
+ makeBeat(hihat, 4, measure, beatStringHihat);
+ }
+}
+
+// Intro:
+function intro(start, end) {
+ fitMedia(melody1, 1, start, start + 1);
+ fitMedia(melody1, 1, start + 2, start + 3);
+ fitMedia(bass1, 2, start, start + 3);
+ // transition:
+ fitMedia(bass2, 2, start + 3, end);
+ fitMedia(shout, 3, start + 3.75, end);
+}
+// SectionA:
+function sectionA(start, end) {
+ fitMedia(melody2, 1, start, end);
+ fitMedia(brass1, 2, start, end);
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end);
+ addingDrums(start, end, "heavy");
+ // Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end);
+}
+
+// SectionB:
+function sectionB(start, end) {
+ fitMedia(melody3, 1, start, start + 2);
+ fitMedia(melody4, 1, start + 2, end);
+ fitMedia(piano, 2, start, end);
+ addingDrums(start, end, "light");
+}
+
+// FUNCTION CALLS
+intro(1, 5);
+sectionA(5, 9);
+sectionB(9, 13);
+sectionA(13, 17);
+sectionB(17, 21);
+
+// Fade out:
+for (var track = 1; track < 5; track++) {
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21);
+}
+
+// Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15);
+setEffect(3, VOLUME, GAIN, -10);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt b/src/locales/uz/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
new file mode 100644
index 000000000..f9a01cd8c
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-total-atlanta-song-of-summer.py.txt
@@ -0,0 +1,78 @@
+# Total Atlanta Song of Summer: creating a complete song with abstractions
+# structure of the song: intro-A-B-A-B
+
+from earsketch import *
+setTempo(110)
+
+# Sound variables
+melody1 = EIGHT_BIT_ATARI_BASSLINE_005
+melody2 = DUBSTEP_LEAD_018
+melody3 = DUBSTEP_LEAD_017
+melody4 = DUBSTEP_LEAD_013
+bass1 = HIPHOP_BASSSUB_001
+bass2 = RD_TRAP_BASSDROPS_2
+brass1 = Y30_BRASS_4
+shout = CIARA_SET_TALK_ADLIB_AH_4
+piano = YG_RNB_PIANO_4
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT03
+
+# FUNCTION DEFINITIONS
+
+# Adding drums:
+def addingDrums(start, end, pattern):
+ # first, we create beat strings, depending on the parameter pattern:
+ if pattern == "heavy":
+ beatStringKick = "0---0---0---00--"
+ beatStringHihat = "-----000----0-00"
+ elif pattern == "light":
+ beatStringKick = "0-------0---0---"
+ beatStringHihat = "--0----0---0---"
+ # then we create the beat,
+ # on track 3 for the kick and track 4 for the hihat,
+ # from measures start to end:
+ for measure in range(start, end):
+ # here we will place our beat on "measure",
+ # which is first equal to "start",
+ # which is a parameter of the function
+ makeBeat(kick, 3, measure, beatStringKick)
+ makeBeat(hihat, 4, measure, beatStringHihat)
+
+# Intro:
+def intro(start, end):
+ fitMedia(melody1, 1, start, start + 1)
+ fitMedia(melody1, 1, start + 2, start + 3)
+ fitMedia(bass1, 2, start, start + 3)
+ # transition:
+ fitMedia(bass2, 2, start + 3, end)
+ fitMedia(shout, 3, start + 3.75, end)
+
+# SectionA:
+def sectionA(start, end):
+ fitMedia(melody2, 1, start, end)
+ fitMedia(brass1, 2, start, end)
+ setEffect(2, VOLUME, GAIN, -20, start, -10, end)
+ addingDrums(start, end, "heavy")
+ # Pitch modulation for transition:
+ setEffect(1, BANDPASS, BANDPASS_FREQ, 200, end - 2, 1000, end)
+
+# SectionB:
+def sectionB(start, end):
+ fitMedia(melody3, 1, start, start + 2)
+ fitMedia(melody4, 1, start + 2, end)
+ fitMedia(piano, 2, start, end)
+ addingDrums(start, end, "light")
+
+# FUNCTION CALLS
+intro(1, 5)
+sectionA(5, 9)
+sectionB(9, 13)
+sectionA(13, 17)
+sectionB(17, 21)
+
+# Fade out:
+for track in range(1, 5):
+ setEffect(track, VOLUME, GAIN, 0, 19, -60, 21)
+# Lower hihat and kick volume:
+setEffect(4, VOLUME, GAIN, -15)
+setEffect(3, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
new file mode 100644
index 000000000..4948c39ac
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-drum-fill.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+// Sozlash
+setTempo(130);
+
+// Music
+var leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4;
+var leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9;
+var bass1 = RD_ROCK_POPELECTRICBASS_8;
+var bass2 = RD_ROCK_POPELECTRICBASS_25;
+var drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10;
+var drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1;
+var drumFill = RD_ROCK_POPRHYTHM_FILL_4;
+
+// Section 1
+fitMedia(leadGuitar1, 1, 1, 8);
+fitMedia(bass1, 2, 1, 8);
+fitMedia(drums1, 3, 1, 8);
+
+// Drum Fill
+fitMedia(drumFill, 3, 8, 9);
+
+// Section 2
+fitMedia(leadGuitar2, 1, 9, 17);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(drums2, 3, 9, 17);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
new file mode 100644
index 000000000..fa75739e4
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-drum-fill.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Drum Fill: Transitioning between sections with a drum fill
+
+# Sozlash
+from earsketch import *
+setTempo(130)
+
+# Music
+leadGuitar1 = RD_ROCK_POPLEADSTRUM_GUITAR_4
+leadGuitar2 = RD_ROCK_POPLEADSTRUM_GUITAR_9
+bass1 = RD_ROCK_POPELECTRICBASS_8
+bass2 = RD_ROCK_POPELECTRICBASS_25
+drums1 = RD_ROCK_POPRHYTHM_DRUM_PART_10
+drums2 = RD_ROCK_POPRHYTHM_MAINDRUMS_1
+drumFill = RD_ROCK_POPRHYTHM_FILL_4
+
+# Section 1
+fitMedia(leadGuitar1, 1, 1, 8)
+fitMedia(bass1, 2, 1, 8)
+fitMedia(drums1, 3, 1, 8)
+
+# Drum Fill
+fitMedia(drumFill, 3, 8, 9)
+
+# Section 2
+fitMedia(leadGuitar2, 1, 9, 17)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(drums2, 3, 9, 17)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-risers.js.txt b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
new file mode 100644
index 000000000..d560a3ad7
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-risers.js.txt
@@ -0,0 +1,36 @@
+// Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+// Sozlash
+setTempo(128);
+
+// Music
+var synthRise = YG_EDM_SYNTH_RISE_1;
+var airRise = RD_EDM_SFX_RISER_AIR_1;
+var lead1 = YG_EDM_LEAD_1;
+var lead2 = YG_EDM_LEAD_2;
+var kick1 = YG_EDM_KICK_LIGHT_1;
+var kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001;
+var snare = ELECTRO_DRUM_MAIN_LOOPPART_003;
+var crash = Y50_CRASH_2;
+var reverseFX = YG_EDM_REVERSE_FX_1;
+
+// Section 1
+fitMedia(lead1, 1, 1, 17);
+fitMedia(kick1, 2, 9, 17);
+
+// Transition
+fitMedia(reverseFX, 3, 16, 17);
+fitMedia(synthRise, 4, 13, 17);
+fitMedia(airRise, 5, 13, 17);
+fitMedia(crash, 6, 17, 19);
+
+// Section 2
+fitMedia(lead2, 1, 17, 33);
+fitMedia(kick2, 7, 25, 33);
+fitMedia(snare, 8, 29, 33);
+
+// Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17); // Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10);
+setEffect(7, VOLUME, GAIN, -20);
+setEffect(8, VOLUME, GAIN, -20);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-risers.py.txt b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
new file mode 100644
index 000000000..9bc67b125
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-risers.py.txt
@@ -0,0 +1,37 @@
+# Transition Techniques - Risers: Transitioning between sections using risers and a crash cymbal
+
+# Sozlash
+from earsketch import *
+setTempo(128)
+
+# Music
+synthRise = YG_EDM_SYNTH_RISE_1
+airRise = RD_EDM_SFX_RISER_AIR_1
+lead1 = YG_EDM_LEAD_1
+lead2 = YG_EDM_LEAD_2
+kick1 = YG_EDM_KICK_LIGHT_1
+kick2 = ELECTRO_DRUM_MAIN_LOOPPART_001
+snare = ELECTRO_DRUM_MAIN_LOOPPART_003
+crash = Y50_CRASH_2
+reverseFX = YG_EDM_REVERSE_FX_1
+
+# Section 1
+fitMedia(lead1, 1, 1, 17)
+fitMedia(kick1, 2, 9, 17)
+
+# Transition
+fitMedia(reverseFX, 3, 16, 17)
+fitMedia(synthRise, 4, 13, 17)
+fitMedia(airRise, 5, 13, 17)
+fitMedia(crash, 6, 17, 19)
+
+# Section 2
+fitMedia(lead2, 1, 17, 33)
+fitMedia(kick2, 7, 25, 33)
+fitMedia(snare, 8, 29, 33)
+
+# Effects
+setEffect(1, VOLUME, GAIN, 0, 16, 1, 17) # Adjusting volumes for better matching
+setEffect(4, VOLUME, GAIN, -10)
+setEffect(7, VOLUME, GAIN, -20)
+setEffect(8, VOLUME, GAIN, -20)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
new file mode 100644
index 000000000..b581c0a59
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-track-droupouts.js.txt
@@ -0,0 +1,26 @@
+// Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+// Sozlash
+setTempo(120);
+
+// Music
+var introLead = TECHNO_ACIDBASS_002;
+var mainLead1 = TECHNO_ACIDBASS_003;
+var mainLead2 = TECHNO_ACIDBASS_005;
+var auxDrums1 = TECHNO_LOOP_PART_025;
+var auxDrums2 = TECHNO_LOOP_PART_030;
+var mainDrums = TECHNO_MAINLOOP_019;
+var bass = TECHNO_SUBBASS_002;
+
+// Section 1
+fitMedia(introLead, 1, 1, 5);
+fitMedia(mainLead1, 1, 5, 9);
+fitMedia(auxDrums1, 2, 3, 5);
+fitMedia(auxDrums2, 2, 5, 8); // Drums drop out
+fitMedia(mainDrums, 3, 5, 8);
+
+// Section 2
+fitMedia(mainLead2, 1, 9, 17);
+fitMedia(auxDrums2, 2, 9, 17); // Drums enter back in
+fitMedia(mainDrums, 3, 9, 17);
+fitMedia(bass, 4, 9, 17);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
new file mode 100644
index 000000000..68bd35506
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-transition-techniques-track-droupouts.py.txt
@@ -0,0 +1,27 @@
+# Transition Techniques - Track Silencing: Transitioning between sections with track silencing
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+introLead = TECHNO_ACIDBASS_002
+mainLead1 = TECHNO_ACIDBASS_003
+mainLead2 = TECHNO_ACIDBASS_005
+auxDrums1 = TECHNO_LOOP_PART_025
+auxDrums2 = TECHNO_LOOP_PART_030
+mainDrums = TECHNO_MAINLOOP_019
+bass = TECHNO_SUBBASS_002
+
+# Section 1
+fitMedia(introLead, 1, 1, 5)
+fitMedia(mainLead1, 1, 5, 9)
+fitMedia(auxDrums1, 2, 3, 5)
+fitMedia(auxDrums2, 2, 5, 8) # Drums drop out
+fitMedia(mainDrums, 3, 5, 8)
+
+# Section 2
+fitMedia(mainLead2, 1, 9, 17)
+fitMedia(auxDrums2, 2, 9, 17) # Drums enter back in
+fitMedia(mainDrums, 3, 9, 17)
+fitMedia(bass, 4, 9, 17)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-untitled1.js.txt b/src/locales/uz/v2/code-examples/custom-functions-untitled1.js.txt
new file mode 100644
index 000000000..e380bd210
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-untitled1.js.txt
@@ -0,0 +1,7 @@
+function sectionA() {
+ // Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5); // main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5); // drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5); // bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5); // increasing volume of bass line
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/custom-functions-untitled1.py.txt b/src/locales/uz/v2/code-examples/custom-functions-untitled1.py.txt
new file mode 100644
index 000000000..1fce4f7cd
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/custom-functions-untitled1.py.txt
@@ -0,0 +1,7 @@
+def sectionA():
+ # Write your instructions here. This is the body of the function.
+ fitMedia(RD_WORLD_PERCUSSION_KALIMBA_PIANO_7, 1, 1, 5) # main
+ fitMedia(RD_WORLD_PERCUSSION_DRUMPART_24, 2, 1, 5) # drums
+ fitMedia(RD_UK_HOUSE__EVOLVEPAD_2, 3, 1, 5) # bass line
+ setEffect(3, VOLUME, GAIN, -20, 1, 0, 5) # increasing volume of bass line
+ # This code is indented. When writing the rest of your script, make sure you stop indenting.
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-additive-introduction.js.txt b/src/locales/uz/v2/code-examples/data-structures-additive-introduction.js.txt
new file mode 100644
index 000000000..837cf79d3
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-additive-introduction.js.txt
@@ -0,0 +1,14 @@
+// Additive Introduction: Creating an additive introduction with array iteration
+
+// Sozlash
+setTempo(120);
+
+// Music
+var introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001];
+
+for (var measure = 1; measure < introSounds.length + 1; measure++) {
+ // we add 1 to introSounds.length since we want measure to go up to introSounds.length
+ var index = measure - 1; // zero-based array index
+ var track = measure; // change track with measure
+ fitMedia(introSounds[index], track, measure, 5);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-additive-introduction.py.txt b/src/locales/uz/v2/code-examples/data-structures-additive-introduction.py.txt
new file mode 100644
index 000000000..255476465
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-additive-introduction.py.txt
@@ -0,0 +1,14 @@
+# Additive Introduction: Creating an additive introduction with list iteration
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+introSounds = [HIPHOP_DUSTYGROOVE_003, TECHNO_LOOP_PART_006, HOUSE_SFX_WHOOSH_001, TECHNO_CLUB5THPAD_001]
+
+for measure in range(1, len(introSounds) + 1):
+ # we add 1 to len(introSounds) since the second argument of range is exclusive
+ index = measure - 1 # zero-based list index
+ track = measure # change track with measure
+ fitMedia(introSounds[index], track, measure, 5)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-arrays.js.txt b/src/locales/uz/v2/code-examples/data-structures-arrays.js.txt
new file mode 100644
index 000000000..20a772b97
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-arrays.js.txt
@@ -0,0 +1,14 @@
+// Arrays: Using an array to hold several sounds
+
+// Sozlash
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5); // accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5); // accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5); // accessing index 2
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-examples-of-beats.js.txt b/src/locales/uz/v2/code-examples/data-structures-examples-of-beats.js.txt
new file mode 100644
index 000000000..0d5edae1b
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-examples-of-beats.js.txt
@@ -0,0 +1,21 @@
+// Zarbalarga misollar: Turli janrlarda zarbalar yaratish
+
+// Sozlash
+setTempo(110);
+
+// Sounds
+var drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01];
+
+// Rock zarbasi 1-o'lchovda
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++");
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+");
+
+// Hip hop zarbasi 3-o'lchovda
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++");
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+");
+
+// Jazz zarbasi 5-o'lchovda
+makeBeat(drums, 2, 5, "2++2+22++2+22++2");
+
+// Dembou (lotin, karib dengizi) zarbasi 7-o'lchovda
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+");
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-examples-of-beats.py.txt b/src/locales/uz/v2/code-examples/data-structures-examples-of-beats.py.txt
new file mode 100644
index 000000000..b6f830559
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-examples-of-beats.py.txt
@@ -0,0 +1,22 @@
+# Zarbalarga misollar: Turli janrlarda zarbalar yaratish
+
+# Sozlash
+from earsketch import *
+setTempo(110)
+
+# Sounds
+drums = [OS_KICK05, OS_SNARE01, OS_CLOSEDHAT01]
+
+# Rock zarbasi 1-o'lchovda
+makeBeat(drums, 1, 1, "0+++1+++0+++1+++")
+makeBeat(drums, 2, 1, "2+2+2+2+2+2+2+2+")
+
+# Hip hop zarbasi 3-o'lchovda
+makeBeat(drums, 1, 3, "0+++1++1+10+1+++")
+makeBeat(drums, 2, 3, "2+2+2+2+2+2+2+2+")
+
+# Jazz zarbasi 5-o'lchovda
+makeBeat(drums, 2, 5, "2++2+22++2+22++2")
+
+# Dembou (lotin, karib dengizi) zarbasi 7-o'lchovda
+makeBeat(drums, 1, 7, "0++10+1+0++10+1+")
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-instead-of-writing-this.js.txt b/src/locales/uz/v2/code-examples/data-structures-instead-of-writing-this.js.txt
new file mode 100644
index 000000000..58aa8a6f4
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-instead-of-writing-this.js.txt
@@ -0,0 +1,7 @@
+// Instead of writing this:
+var kick = OS_KICK03;
+var hihat = OS_OPENHAT01;
+var snare = OS_SNARE05;
+
+// You can write this:
+var drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05];
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-instead-of-writing-this.py.txt b/src/locales/uz/v2/code-examples/data-structures-instead-of-writing-this.py.txt
new file mode 100644
index 000000000..bdd0f755b
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-instead-of-writing-this.py.txt
@@ -0,0 +1,7 @@
+# Instead of writing this:
+kick = OS_KICK03
+hihat = OS_OPENHAT01
+snare = OS_SNARE05
+
+# You can write this:
+drums = [OS_KICK03, OS_OPENHAT01, OS_SNARE05]
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-iterating-through-arrays.js.txt b/src/locales/uz/v2/code-examples/data-structures-iterating-through-arrays.js.txt
new file mode 100644
index 000000000..3b7052b96
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-iterating-through-arrays.js.txt
@@ -0,0 +1,16 @@
+// Iterating through Arrays: Using an array to hold several sounds and placing them in our DAW thanks to a for loop
+
+// Sozlash
+setTempo(130);
+
+// Music
+
+// Creating an array of sounds
+var myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11];
+
+// Going through the array
+for (var track = 1; track < 4; track++) {
+ var index = track - 1;
+ fitMedia(myEnsemble[index], track, 1, 5);
+ println("this iteration, track = " + track + " and index = " + index);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-iterating-through-lists.py.txt b/src/locales/uz/v2/code-examples/data-structures-iterating-through-lists.py.txt
new file mode 100644
index 000000000..49400fdcc
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-iterating-through-lists.py.txt
@@ -0,0 +1,16 @@
+# Iterating through Lists: Using a list to hold several sounds and placing them in our DAW thanks to a for loop
+
+# Sozlash
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Going through the list
+for track in range(1, 4):
+ index = track - 1
+ fitMedia(myEnsemble[index], track, 1, 5)
+ print("this iteration, track = " + str(track) + " and index = " + str(index))
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-list.py.txt b/src/locales/uz/v2/code-examples/data-structures-list.py.txt
new file mode 100644
index 000000000..c2d40f0c1
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-list.py.txt
@@ -0,0 +1,15 @@
+# List: Using a list to hold several sounds
+
+# Sozlash
+from earsketch import *
+setTempo(130)
+
+# Music
+
+# Creating a list of sounds
+myEnsemble = [RD_ROCK_POPRHYTHM_MAINDRUMS_12, RD_ROCK_POPELECTRICBASS_16, RD_ROCK_POPELECTRICLEAD_11]
+
+# Placing sounds from measure 1 to 5
+fitMedia(myEnsemble[0], 1, 1, 5) # accessing index 0
+fitMedia(myEnsemble[1], 2, 1, 5) # accessing index 1
+fitMedia(myEnsemble[2], 3, 1, 5) # accessing index 2
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-making-a-drum-set.js.txt b/src/locales/uz/v2/code-examples/data-structures-making-a-drum-set.js.txt
new file mode 100644
index 000000000..c5dbaba47
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-making-a-drum-set.js.txt
@@ -0,0 +1,18 @@
+// Making a drum set: Using arrays with makeBeat()
+
+// Sozlash
+setTempo(100);
+
+// Music
+// Before, we had one track for every sound (measure 1):
+var kick = OS_KICK05;
+var snare = OS_SNARE01;
+var kickBeat = "0+++----0+++----";
+var snareBeat = "----0+++----0+++";
+makeBeat(kick, 1, 1, kickBeat);
+makeBeat(snare, 2, 1, snareBeat);
+
+// Now, we can combine them (measure 3):
+var drums = [OS_KICK05, OS_SNARE01];
+var beat = "0+++1+++0+++1+++";
+makeBeat(drums, 1, 3, beat);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-making-a-drum-set.py.txt b/src/locales/uz/v2/code-examples/data-structures-making-a-drum-set.py.txt
new file mode 100644
index 000000000..fb63d5bb8
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-making-a-drum-set.py.txt
@@ -0,0 +1,18 @@
+# Making a drum set: Using lists with makeBeat()
+
+# Sozlash
+from earsketch import *
+setTempo(100)
+
+# Before, we had one track for every sound (measure 1):
+kick = OS_KICK05
+snare = OS_SNARE01
+kickBeat = "0+++----0+++----"
+snareBeat = "----0+++----0+++"
+makeBeat(kick, 1, 1, kickBeat)
+makeBeat(snare, 2, 1, snareBeat)
+
+# Now, we can combine them (measure 3):
+drums = [OS_KICK05, OS_SNARE01]
+beat = "0+++1+++0+++1+++"
+makeBeat(drums, 1, 3, beat)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-string-and-lists-operations.js.txt b/src/locales/uz/v2/code-examples/data-structures-string-and-lists-operations.js.txt
new file mode 100644
index 000000000..44ccc6a17
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-string-and-lists-operations.js.txt
@@ -0,0 +1,34 @@
+// String and Lists Operations: Showing what we can do with arrays and strings
+
+// Sozlash
+setTempo(120);
+
+// Creating my beat strings and arrays
+var stringA = "0+++----0+++--0+";
+var stringB = "0-0-0-0-----0-0-";
+var soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1];
+var soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2];
+
+// Print the second character of each string.
+println(stringA[1]);
+println(stringB[1]);
+
+// Print the last element of your arrays.
+println(soundsA[soundsA.length - 1]);
+println(soundsB[soundsB.length - 1]);
+
+// Create and print stringC, the concatenation of stringA and stringB.
+var stringC = stringA + stringB;
+println(stringC);
+
+// Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+var soundsC = (soundsA.concat(soundsB)).concat(soundsA);
+println(soundsC);
+
+// Create and print stringD, the slice of stringC from the second to the fifth characters included.
+var stringD = stringC.substring(1, 5);
+println(stringD);
+
+// Create and print soundsD, the slice of stringC from the third to the last elements included.
+var soundsD = soundsC.slice(2, soundsC.length);
+println(soundsD);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-string-and-lists-operations.py.txt b/src/locales/uz/v2/code-examples/data-structures-string-and-lists-operations.py.txt
new file mode 100644
index 000000000..dc78d7a74
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-string-and-lists-operations.py.txt
@@ -0,0 +1,35 @@
+# String and Lists Operations: Showing what we can do with lists and strings
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Creating my beat strings and arrays
+stringA = "0+++----0+++--0+"
+stringB = "0-0-0-0-----0-0-"
+soundsA = [RD_FUTURE_DUBSTEP_MAINBEAT_1, RD_FUTURE_DUBSTEP_BASSWOBBLE_2, RD_POP_SFX_NOISERHYTHM_1]
+soundsB = [YG_GOSPEL_GUITAR_2, YG_GOSPEL_ORGAN_2]
+
+# Print the second character of each string.
+print(stringA[1])
+print(stringB[1])
+
+# Print the last element of your lists.
+print(soundsA[len(soundsA) - 1])
+print(soundsB[len(soundsB) - 1])
+
+# Create and print stringC, the concatenation of stringA and stringB.
+stringC = stringA + stringB
+print(stringC)
+
+# Create and print soundsC, the concatenation your soundsA, soundsB and soundsA again.
+soundsC = soundsA + soundsB + soundsA
+print(soundsC)
+
+# Create and print stringD, the slice of stringC from the second to the fifth characters included.
+stringD = stringC[1:5]
+print(stringD)
+
+# Create and print soundsD, the slice of stringC from the third to the last elements included.
+soundsD = soundsC[2 : len(soundsC)]
+print(soundsD)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-string-operations.js.txt b/src/locales/uz/v2/code-examples/data-structures-string-operations.js.txt
new file mode 100644
index 000000000..e6f921236
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-string-operations.js.txt
@@ -0,0 +1,24 @@
+// String Operations: Expand a beat string into a longer beat string
+
+// Sozlash
+setTempo(120);
+
+// Music
+var initialBeat = "0+0+00-00+++-0++";
+var drumInstr = RD_UK_HOUSE_MAINBEAT_10;
+
+function expander(beatString) {
+ var newBeat = "";
+ for (var i = 0; i < beatString.length; i = i + 1) {
+ beatSlice = beatString.substring(0, i);
+ newBeat = newBeat + beatSlice;
+ }
+ // return the new beat string so it can be used outside the function
+ return newBeat;
+}
+
+var finalBeat = expander(initialBeat);
+println(finalBeat);
+
+// makeBeat(drumInstr, 1, 1, initialBeat); // initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/data-structures-string-operations.py.txt b/src/locales/uz/v2/code-examples/data-structures-string-operations.py.txt
new file mode 100644
index 000000000..831ca919d
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/data-structures-string-operations.py.txt
@@ -0,0 +1,23 @@
+# String Operations: Expand a beat string into a longer beat string
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+initialBeat = "0+0+00-00+++-0++"
+drumInstr = RD_UK_HOUSE_MAINBEAT_10
+
+def expander(beatString):
+ newBeat = ""
+ for i in range(0, len(beatString)):
+ beatSlice = beatString[0:i]
+ newBeat = newBeat + beatSlice
+ # return the new beat string so it can be used outside the function
+ return newBeat
+
+finalBeat = expander(initialBeat)
+print(finalBeat)
+
+# makeBeat(drumInstr, 1, 1, initialBeat) # initial beat string
+makeBeat(drumInstr, 1, 1, finalBeat)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
new file mode 100644
index 000000000..69730ced6
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-complex-envelopes.js.txt
@@ -0,0 +1,22 @@
+// Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+// Sozlash
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Envelope time points (in measures)
+var pointA = 1;
+var pointB = 4;
+var pointC = 6.5;
+var pointD = 7;
+var pointE = 8.5;
+var pointF = 9;
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB); // First effect, filter sweep
+
+// Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC); // Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE); // Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF); // End of fade out
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
new file mode 100644
index 000000000..77b4e3278
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-complex-envelopes.py.txt
@@ -0,0 +1,23 @@
+# Complex Envelopes: Using multiple setEffect() calls on a track to make changes in the effect envelope
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Envelope time points (in measures)
+pointA = 1
+pointB = 4
+pointC = 6.5
+pointD = 7
+pointE = 8.5
+pointF = 9
+
+setEffect(1, FILTER, FILTER_FREQ, 20, pointA, 10000, pointB) # First effect, filter sweep
+
+# Second effect, volume changes
+setEffect(1, VOLUME, GAIN, -10, pointB, 0, pointC) # Crescendo
+setEffect(1, VOLUME, GAIN, 0, pointD, -10, pointE) # Begin fade out
+setEffect(1, VOLUME, GAIN, -10, pointE, -60, pointF) # End of fade out
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-delay-effect.js.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
new file mode 100644
index 000000000..6dd44fdc4
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-delay-effect.js.txt
@@ -0,0 +1,25 @@
+// Delay Effect: Adding delay to a track
+
+// Sozlash
+setTempo(120);
+
+// Music
+var lead1 = EIGHT_BIT_ATARI_SYNTH_001;
+var lead2 = EIGHT_BIT_ATARI_SYNTH_002;
+var pad1 = EIGHT_BIT_ATARI_PAD_002;
+var pad2 = EIGHT_BIT_ATARI_PAD_003;
+var drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004;
+var drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003;
+
+fitMedia(lead1, 1, 1, 7);
+fitMedia(lead2, 1, 7, 9);
+fitMedia(pad1, 2, 1, 3);
+fitMedia(pad2, 2, 3, 5);
+fitMedia(pad1, 2, 5, 7);
+fitMedia(pad2, 2, 7, 9);
+fitMedia(drums1, 3, 3, 5);
+fitMedia(drums2, 3, 5, 9);
+
+// Effects
+// setEffect(1, DELAY, DELAY_TIME, 500); // Adds a delay (echo) effect at intervals of 500ms
+// setEffect(1, DELAY, DELAY_FEEDBACK, -20.0); // Lowers the relative amount of repeats (default is -3.0)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-delay-effect.py.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
new file mode 100644
index 000000000..cc7caa380
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-delay-effect.py.txt
@@ -0,0 +1,28 @@
+# Delay Effect: Adding delay to a track
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+lead1 = EIGHT_BIT_ATARI_SYNTH_001
+lead2 = EIGHT_BIT_ATARI_SYNTH_002
+pad1 = EIGHT_BIT_ATARI_PAD_002
+pad2 = EIGHT_BIT_ATARI_PAD_003
+drums1 = EIGHT_BIT_ANALOG_DRUM_LOOP_004
+drums2 = EIGHT_BIT_ANALOG_DRUM_LOOP_003
+
+fitMedia(lead1, 1, 1, 7)
+fitMedia(lead2, 1, 7, 9)
+
+fitMedia(pad1, 2, 1, 3)
+fitMedia(pad2, 2, 3, 5)
+fitMedia(pad1, 2, 5, 7)
+fitMedia(pad2, 2, 7, 9)
+
+fitMedia(drums1, 3, 3, 5)
+fitMedia(drums2, 3, 5, 9)
+
+# Effects
+# setEffect(1, DELAY, DELAY_TIME, 500) # Adds a delay (echo) effect at intervals of 500ms.
+# setEffect(1, DELAY, DELAY_FEEDBACK, -20.0) # Lowers the relative amount of repeats (default is -3.0).
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-envelopes.js.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-envelopes.js.txt
new file mode 100644
index 000000000..657781d54
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-envelopes.js.txt
@@ -0,0 +1,11 @@
+// Envelopes: Making envelopes with 7-parameter setEffect()
+
+// Sozlash
+setTempo(120);
+
+// Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9);
+
+// Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+// This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-envelopes.py.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-envelopes.py.txt
new file mode 100644
index 000000000..ec7e1b173
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-envelopes.py.txt
@@ -0,0 +1,12 @@
+# Envelopes: Making envelopes with 7-parameter setEffect()
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(ELECTRO_ANALOGUE_LEAD_012, 1, 1, 9)
+
+# Makes an effect ramp between measures 1 and 3, moving from -60dB to 0dB.
+# This is a fade in
+setEffect(1, VOLUME, GAIN, -60, 1, 0, 3)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
new file mode 100644
index 000000000..1b342c884
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt
@@ -0,0 +1,28 @@
+// Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+// Sozlash
+setTempo(100);
+
+// Variables
+var melody1 = MILKNSIZZ_ADIOS_BRASS;
+var melody2 = MILKNSIZZ_ADIOS_STRINGS;
+var kick = OS_KICK04;
+var hihat = OS_OPENHAT03;
+var kickBeat = "0-------0-0-0---";
+var hihatBeat = "---0---0--00----";
+
+// Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5);
+fitMedia(melody2, 1, 5, 9);
+
+// Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for (var measure = 1; measure < 9; measure++) {
+ makeBeat(kick, 2, measure, kickBeat);
+ makeBeat(hihat, 3, measure, hihatBeat);
+}
+
+// Adding the fade in and fade out on tracks 1 through 3
+for (var track = 1; track < 4; track++) {
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3);
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
new file mode 100644
index 000000000..41987c497
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt
@@ -0,0 +1,27 @@
+# Fade in and fade out: Looping on all tracks to add a fade in and fade out
+
+# Sozlash
+from earsketch import *
+setTempo(100)
+
+# Variables
+melody1 = MILKNSIZZ_ADIOS_BRASS
+melody2 = MILKNSIZZ_ADIOS_STRINGS
+kick = OS_KICK04
+hihat = OS_OPENHAT03
+kickBeat = "0-------0-0-0---"
+hihatBeat = "---0---0--00----"
+
+# Placing melodies on track 1
+fitMedia(melody1, 1, 1, 5)
+fitMedia(melody2, 1, 5, 9)
+
+# Placing the beats on tracks 2 (kick) and 3 (hihat) thanks to a for loop on measure
+for measure in range(1, 9):
+ makeBeat(kick, 2, measure, kickBeat)
+ makeBeat(hihat, 3, measure, hihatBeat)
+
+# Adding the fade in and fade out on tracks 1 through 3
+for track in range(1, 4):
+ setEffect(track, VOLUME, GAIN, -60, 1, 0, 3)
+ setEffect(track, VOLUME, GAIN, 0, 7, -60, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
new file mode 100644
index 000000000..00d3e6330
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-rhythmic-ramps.js.txt
@@ -0,0 +1,12 @@
+// Rhythmic Ramps: Automating effects with a for loop
+
+// Sozlash
+setTempo(120);
+
+// Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9);
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9);
+
+for (var measure = 1; measure < 9; measure++) {
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
new file mode 100644
index 000000000..008fbcbd1
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-rhythmic-ramps.py.txt
@@ -0,0 +1,12 @@
+# Rhythmic Ramps: Automating effects with a for loop
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y33_CHOIR_1, 1, 1, 9)
+fitMedia(RD_ELECTRO_MAINBEAT_5, 2, 1, 9)
+
+for measure in range(1, 9):
+ setEffect(1, VOLUME, GAIN, -60, measure, 0, measure + 1)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-volume-effect.js.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
new file mode 100644
index 000000000..1f416417e
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-volume-effect.js.txt
@@ -0,0 +1,16 @@
+// Volume Effect: Modifying the volume of 2 tracks
+
+// Sozlash
+setTempo(120);
+
+// Variables
+var piano1 = COMMON_LOVE_THEME_PIANO_2;
+var percussions1 = HOUSE_BREAK_FILL_002;
+
+// Placing the sounds
+fitMedia(piano1, 1, 1, 5);
+fitMedia(percussions1, 2, 3, 5);
+
+// Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2);
+setEffect(2, VOLUME, GAIN, -15);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/effects-and-envelopes-volume-effect.py.txt b/src/locales/uz/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
new file mode 100644
index 000000000..2d5cbcb3d
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/effects-and-envelopes-volume-effect.py.txt
@@ -0,0 +1,17 @@
+# Volume Effect: Modifying the volume of 2 tracks
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Variables
+piano1 = COMMON_LOVE_THEME_PIANO_2
+percussions1 = HOUSE_BREAK_FILL_002
+
+# Placing the sounds:
+fitMedia(piano1, 1, 1, 5)
+fitMedia(percussions1, 2, 3, 5)
+
+# Mixing: increase the piano track and reduce the percussion track volumes
+setEffect(1, VOLUME, GAIN, 2)
+setEffect(2, VOLUME, GAIN, -15)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-boolean-expressions.js.txt b/src/locales/uz/v2/code-examples/get-user-input-boolean-expressions.js.txt
new file mode 100644
index 000000000..dc7ef3dd9
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-boolean-expressions.js.txt
@@ -0,0 +1,12 @@
+// Boolean expressions: printing boolean expressions
+
+// Sozlash
+setTempo(120);
+
+println(!true);
+println(true && false);
+println(true || false);
+println(true && true);
+println((true && false) || true);
+println(true && !false);
+println(!(false || false));
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-boolean-expressions.py.txt b/src/locales/uz/v2/code-examples/get-user-input-boolean-expressions.py.txt
new file mode 100644
index 000000000..940999106
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-boolean-expressions.py.txt
@@ -0,0 +1,11 @@
+# Boolean expressions: printing boolean expressions
+
+from earsketch import *
+
+print(not True)
+print(True and False)
+print(True or False)
+print(True and True)
+print((True and False) or True)
+print(True and not False)
+print(not (False or False))
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-boolean-operations.js.txt b/src/locales/uz/v2/code-examples/get-user-input-boolean-operations.js.txt
new file mode 100644
index 000000000..dc8ea3873
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-boolean-operations.js.txt
@@ -0,0 +1,32 @@
+// Boolean operations: Asking user for genre and creating beat accordingly
+
+// Sozlash
+setTempo(120);
+
+// Sound variables
+var kick = OS_KICK02;
+var hihat = OS_CLOSEDHAT04;
+var clap = OS_CLAP03;
+
+// Beat string variables
+var hiphopKickBeat = "0++++---0+++0+++";
+var hiphopHihatBeat = "----0---00---000";
+var edmKickBeat = "0+++----0+++----";
+var edmClapBeat = "----0-------0---";
+
+// Requesting user input
+var genre = readInput("What genre is your favorite? Hip Hop or EDM?");
+
+// Creating the appropriate rhythm
+if ((genre === "Hip Hop") || (genre === "hip hop") || (genre === "HIP HOP")) {
+ makeBeat(kick, 1, 1, hiphopKickBeat);
+ makeBeat(hihat, 2, 1, hiphopHihatBeat);
+} else if ((genre === "edm") || (genre === "Edm") || (genre === "EDM")) {
+ makeBeat(kick, 1, 1, edmKickBeat);
+ makeBeat(clap, 2, 1, edmClapBeat);
+} else {
+ println("Sorry we couldn't read the genre you selected. Please run the code again.");
+}
+
+// Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-boolean-operations.py.txt b/src/locales/uz/v2/code-examples/get-user-input-boolean-operations.py.txt
new file mode 100644
index 000000000..e77e94b39
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-boolean-operations.py.txt
@@ -0,0 +1,31 @@
+# Boolean operations: Asking user for genre and creating beat accordingly
+
+from earsketch import *
+setTempo(120)
+
+# Sound variables
+kick = OS_KICK02
+hihat = OS_CLOSEDHAT04
+clap = OS_CLAP03
+
+# Beat string variables
+hiphopKickBeat = "0++++---0+++0+++"
+hiphopHihatBeat = "----0---00---000"
+edmKickBeat = "0+++----0+++----"
+edmClapBeat = "----0-------0---"
+
+# Requesting user input
+genre = readInput("What genre is your favorite? Hip Hop or EDM?")
+
+# Creating the appropriate rhythm
+if (genre == "Hip Hop") or (genre == "hip hop") or (genre == "HIP HOP"):
+ makeBeat(kick, 1, 1, hiphopKickBeat)
+ makeBeat(hihat, 2, 1, hiphopHihatBeat)
+elif (genre == "edm") or (genre == "Edm") or (genre == "EDM"):
+ makeBeat(kick, 1, 1, edmKickBeat)
+ makeBeat(clap, 2, 1, edmClapBeat)
+else:
+ print("Sorry we couldn't read the genre you selected. Please run the code again.")
+
+# Adding some reverb on track 2
+setEffect(2, REVERB, MIX, 0.1)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-conditional-statement.js.txt b/src/locales/uz/v2/code-examples/get-user-input-conditional-statement.js.txt
new file mode 100644
index 000000000..d5c1061ad
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-conditional-statement.js.txt
@@ -0,0 +1,23 @@
+// Conditional statement: Using a boolean to create variation in a function
+
+// Sozlash
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start, variation) {
+ // variation is either equal to true or false
+ if (variation) {
+ fitMedia(melody1, 1, start, start + 4);
+ } else {
+ fitMedia(melody2, 1, start, start + 4);
+ }
+ fitMedia(drums1, 2, start, start + 4); // this is outside the conditional statement (no indentation)
+}
+
+// Function calls
+verse(1, true);
+verse(7, false);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-conditional-statement.py.txt b/src/locales/uz/v2/code-examples/get-user-input-conditional-statement.py.txt
new file mode 100644
index 000000000..9c1c36827
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-conditional-statement.py.txt
@@ -0,0 +1,22 @@
+# Conditional statement: Using a boolean to create variation in a function
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+melody2 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_2
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start, variation):
+ # variation is either equal to True or False
+ if variation:
+ fitMedia(melody1, 1, start, start + 4)
+ else:
+ fitMedia(melody2, 1, start, start + 4)
+ fitMedia(drums1, 2, start, start + 4) # this is outside the conditional statement (no indentation)
+
+# Function calls
+verse(1, True)
+verse(7, False)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-return-statements-2.js.txt b/src/locales/uz/v2/code-examples/get-user-input-return-statements-2.js.txt
new file mode 100644
index 000000000..4cb461dae
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-return-statements-2.js.txt
@@ -0,0 +1,18 @@
+// Return Statements 2: Returning the end measure of a section function
+
+// Sozlash
+setTempo(120);
+
+var melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1;
+var drums1 = RD_WORLD_PERCUSSION_DRUMPART_24;
+
+// Function definition
+function verse(start) {
+ var end = start + 4;
+ fitMedia(melody1, 1, start, end);
+ fitMedia(drums1, 2, start, end);
+ return end;
+}
+// Function calls
+var endMeasure = verse(1); // calling verse function and start is measure 1
+println(endMeasure);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-return-statements-2.py.txt b/src/locales/uz/v2/code-examples/get-user-input-return-statements-2.py.txt
new file mode 100644
index 000000000..ff9a56be9
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-return-statements-2.py.txt
@@ -0,0 +1,19 @@
+# Return Statements 2: Returning the end measure of a section function
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+melody1 = RD_WORLD_PERCUSSION_KALIMBA_PIANO_1
+drums1 = RD_WORLD_PERCUSSION_DRUMPART_24
+
+# Function definition
+def verse(start):
+ end = start + 4
+ fitMedia(melody1, 1, start, end)
+ fitMedia(drums1, 2, start, end)
+ return end
+
+# Function calls
+endMeasure = verse(1) # calling verse function and start is measure 1
+print(endMeasure)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-return-statements.js.txt b/src/locales/uz/v2/code-examples/get-user-input-return-statements.js.txt
new file mode 100644
index 000000000..b9554b978
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-return-statements.js.txt
@@ -0,0 +1,25 @@
+// Return Statements: Linking two beats together with return statements
+
+// Sozlash
+setTempo(100);
+
+var rhythm1 = "0+++0+0+0+--0+00";
+var rhythm2 = "0+0-00++0-000+++";
+
+// Music
+function createBeat(startMeasure, sound, beatString) {
+ var endMeasure = startMeasure + 3;
+ for (var measure = startMeasure; measure < endMeasure; measure++) {
+ makeBeat(sound, 1, measure, beatString);
+ }
+
+ // Return ending measure so we can use it outside function
+ return endMeasure;
+}
+
+// Function calls
+// Assigning the value we return to a variable
+var newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1);
+
+// Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-return-statements.py.txt b/src/locales/uz/v2/code-examples/get-user-input-return-statements.py.txt
new file mode 100644
index 000000000..22bf4569c
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-return-statements.py.txt
@@ -0,0 +1,24 @@
+# Return Statements: Linking two beats together with return statements
+
+# Sozlash
+from earsketch import *
+setTempo(100)
+
+rhythm1 = "0+++0+0+0+--0+00"
+rhythm2 = "0+0-00++0-000+++"
+
+# Music
+def createBeat(startMeasure, sound, beatString):
+ endMeasure = startMeasure + 3
+ for measure in range(startMeasure, endMeasure):
+ makeBeat(sound, 1, measure, beatString)
+
+ # Return ending measure so we can use it outside function
+ return endMeasure
+
+# Function calls
+# Assigning the value we return to a variable
+newStart = createBeat(1, HIPHOP_DUSTYGROOVE_007, rhythm1)
+
+# Passing the returned value into another function
+createBeat(newStart, HIPHOP_DUSTYGROOVE_010, rhythm2)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-untitled1.js.txt b/src/locales/uz/v2/code-examples/get-user-input-untitled1.js.txt
new file mode 100644
index 000000000..011e70020
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-untitled1.js.txt
@@ -0,0 +1,2 @@
+var answer = readInput("What tempo would you like for your music?");
+println(answer);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-untitled1.py.txt b/src/locales/uz/v2/code-examples/get-user-input-untitled1.py.txt
new file mode 100644
index 000000000..b2816eba4
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-untitled1.py.txt
@@ -0,0 +1,2 @@
+answer = readInput("What tempo would you like for your music?")
+print(answer)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-user-input-1.js.txt b/src/locales/uz/v2/code-examples/get-user-input-user-input-1.js.txt
new file mode 100644
index 000000000..d3d40f65f
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-user-input-1.js.txt
@@ -0,0 +1,16 @@
+// User input 1: Asking the user for the tempo
+
+// Sozlash
+
+// asking for tempo
+var question = "What tempo would you like for your music? Choose a number between 45 and 220";
+var answer = readInput(question);
+
+// converting to a number
+var tempo = Number(answer);
+
+// setting the tempo
+setTempo(tempo);
+
+// music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-user-input-1.py.txt b/src/locales/uz/v2/code-examples/get-user-input-user-input-1.py.txt
new file mode 100644
index 000000000..bbd35ba9c
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-user-input-1.py.txt
@@ -0,0 +1,17 @@
+# User input 1: Asking the user for the tempo
+
+# Sozlash
+from earsketch import *
+
+# asking for tempo
+question = "What tempo would you like for your music? Choose a number between 45 and 220"
+answer = readInput(question)
+
+# converting to an integer
+tempo = int(answer)
+
+# setting the tempo
+setTempo(tempo)
+
+# music
+fitMedia(COMMON_LOVE_THEME_STRINGS_1, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-user-input-2.js.txt b/src/locales/uz/v2/code-examples/get-user-input-user-input-2.js.txt
new file mode 100644
index 000000000..2dba1259e
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-user-input-2.js.txt
@@ -0,0 +1,12 @@
+// User input 2: Creating a dubstep song with user-specified parameters
+
+// Sozlash
+setTempo(120);
+
+// Music
+var soundNumber = readInput("Type a sound number between 10 and 46: ");
+var dubstepSound = "DUBSTEP_BASS_WOBBLE_0";
+var finalSound = dubstepSound + soundNumber;
+
+// user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/get-user-input-user-input-2.py.txt b/src/locales/uz/v2/code-examples/get-user-input-user-input-2.py.txt
new file mode 100644
index 000000000..96594f81c
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/get-user-input-user-input-2.py.txt
@@ -0,0 +1,13 @@
+# User input 2: Creating a dubstep song with user-specified parameters
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+soundNumber = readInput("Type a sound number between 10 and 46: ")
+dubstepSound = "DUBSTEP_BASS_WOBBLE_0"
+finalSound = dubstepSound + soundNumber
+
+# user-selected dubstep wobbles
+fitMedia(finalSound, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-finding-errors.js.txt b/src/locales/uz/v2/code-examples/getting-started-finding-errors.js.txt
new file mode 100644
index 000000000..d6a6a814f
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-finding-errors.js.txt
@@ -0,0 +1,6 @@
+// Finding errors: Five errors below must be fixed
+
+setTempo(88;
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9);
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_001, 1, 9);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-finding-errors.py.txt b/src/locales/uz/v2/code-examples/getting-started-finding-errors.py.txt
new file mode 100644
index 000000000..1b9dfeb58
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-finding-errors.py.txt
@@ -0,0 +1,7 @@
+# Finding errors: Five errors below must be fixed
+
+from earsketch import *
+setTempo(88
+
+fitMdia(HIPHOP_DUSTYGROOVEPART_001, 1, 1 9)
+fitmedia(2, HIPHOP_DUSTYGROOVEPART_003, 1, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-intro-script.js.txt b/src/locales/uz/v2/code-examples/getting-started-intro-script.js.txt
new file mode 100644
index 000000000..4fdde2fa2
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-intro-script.js.txt
@@ -0,0 +1,7 @@
+// Intro Script: This code adds one sound to the DAW
+
+// Setup Section
+setTempo(120);
+
+// Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-intro-script.py.txt b/src/locales/uz/v2/code-examples/getting-started-intro-script.py.txt
new file mode 100644
index 000000000..4deb9f5f8
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-intro-script.py.txt
@@ -0,0 +1,8 @@
+# Intro Script: This code adds one sound to the DAW
+
+# Setup Section
+from earsketch import *
+setTempo(120)
+
+# Music Section
+fitMedia(TECHNO_SYNTHPLUCK_001, 1, 1, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-using-fitmedia-2.js.txt b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia-2.js.txt
new file mode 100644
index 000000000..7777c5698
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia-2.js.txt
@@ -0,0 +1,9 @@
+// Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+// Setup Section
+setTempo(100);
+
+// Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9);
+fitMedia(Y11_BASS_1, 2, 1, 9);
+fitMedia(Y11_GUITAR_1, 3, 1, 9);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-using-fitmedia-2.py.txt b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia-2.py.txt
new file mode 100644
index 000000000..9d61c38b4
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia-2.py.txt
@@ -0,0 +1,10 @@
+# Using fitMedia() 2: Multiple fitMedia() calls on different tracks
+
+# Setup Section
+from earsketch import *
+setTempo(100)
+
+# Music Section
+fitMedia(Y01_DRUMS_1, 1, 1, 9)
+fitMedia(Y11_BASS_1, 2, 1, 9)
+fitMedia(Y11_GUITAR_1, 3, 1, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-using-fitmedia.js.txt b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia.js.txt
new file mode 100644
index 000000000..8092ef62d
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia.js.txt
@@ -0,0 +1,7 @@
+// Using fitMedia(): Adding a sound to the DAW
+
+// Sozlash
+setTempo(120);
+
+// Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/getting-started-using-fitmedia.py.txt b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia.py.txt
new file mode 100644
index 000000000..df59777db
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/getting-started-using-fitmedia.py.txt
@@ -0,0 +1,8 @@
+# Using fitMedia(): Adding a sound to the DAW
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+fitMedia(Y18_DRUM_SAMPLES_2, 1, 1, 5)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-incrementing.js.txt b/src/locales/uz/v2/code-examples/loops-and-layers-incrementing.js.txt
new file mode 100644
index 000000000..ccda75b7d
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-incrementing.js.txt
@@ -0,0 +1,11 @@
+// Incrementing: Creating an alternating drum beat
+
+setTempo(120);
+
+var groove1 = HIPHOP_DUSTYGROOVE_011;
+var groove2 = HIPHOP_DUSTYGROOVE_010;
+
+for (var measure = 1; measure < 9; measure = measure + 4) {
+ fitMedia(groove1, 1, measure, measure + 2);
+ fitMedia(groove2, 2, measure + 2, measure + 4);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-incrementing.py.txt b/src/locales/uz/v2/code-examples/loops-and-layers-incrementing.py.txt
new file mode 100644
index 000000000..5853e4b9b
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-incrementing.py.txt
@@ -0,0 +1,11 @@
+# Incrementing: Creating an alternating drum beat
+
+from earsketch import *
+setTempo(120)
+
+groove1 = HIPHOP_DUSTYGROOVE_011
+groove2 = HIPHOP_DUSTYGROOVE_010
+
+for measure in range(1, 9, 4):
+ fitMedia(groove1, 1, measure, measure + 2)
+ fitMedia(groove2, 2, measure + 2, measure + 4)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-looping-my-beats.js.txt b/src/locales/uz/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
new file mode 100644
index 000000000..6dc9b3545
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-looping-my-beats.js.txt
@@ -0,0 +1,13 @@
+// Looping my beats: Looping a makeBeat() instruction with a for loop
+
+// Setup:
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// Looping our beat
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-looping-my-beats.py.txt b/src/locales/uz/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
new file mode 100644
index 000000000..766bdab4b
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-looping-my-beats.py.txt
@@ -0,0 +1,13 @@
+# Looping my beats: Looping a makeBeat() instruction with a for loop
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# Looping our beat
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-loops.js.txt b/src/locales/uz/v2/code-examples/loops-and-layers-loops.js.txt
new file mode 100644
index 000000000..8e78701a7
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-loops.js.txt
@@ -0,0 +1,14 @@
+// Loops: Musical repetition created with code loops
+
+// Sozlash
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// Using a loop instead of repeatedly writing similar lines of code
+for (var measure = 1; measure < 9; measure = measure + 1) {
+ fitMedia(drums1, 1, measure, measure + 0.5);
+ fitMedia(drums2, 1, measure + 0.5, measure + 1);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-loops.py.txt b/src/locales/uz/v2/code-examples/loops-and-layers-loops.py.txt
new file mode 100644
index 000000000..16aa39cc3
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-loops.py.txt
@@ -0,0 +1,14 @@
+# Loops: Musical repetition created with code loops
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# Using a loop instead of repeatedly writing similar lines of code
+for measure in range(1, 9):
+ fitMedia(drums1, 1, measure, measure + 0.5)
+ fitMedia(drums2, 1, measure + 0.5, measure + 1)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-no-loops.js.txt b/src/locales/uz/v2/code-examples/loops-and-layers-no-loops.js.txt
new file mode 100644
index 000000000..0df52ea2d
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-no-loops.js.txt
@@ -0,0 +1,27 @@
+// No loops: Musical repetition created without code loops
+
+// Sozlash
+setTempo(120);
+
+// Music
+var drums1 = ELECTRO_DRUM_MAIN_BEAT_008;
+var drums2 = ELECTRO_DRUM_MAIN_BEAT_007;
+
+// All of these fitMedia() calls could be replaced with two calls placed in a loop.
+
+fitMedia(drums1, 1, 1, 1.5);
+fitMedia(drums2, 1, 1.5, 2);
+fitMedia(drums1, 1, 2, 2.5);
+fitMedia(drums2, 1, 2.5, 3);
+fitMedia(drums1, 1, 3, 3.5);
+fitMedia(drums2, 1, 3.5, 4);
+fitMedia(drums1, 1, 4, 4.5);
+fitMedia(drums2, 1, 4.5, 5);
+fitMedia(drums1, 1, 5, 5.5);
+fitMedia(drums2, 1, 5.5, 6);
+fitMedia(drums1, 1, 6, 6.5);
+fitMedia(drums2, 1, 6.5, 7);
+fitMedia(drums1, 1, 7, 7.5);
+fitMedia(drums2, 1, 7.5, 8);
+fitMedia(drums1, 1, 8, 8.5);
+fitMedia(drums2, 1, 8.5, 9);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-no-loops.py.txt b/src/locales/uz/v2/code-examples/loops-and-layers-no-loops.py.txt
new file mode 100644
index 000000000..5f83c6fd3
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-no-loops.py.txt
@@ -0,0 +1,27 @@
+# No loops: Musical repetition created without code loops
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Music
+drums1 = ELECTRO_DRUM_MAIN_BEAT_008
+drums2 = ELECTRO_DRUM_MAIN_BEAT_007
+
+# All of these fitMedia() calls could be replaced with two calls placed in a loop.
+fitMedia(drums1, 1, 1, 1.5)
+fitMedia(drums2, 1, 1.5, 2)
+fitMedia(drums1, 1, 2, 2.5)
+fitMedia(drums2, 1, 2.5, 3)
+fitMedia(drums1, 1, 3, 3.5)
+fitMedia(drums2, 1, 3.5, 4)
+fitMedia(drums1, 1, 4, 4.5)
+fitMedia(drums2, 1, 4.5, 5)
+fitMedia(drums1, 1, 5, 5.5)
+fitMedia(drums2, 1, 5.5, 6)
+fitMedia(drums1, 1, 6, 6.5)
+fitMedia(drums2, 1, 6.5, 7)
+fitMedia(drums1, 1, 7, 7.5)
+fitMedia(drums2, 1, 7.5, 8)
+fitMedia(drums1, 1, 8, 8.5)
+fitMedia(drums2, 1, 8.5, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-printing.js.txt b/src/locales/uz/v2/code-examples/loops-and-layers-printing.js.txt
new file mode 100644
index 000000000..9fcb54478
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-printing.js.txt
@@ -0,0 +1,19 @@
+// Printing: Using println() to print messages in the console
+
+// Sozlash
+setTempo(120);
+
+// Variables
+var drum1 = OS_SNARE03;
+var beat_string = "0---0---0-0-0---";
+
+// First print statement
+println(1 + 3);
+
+// Looping our beat
+// Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for (var measure = 1; measure < 5; measure++) {
+ makeBeat(drum1, 1, measure, beat_string);
+ println(measure);
+ println("ok");
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/loops-and-layers-printing.py.txt b/src/locales/uz/v2/code-examples/loops-and-layers-printing.py.txt
new file mode 100644
index 000000000..f4c584ae7
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/loops-and-layers-printing.py.txt
@@ -0,0 +1,19 @@
+# Printing: Using print() to print messages in the console
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Variables
+drum1 = OS_SNARE03
+beat_string = "0---0---0-0-0---"
+
+# First print statement
+print(1 + 3)
+
+# Looping our beat
+# Note that the print statement is in the for loop so it will be executed at each iteration of the loop.
+for measure in range(1, 5):
+ makeBeat(drum1, 1, measure, beat_string)
+ print(measure)
+ print("ok")
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
new file mode 100644
index 000000000..4941b6c4f
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-analyzetrack.js.txt
@@ -0,0 +1,14 @@
+// analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+// Sozlash
+setTempo(120);
+
+// Placing a sound on track 1
+var sound = COMMON_LOVE_VOX_COMMON_1;
+fitMedia(sound, 1, 1, 9);
+
+// Creating a variable to store the loudness of track 1
+var loudness1 = analyzeTrack(1, RMS_AMPLITUDE);
+
+// Showing the loudness in the console
+println(loudness1);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
new file mode 100644
index 000000000..a81c70c8a
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-analyzetrack.py.txt
@@ -0,0 +1,15 @@
+# analyzeTrack(): Using the analyzeTrack() function to print the loudness of a track
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Placing a sound on track 1
+sound = COMMON_LOVE_VOX_COMMON_1
+fitMedia(sound, 1, 1, 9)
+
+# Creating a variable to store the loudness of track 1
+loudness1 = analyzeTrack(1, RMS_AMPLITUDE)
+
+# Showing the loudness in the console
+print(loudness1)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
new file mode 100644
index 000000000..e54dbe775
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt
@@ -0,0 +1,19 @@
+// Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+// Sozlash
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// If track 1 is louder than track 2, we reduce its volume
+if (loudnessTrack1 > loudnessTrack2) {
+ setEffect(1, VOLUME, GAIN, -10);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
new file mode 100644
index 000000000..cbed5612d
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt
@@ -0,0 +1,19 @@
+# Automatic mixing 1: If track 1 is louder than track 2, we'll reduce its volume
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# If track 1 is louder than track 2, we reduce its volume
+if loudnessTrack1 > loudnessTrack2:
+ setEffect(1, VOLUME, GAIN, -10)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
new file mode 100644
index 000000000..4c57901c8
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt
@@ -0,0 +1,48 @@
+// Automatic Mixing 2: Using conditional statements to mix the tracks
+
+// Sozlash
+setTempo(120);
+
+// Adding a melody and bass
+var melody1 = YG_ALT_POP_GUITAR_3;
+var melody2 = YG_ALT_POP_GUITAR_1;
+var bass1 = YG_ALT_POP_BASS_1;
+var bass2 = DUBSTEP_SUBBASS_008;
+var strings = YG_HIP_HOP_STRINGS_4;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 1, 9, 17);
+fitMedia(bass1, 2, 1, 9);
+fitMedia(bass2, 2, 9, 17);
+fitMedia(strings, 3, 9, 17);
+
+// Adding percussion using makeBeat()
+var beatKick = "0---0-----0-0---";
+var beatSnare = "--0-0------000-";
+var soundKick = OS_KICK02;
+var soundSnare = OS_SNARE06;
+for (var measure = 5; measure > 17; measure++) {
+ makeBeat(soundKick, 4, measure, beatKick);
+ makeBeat(soundSnare, 5, measure, beatSnare);
+}
+
+// Mixing my tracks
+// First, we analyze the tracks for loudness
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+println("The loudness of track 1 is" + loudnessTrack1);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+println("The loudness of track 2 is" + loudnessTrack2);
+var loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE);
+println("The loudness of track 3 is" + loudnessTrack3);
+
+if (loudnessTrack1 < loudnessTrack2) {
+ // if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 2");
+} else if (loudnessTrack1 < loudnessTrack3) {
+ // if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5);
+ println("track 1 was quieter than track 3");
+} else {
+ // if track 1 is louder than tracks 2 and 3, then we change nothing
+ println("track 1 was the loudest track already");
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
new file mode 100644
index 000000000..cc110c823
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt
@@ -0,0 +1,47 @@
+# Automatic Mixing 2: Using conditional statements to mix the tracks
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Adding a melody and bass
+melody1 = YG_ALT_POP_GUITAR_3
+melody2 = YG_ALT_POP_GUITAR_1
+bass1 = YG_ALT_POP_BASS_1
+bass2 = DUBSTEP_SUBBASS_008
+strings = YG_HIP_HOP_STRINGS_4
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 1, 9, 17)
+fitMedia(bass1, 2, 1, 9)
+fitMedia(bass2, 2, 9, 17)
+fitMedia(strings, 3, 9, 17)
+
+# Adding percussion using makeBeat()
+beatKick = "0---0-----0-0---"
+beatSnare = "--0-0------000-"
+soundKick = OS_KICK02
+soundSnare = OS_SNARE06
+for measure in range(5, 17):
+ makeBeat(soundKick, 4, measure, beatKick)
+ makeBeat(soundSnare, 5, measure, beatSnare)
+
+# Mixing my tracks
+# First, we analyze the tracks for loudness
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+print("The loudness of track 1 is" + str(loudnessTrack1))
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+print("The loudness of track 2 is" + str(loudnessTrack2))
+loudnessTrack3 = analyzeTrack(3, RMS_AMPLITUDE)
+print("The loudness of track 3 is" + str(loudnessTrack3))
+
+if loudnessTrack1 < loudnessTrack2:
+ # if track 1 is quieter than track 2 then we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 2")
+elif loudnessTrack1 < loudnessTrack3:
+ # if track 1 is louder than track 2 but quieter than track 3, we increase the volume of track 1
+ setEffect(1, VOLUME, GAIN, +5)
+ print("track 1 was quieter than track 3")
+else:
+ # if track 1 is louder than tracks 2 and 3, then we change nothing
+ print("track 1 was the loudest track already")
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
new file mode 100644
index 000000000..cac60a6f9
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-boolean-example.js.txt
@@ -0,0 +1,26 @@
+// Boolean Example: We analyze the loudness of our tracks
+// Sozlash
+setTempo(120);
+
+// Creating 2 tracks
+var melody1 = RD_CINEMATIC_SCORE_STRINGS_14;
+var melody2 = RD_UK_HOUSE__5THCHORD_1;
+fitMedia(melody1, 1, 1, 9);
+fitMedia(melody2, 2, 1, 9);
+
+// Evaluating the loudness of the tracks
+var loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE);
+var loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE);
+
+// Checking if track 1 is louder than track 2
+// We create the boolean comparison1
+var comparison1 = (loudnessTrack1 > loudnessTrack2);
+println("Is track 1 louder than track 2?");
+println(comparison1);
+
+// Creating a for loop to compare each track's loudness to 0.01
+for (var track = 1; track < 3; track++) {
+ var loudness = analyzeTrack(track, RMS_AMPLITUDE);
+ println("Is track number " + track + " greater than 0.01?");
+ println(loudness > 0.01);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
new file mode 100644
index 000000000..3ef8baea9
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-boolean-example.py.txt
@@ -0,0 +1,27 @@
+# Boolean Example: We analyze the loudness of our tracks
+
+# Sozlash
+from earsketch import *
+setTempo(120)
+
+# Creating 2 tracks
+melody1 = RD_CINEMATIC_SCORE_STRINGS_14
+melody2 = RD_UK_HOUSE__5THCHORD_1
+fitMedia(melody1, 1, 1, 9)
+fitMedia(melody2, 2, 1, 9)
+
+# Evaluating the loudness of the tracks
+loudnessTrack1 = analyzeTrack(1, RMS_AMPLITUDE)
+loudnessTrack2 = analyzeTrack(2, RMS_AMPLITUDE)
+
+# Checking if track 1 is louder than track 2
+# We create the boolean comparison1
+comparison1 = loudnessTrack1 > loudnessTrack2
+print("Is Track 1 louder than track 2?")
+print(comparison1)
+
+# Creating a for loop to compare each track's loudness to 0.01
+for track in range(1, 3):
+ loudness = analyzeTrack(track, RMS_AMPLITUDE)
+ print("Is track number " + str(track) + " greater than 0.01?")
+ print(loudness > 0.01)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled1.js.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
new file mode 100644
index 000000000..55a1ec545
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled1.js.txt
@@ -0,0 +1,4 @@
+if (condition) {
+ // Here write the instructions the computer needs to execute if the condition evaluates to true
+ // Note that the instructions are indented, just like in for loops
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled1.py.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
new file mode 100644
index 000000000..981b4a4bf
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled1.py.txt
@@ -0,0 +1,3 @@
+if condition:
+ # Here write the instructions the computer needs to execute if the condition evaluates to True
+ # Note that the instructions are indented, just like in for loops
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled2.js.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
new file mode 100644
index 000000000..4f67f2e7a
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled2.js.txt
@@ -0,0 +1,10 @@
+if (condition1) {
+ // Here write the instructions the computer needs to execute if the condition1 evaluates to true
+} else if (condition2) {
+ // Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+ // elif is short for else if
+} else if (condition3) {
+ // Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+} else {
+ // Here write the instructions in case all 3 conditions are False
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled2.py.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
new file mode 100644
index 000000000..1242cd897
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled2.py.txt
@@ -0,0 +1,8 @@
+if condition1:
+ # Here write the instructions the computer needs to execute if the condition1 evaluates to True. If it's False, move to the next line
+elif condition2:
+ # Here write the instructions if condition2 is True. If condition2 is False, move to the next line
+elif condition3:
+ # Here write the instructions if condition3 is True. If condition3 is False, move to the next line
+else:
+ # Here write the instructions in case all 3 conditions are False
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled3.js.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
new file mode 100644
index 000000000..a8675a857
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled3.js.txt
@@ -0,0 +1,6 @@
+var n = 5;
+if (n * 3 === 15) {
+ println(5 + n);
+} else {
+ println(n);
+}
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled3.py.txt b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
new file mode 100644
index 000000000..1695465a4
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/mixing-with-conditionals-untitled3.py.txt
@@ -0,0 +1,5 @@
+n = 5
+if (n * 3) == 15:
+ print(n + 5)
+else:
+ print(n)
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/your-first-song-comments.js.txt b/src/locales/uz/v2/code-examples/your-first-song-comments.js.txt
new file mode 100644
index 000000000..41972fc1e
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/your-first-song-comments.js.txt
@@ -0,0 +1,20 @@
+// Comments: Using comments to describe what the code does
+
+// Sozlash
+setTempo(130);
+
+// Music
+// Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5);
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9);
+
+// Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9);
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5);
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9);
+
+// Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9);
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9);
\ No newline at end of file
diff --git a/src/locales/uz/v2/code-examples/your-first-song-comments.py.txt b/src/locales/uz/v2/code-examples/your-first-song-comments.py.txt
new file mode 100644
index 000000000..77fa1e3f8
--- /dev/null
+++ b/src/locales/uz/v2/code-examples/your-first-song-comments.py.txt
@@ -0,0 +1,21 @@
+# Comments: Using comments to describe what the code does
+
+# Sozlash
+from earsketch import *
+setTempo(130)
+
+# Music
+# Leads
+fitMedia(RD_EDM_ANALOGPLUCK_1, 1, 1, 9)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_5, 2, 1, 5)
+fitMedia(RD_TRAP_ARPBLEEPLEAD_3, 2, 5, 9)
+
+# Beat
+fitMedia(HOUSE_BREAKBEAT_023, 3, 1, 9)
+fitMedia(HOUSE_BREAKBEAT_006, 4, 1, 3)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 3, 5)
+fitMedia(HOUSE_BREAKBEAT_012, 4, 7, 9)
+
+# Bass and noise
+fitMedia(ELECTRO_ANALOGUE_BASS_008, 5, 1, 9)
+fitMedia(TECHNO_WHITENOISESFX_001, 6, 7, 9)
\ No newline at end of file
diff --git a/src/locales/uz/v2/custom-functions.adoc b/src/locales/uz/v2/custom-functions.adoc
new file mode 100644
index 000000000..d5381d103
--- /dev/null
+++ b/src/locales/uz/v2/custom-functions.adoc
@@ -0,0 +1,285 @@
+[[customfunctionssongstructure]]
+== Custom Functions and Song Structure
+
+:nofooter:
+
+Qo'shiq tuzilmasi vaqt o'tishi bilan qo'shiqni tashkillashtirishdir. The goal is to create meaningful sections and transitions for the flow of your music. Ushbu bobda siz qo'shiqlaringizni tuzish uchun shaxsiy funktsiyangizni, maxsus funktsiyalarni yaratasiz!
+
+[[asongsstructure]]
+=== Qo'shiq tuzilishi
+
+:nofooter:
+
+Qo'shiqni *bo'limlarga* bo'lish mumkin. A section is made up of several measures (musical time units), and it expresses an idea or feeling. Usually, musicians try to add contrast between different sections. _Intro, Verse, Chorus_, and _Outro_ are examples of sections.
+
+Umumiy va oddiy *shakl* yoki qo'shiq tuzilishi ABA hisoblanadi. A and B are two different sections, for example chorus and verse. The B section adds variety, while returning to the A section invokes familiarity. The code below creates an ABA form. Section B features contrasting sounds to Section A - a slower and louder bass, and an additional rattling:
+
+[[imediau2sections_052016png]]
+.An ABA form within the EarSketch DAW
+[caption="Figure 9.2: "]
+image::../media/U2/sections_052016.png[Alt Text]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-form.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-form.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Select a song that you like. Listen to it and try to notice the different sections. Can you tell when the musicians change sections? How many times do you hear the chorus and verse? What kind of contrasts can you observe? Share your example with your neighbor.
+****
+
+Keep in mind that a musical phrase sounds most natural when sounds are arranged into groups of two, four, eight, sixteen, etc. So your sections should preferably have a size of two, four, eight, or sixteen measures.
+
+[[creatingyourcustomfunctions]]
+=== Create your custom functions
+
+In the previous example with the ABA song, the code is large, and the code is repeated for the second A section. There is a way to be more concise, thanks to *custom functions*! We will define a function that will represent section A, then call the function twice.
+
+The difference with functions that you have used like `fitMedia()`, is that `fitMedia()` is already pre-defined by our team to play a sound. In a custom function, you get to define exactly what it does. Here is how you would define section A:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-untitled1.js.txt[]
+----
+
+. `sectionA()` is the name we chose for our function. You can choose any name you like. Try to name your function in a descriptive way so your code is easier to read.
+. Ko'rsatmalar funktsiyaning *tanasi* hisoblanadi. They are indented.
+
+.PRACTICE
+****
+Paste this code in a new script, and run it. You should see that your DAW remains empty.
+Buning sababi, uni ishlatish uchun funktsiyani *chaqirishingiz* kerak.
+Funktsiyangizni chaqirish uchun funktsiya izohidan so'ng `sectionA()` qatorini chekintirmasdan qo'shing. When running the code, you should see section A in your DAW
+****
+
+Now we want to add section A from measures nine to thirteen. However, when we call `sectionA()`, the sounds are placed from measures one to five. Ushbu muammoni hal qilishda biz funktsiyamiz uchun *parametrlarni* yaratamiz.
+
+.PRACTICE
+****
+In your current script you created for the previous practice problem:
+
+1. Add the parameters `startMeasure` and `endMeasure` separated by a comma between the parentheses of the sectionA function in its definition like this: `sectionA(startMeasure,endMeasure)`.
+1. In the function's body, replace the start measure (`1`) and end measure (`5`) by `startMeasure` and `endMeasure` respectively.
+1. Funktsiyangizni chaqirganingizda, qavslar orasiga `1` va `5` parametrlarini qo'shing. Run the code to make sure there is no error.
+1. Bu safar `9` va `13` parametrlari bilan ikkinchi funktsiya chaqiruvini qo'shing. Run the code to make sure there is no error.
+1. Define a function for section B, using the same process, and call section B from measures five to nine and from measures thirteen to seventeen.
+****
+
+Here is what your code could look like:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-a-b-a-b-form-and-custom-functions.js.txt[]
+----
+
+//The following video will be cut in 2 with the beginning going to chapter 7.1, and the end to this chpater. For more info see https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020//
+
+[role="curriculum-python curriculum-mp4"]
+[[video93py]]
+video::./videoMedia/009-03-CustomFunctions-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video93js]]
+video::./videoMedia/009-03-CustomFunctions-JS.mp4[]
+
+[[transitionstrategies]]
+=== Transition Strategies
+
+Endi siz qo'shiqni tuzish uchun maxsus funktsiyalarni qanday yaratishni bilasiz, keling, o'tishlarni ko'rib chiqaylik. *O'tishlar* bir bo'lim ikkinchisiga silliq o'tishiga yordam beradi. They can connect verse and chorus, build up to a drop, mix between tracks (DJing), or change keys. O'tishning maqsadi tinglovchining e'tiborini jalb qilish va ularga o'zgarish sodir bo'lishini bildirishdir.
+
+Following are some popular strategies for creating musical transitions:
+
+. *To'qnashuv Simbali*: To'qnashuv Simbalini yangi qismning birinchi zarbasiga joylashtirish.
+. *Baraban bilan toʻldirish*: Yangi boʻlim oldidagi boʻshliqni toʻldirish uchun ritmik oʻzgarishlar.
+. *Track Silencing*: Silence some tracks temporarily for dramatic effect.
+. *Ohangning o'zgarishi*: yangi bo'lim oldidan akkordlar, bass qatori yoki ohangning o'zgarishini kiritish. Often, a folder within the EarSketch sound library contains variations of a similar riff.
+. *Ko'taruvchi*: Tovush pardasini oshiradigan nota yoki shovqin. It is very common in EDM (Electronic Dance Music) and creates an anticipation of a drop. You can use the search term "riser" in the Sound Browser. A reversed crash cymbal can be used as a riser, like YG_EDM_REVERSE_CRASH_1.
+. *Pistirma Kasri*: ortib borayotgan zichlik, tovush pardasi yoki amplituda bilan takrorlangan pistirma urishlar ketma-ketligi. You can use a sound like RD_FUTURE_DUBSTEP_FILL_1 or HOUSE_BREAK_FILL_003, or with `makeBeat()`.
+. *Halqalash*: yangi qism oldidan qisqa musiqa segmentini takrorlash.
+. *Krossfeyding*: Bir qismning ovozini balandligini pasaytirish va yangi bo'limning ovoz balandligini oshirish.
+. *Anakrusis*: Yangi bo'limning ohangi ikki zarbaga ertaroq boshlanganadi.
+
+.PRACTICE
+****
+Looking at this list of possible transitions, select two of them and try to see how you could implement them using code. You can work in pairs. Bu haqda o'ylab ko'rganingizdan so'ng, quyidagi misollarni ko'rishingiz mumkin.
+
+The transition should be placed one or two measures before the new section. You can use several transition techniques at the same time.
+****
+
+Drum fills:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-drum-fill.js.txt[]
+----
+
+The track silencing technique only requires the modification of a couple `fitMedia()` calls. An example is shown below.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-track-droupouts.js.txt[]
+----
+
+The next example uses multiple risers and a crash cymbal during the transition.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-transition-techniques-risers.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-transition-techniques-risers.js.txt[]
+----
+
+{nbsp} +
+
+[[yourfullsong]]
+=== Your full song
+
+In programming we can create *abstractions*, the bundling of ideas to form a single concept. In music, we group musical ideas into sections. Functions are one kind of abstraction used in computer science. They pack multiple statements into one tool so they can be easily referred to. Abstractions can make the form of a program clearer.
+
+.PRACTICE
+****
+Keling, EarSketch-da siz kashf etgan barcha vositalardan foydalangan holda to'liq qo'shiq yarataylik! Here is a suggestion of how to work, but you can adapt it as you like:
+
+. Choose a theme for your song. Think about the type of sounds, instruments, or lyrics that will best convey your message.
+. Then select a simple structure.
+. And finally, start coding! Tovushlarni tanlash uchun `fitMedia()` funktsiyalaridan boshlang.
+. Zarbdorlik qoʻshish uchun `makeBeat()` dan foydalaning.
+. You can upload your own sounds.
+. Kodingizdagi takrorlanishni kamaytirish uchun `for` halqalaridan foydalaning.
+. Use custom functions to define your sections and create your song structure.
+. Add one or two meaningful transitions.
+. Add effects with `setEffect()`.
+. Add one or several conditional statements.
+. Make sure you use variables to store some information such as sound constants.
+. Make sure you use comments to explain what you are doing.
+. Kodingizni muntazam ravishda ishga tushirishni va qo'shiqni tinglashni unutmang. This will help you modify it until you like the sound of it.
+. Choose a name for your song.
+****
+
+Here is an example of a full song:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/custom-functions-total-atlanta-song-of-summer.js.txt[]
+----
+
+In this example, we have used a `for` loop inside a custom function! Biz for halqasi ichida (`start` va `end`) funktsiya parametrlaridan foydalandik.
+
+[[chapter7summary]]
+=== Chapter 7 Summary
+
+* *Bo'limlar* bir nechta o'lchovlardan tashkil topgan o'zaro bog'liq musiqa birliklari. Each expresses an idea or feeling.
+* *Oʻtishlar* musiqaning ketma-ket musiqiy boʻlimlarini bogʻlash uchun foydalaniladigan parchalardir.
+* Qo'shiqning tuzilishi va xilma-xilligi uning *shakli* deb nomlanadi. A common musical form is A-B-A.
+* *Maxsus funktsiyalar* - bu muayyan vazifani bajarish uchun dasturchi tomonidan yozilgan noyob funktsiyalar. You have to create a custom function to be able to call it. You can create as many parameters as you want.
+* *Abstraktsiya* - bu yagona, ko'pincha unchalik murakkab bo'lmagan tushunchani shakllantirish uchun g'oyalar to'plami. Functions are an example of abstraction.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of these is NOT an example of a musical section?
+
+[answers]
+* Drums
+* Intro
+* Verse
+* Chorus
+--
+
+[question]
+--
+What is an abstraction?
+
+[answers]
+* A bundling of ideas to form a single concept
+* A variety of sounds throughout sections
+* Parts of a song that are related, but also are distinct from each other
+* A statement that returns a value to the function call
+--
+
+[role="curriculum-python"]
+[question]
+--
+Ushbu variantlardan qaysi biri `myFunction()` funktsiyasini `startMeasure` va `endMeasure` parametrlari bilan toʻgʻri belgilaydi?
+
+[answers]
+* `def myFunction(startMeasure, endMeasure):`
+* `def myFunction():`
+* `myFunction(startMeasure, endMeasure):`
+* `myFunction(2, 5)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Ushbu variantlardan qaysi biri `myFunction()` funktsiyasini `startMeasure` va `endMeasure` parametrlari bilan toʻgʻri belgilaydi?
+
+[answers]
+* `function myFunction(startMeasure, endMeasure) {}`
+* `function myFunction() {}`
+* `myFunction(startMeasure, endMeasure){}`
+* `myFunction(2, 5)`
+--
+
+[question]
+--
+Which of these is NOT an example of a transition?
+
+[answers]
+* Melody Consistency
+* Crash Cymbal
+* Riser
+* Track Silencing
+--
\ No newline at end of file
diff --git a/src/locales/uz/v2/data-structures.adoc b/src/locales/uz/v2/data-structures.adoc
new file mode 100644
index 000000000..a6904c24c
--- /dev/null
+++ b/src/locales/uz/v2/data-structures.adoc
@@ -0,0 +1,497 @@
+[[getorganizedwithdatastructures]]
+== Data Structures
+
+:nofooter:
+
+[role="curriculum-python"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. Ushbu bo'lim sizga kodingizni yanada tartibga solishga, xususan, ro'yxatlar deb nomlangan maxsus abstraktsiya va `makeBeat()`ning yangi funktsiyasidan foydalangan holda yordam beradi.
+
+[role="curriculum-javascript"]
+You now have numerous tools at your disposal to create songs with EarSketch. The scripts you write might get very diversified and long. Ushbu bo'lim sizga kodingizni yanada tartibga solishga, xususan, massivlar deb nomlangan maxsus abstraktsiya va `makeBeat()`ning yangi funktsiyasidan foydalangan holda yordam beradi.
+
+[[datastructures]]
+=== What is a Data Structure
+
+[role="curriculum-python"]
+If you have very long lists of sound variables, it's possible to organize them using *lists*. A *list*, also called an array in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-javascript"]
+If you have very long lists of sound variables, it's possible to organize them using *arrays*. An *array*, also called a list in some programming languages, is a collection of values, or *elements*, between brackets (`[]`) and separated by commas. Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-instead-of-writing-this.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-instead-of-writing-this.js.txt[]
+----
+
+[role="curriculum-python"]
+If you have replaced variables with a list, how will you reference the content of the list? We use indices. Roʻyxatning har bir elementiga `0` dan boshlab indeks beriladi. Avvalgi misolda `drums[0]` - `OS_KICK03`ni, `drums[1]` - `OS_OPENHAT01`ni va `drums[2]` - `OS_SNARE05`ni chaqirmoqda.
+
+[role="curriculum-javascript"]
+If you have replaced variables with an array, how will you reference the content of the array? We use indices. Massivning har bir elementiga `0` dan boshlab indeks beriladi. Avvalgi misolda `drums[0]` - `OS_KICK03`ni, `drums[1]` - `OS_OPENHAT01`ni va `drums[2]` - `OS_SNARE05`ni chaqirmoqda.
+
+.PRACTICE
+****
+Create a list/array with three sounds.
+Then using three `fitMedia()` calls, place three sounds on tracks `1`, `2` and `3` from measures `1` to `5`.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-list.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-arrays.js.txt[]
+----
+
+//.The EarSketch Share window for collaboration (Let Others Edit)
+
+//[caption="Figure 21.4.2: "]
+
+image::../media/U3/18_1_Graphics_ES.jpg[Alt Text]
+
+[role="curriculum-python"]
+We've seen that `list[index]` will reference an element of the list. This can also be used to modify an element of the list. For example, `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` in the previous example will change the first element of the list to `RD_ROCK_POPRHYTHM_MAINDRUMS_11`. This process is similar to updating a variable. U `=` *tayinlash operatoridan* foydalanadi.
+
+[role="curriculum-javascript"]
+We've seen that `array[index]` will reference an element of the array. This can also be used to modify an element of the array. Masalan, oldingi misoldagi `myEnsemble[0] = RD_ROCK_POPRHYTHM_MAINDRUMS_11` massivning birinchi elementini `RD_ROCK_POPRHYTHM_MAINDRUMS_11` ga o'zgartiradi. This process is similar to updating a variable. U `=` *tayinlash operatoridan* foydalanadi.
+
+.PRACTICE
+****
+In the previous example, use a `for` loop instead of calling `fitMedia()` three times. You can use the track number as the counter.
+Indeks raqami `0` da, trekingiz esa `1` da boshlanishi kerak. For halqasi ichida trek raqamidan bittaga kam bo'lgan raqamga teng `indeks` o'zgaruvchisini yaratishingiz kerak bo'ladi.
+****
+
+Below is an example. You can have a look in the console to see what is printed when you run the code.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-iterating-through-lists.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-iterating-through-arrays.js.txt[]
+----
+
+[role="curriculum-python"]
+A useful tip: `len()` function, with the name of the list as parameter, returns the number of elements of the list. Demak, `list[0]` - `list`ning birinchi elementi va `list[len(list) - 1]` oxirgi elementi hisoblanadi. Masalan, agar `list = ["Salom", "o'rtoq", "EarSketchchilar"];` bo'lsa, `len(list)` `3`ni qaytaradi. Indekslar `0`, `1` va `2`. The last index is 3-1 = 2.
+
+[role="curriculum-javascript"]
+Foydali maslahat: `length` xususiyati (`array.length`) massiv elementlari sonini qaytaradi. Demak, `massiv[0]` - `massiv`ning birinchi elementi, `massiv[array.length - 1]` esa oxirgi elementi hisoblanadi. Masalan, agar `array = ["Salom", "o'rtoq", "EarSketchchilar"];` bo'lsa, `array.length` `3`ni qaytaradi. Indekslar `0`, `1` va `2`. The last index is 3-1 = 2.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using a list and a `for` loop, create such an introduction from measures `1` to `5`. Oldingi misolda bo'lgani kabi, hisoblagich sifatida `trek`dan foydalanishingiz mumkin va siz `indeks` o'zgaruvchisini yaratishingiz kerak bo'ladi. Bundan tashqari, siz `len()` funktsiyasidan foydalanib, `o'lchov` oʻzgaruvchisini yaratishingiz mumkin.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+We will create an additive introduction in EarSketch in which instruments (tracks) are added to the music one by one over time. For example, the first track starts at measure `1`, then the second track starts at measure `2`, and so on. This is commonly used for a song's introduction.
+
+Using an array and a `for` loop, create such an introduction from measures `1` to `5`. Oldingi misolda bo'lgani kabi, hisoblagich sifatida `trek`dan foydalanishingiz mumkin va siz `indeks` o'zgaruvchisini yaratishingiz kerak bo'ladi. Bundan tashqari, siz `length` xususiyatidan foydalanib, `o'lchov` o‘zgaruvchisini yaratishingiz mumkin.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-additive-introduction.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-additive-introduction.js.txt[]
+----
+
+{nbsp} +
+
+[[usingdatastructureswithmakebeat]]
+=== Ma'lumot Tuzilmalaridan `makeBeat()` bilan foydalaning
+
+[role="curriculum-python"]
+We will see two ways you can use data structures with `makeBeat()`. Birinchidan, keling, satrlar va ro'yxatlar qanchalik o'xshashligini ko'rib chiqaylik:
+
+[role="curriculum-javascript"]
+We will see two ways you can use data structures with `makeBeat()`. Birinchidan, keling, satrlar va massivlar qanchalik o'xshashligini ko'rib chiqaylik:
+
+[role="curriculum-python"]
+* Like lists, strings have indices. *Indeks* 0 dan boshlanadigan satrdagi ma'lum bir belgining o'rnini ifodalaydi. Masalan, `"Sarah"[3]` `a` ni qaytaradi.
+* Siz satrlar bilan `len()` funktsiyasidan foydalanishingiz mumkin, bu satrdagi belgilar miqdorini qaytaradi. Oxirgi belgi `len(string) - 1` indeksida.
+`"EarSketch"` satrining indekslari quyidagi jadvalda ko'rsatilgan.
+
+[role="curriculum-javascript"]
+* Like arrays, strings have indices. *Indeks* 0 dan boshlanadigan satrdagi ma'lum bir belgining o'rnini ifodalaydi. Masalan, `"Sarah"[3]` `a` ni qaytaradi.
+* Siz satrlar bilan `.length` xususiyatidan foydalanishingiz mumkin, bu satrdagi belgilar miqdorini qaytaradi. Oxirgi belgi `string.length - 1` indeksida.
+`"EarSketch"` satrining indekslari quyidagi jadvalda ko'rsatilgan.
+
+[cols="h,^,^,^,^,^,^,^,^,^"]
+|===
+|Character
+|E
+|a
+|r
+|S
+|k
+|e
+|t
+|c
+|h
+
+|Index
+|0
+|1
+|2
+|3
+|4
+|5
+|6
+|7
+|8
+|===
+
+[role="curriculum-python"]
+* You can concatenate lists together like you do with strings. Yopishtirish operatoridan foydalaning (`+`): sintaksisi `newList = listA + listB`.
+
+[role="curriculum-javascript"]
+* You can concatenate arrays together like you do with strings. Biz "yopishtirish" *usuli*dan foydalanamiz. A method is similar to a function as it has parentheses which contain parameters. Uni ishlatish uchun uni massiv nomidan keyin, nuqta bilan qo'ying: sintaksis `newArray = arrayA.concat(arrayB)`. Bu *nuqtali qaydnoma* deb ataladi.
+
+[role="curriculum-python"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Uning sintaksisi `newString = oldString[startIndex: endIndex]`. Quyi-satr `startIndex` belgisini o`z ichiga oladi, lekin `endIndex` belgisini olmaydi. Masalan, `"Sarah[1:4]"` `"ara"`ni qaytaradi. Roʻyxatlar bilan ham xuddi shunday qilishingiz mumkin: `newList = oldList[startIndex: endIndex]`.
+
+[role="curriculum-javascript"]
+* You can get a *substring*, also known as a slice, of a larger string. This allows a beat to be sliced up, a popular technique in electronic music and remixing. Uning sintaksisi `newString = oldString.substring(startIndex, endIndex)`. Quyi-satr `startIndex` belgisini o`z ichiga oladi, lekin `endIndex` belgisini olmaydi. Masalan, `"Sarah.substring(1, 4)"` - `"ara"`ni qaytaradi. Siz `slice()` usuli yordamida massivlar bilan ham shunday qilishingiz mumkin: `newList = oldList.slice(startIndex, endIndex)`. `concat()`, `substring()` va `slice()` usullar bo`lib, barchasi nuqta belgilaridan foydalanadi.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound lists (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your lists.
+. `stringA` va `stringB` yopishmasidan `stringC` yarating va chop eting.
+. `SoundsA`, `soundsB` va yana `soundsA` yopishmasidan `SoundsC` yarating va chop eting.
+. `stringC` ning ikkinchidan beshinchigacha belgilarini o'z ichiga olgan qismidan `stringD` yarating va chop eting.
+. `soundsC` ning uchinchidan oxirgi elementigacha bo'lgan qismidan `soundsD` yarating va chop eting.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+In a new script:
+
+. Create four variables: two beat strings (`stringA` and `stringB`) and two sound arrays (`soundsA` and `soundsB`).
+. Print the second character of each string.
+. Print the last element of your arrays.
+. `stringA` va `stringB` yopishmasidan `stringC` yarating va chop eting.
+. `SoundsA`, `soundsB` va yana `soundsA` yopishmasidan `SoundsC` yarating va chop eting.
+. `stringC` ning ikkinchidan beshinchigacha belgilarini o'z ichiga olgan qismidan `stringD` yarating va chop eting.
+. `soundsC` ning uchinchidan oxirgi elementigacha bo'lgan qismidan `soundsD` yarating va chop eting.
+****
+
+Here is an example of a solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-and-lists-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-and-lists-operations.js.txt[]
+----
+
+Bu `makeBeat()` orqali satr amaliyotlaridan qanday foydalanishga misol:
+
+[role="curriculum-python curriculum-mp4"]
+[[video13py]]
+video::./videoMedia/013-03-Substrings-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video13js]]
+video::./videoMedia/013-03-Substrings-JS.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-string-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-string-operations.js.txt[]
+----
+
+[role="curriculum-python"]
+Finally, `makeBeat()` can handle multiple sounds at once. Bu sizga faqatgina bir `makeBeat()` qatori yordamida barcha zarbdor tovushlarni bitta trekka joylashtirish imkonini beradi. Instead of passing your sound file as a first argument, you will pass a list of sounds. Zarba satrida tovushni ijro etish uchun “0” dan foydalanish o‘rniga “0”dan “9”gacha bo‘lgan raqamlardan foydalanishingiz mumkin. These numbers indicate an index in your list of sounds. Check out the example "before and after" below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-javascript"]
+Finally, `makeBeat()` can handle multiple sounds at once. Bu sizga faqatgina bir `makeBeat()` qatori yordamida barcha zarbdor tovushlarni bitta trekka joylashtirish imkonini beradi. Instead of passing your sound file as a first argument, you will pass an array of sounds. Zarba satrida tovushni ijro etish uchun “0” dan foydalanish o‘rniga “0”dan “9”gacha bo‘lgan raqamlardan foydalanishingiz mumkin. These numbers indicate an index in your array of sounds. Check out the "before and after" example below, with the "boom bap boom bap" rhythm.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-making-a-drum-set.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-making-a-drum-set.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Copy the code example in chapter 3.4 for beats by genre. Har bir janrda faqat bitta `makeBeat()` qatoriga ega bo'lish uchun kodni o'zgartiring. Sometimes, the hihat is playing at the same time as the kick or snare. Bunday holda, siz faqat likopcha uchun bitta “makeBeat()” qatoriga ega bo'lishingiz mumkin.
+****
+
+Here is the solution:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/data-structures-examples-of-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/data-structures-examples-of-beats.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ushbu bobda o'rganganlaringizdan foydalanib, `makeBeat()` yordamida o'zingizga yoqadigan ritmlarni yarating. You can refer to the video in chapter 3.4 for beats by genre. Kodingizni ishga tushirishingiz, yaratgan narsalaringizni tinglashingiz va uni sizga yoqmagunga qadar o'zgartirishingiz mumkinligini unutmang.
+****
+
+{nbsp} +
+
+[[evaluatingcorrectness]]
+=== Evaluate Correctness
+
+Congratulations, now you have acquired musical and coding skills that allow you to be creative with EarSketch! One last thing we want to make sure of is that your code is as neat as possible. Here are some elements that you can check:
+
+* *Conciseness* means brief code that accomplishes its goal with fewer lines. Here are some questions that can help you make your code more concise:
+** Did I copy/paste function calls several times in a row? If so, simplify with a loop!
+** Am I reusing any blocks of code? If so, put them in a function!
+** Are there sound constants or mathematical expressions that I use repeatedly throughout my code? If so, assign them to variables! A list might also be useful.
+* *Aniqlik* kod o'z funktsiyasi va dasturchining niyatini qanchalik yaxshi bildirishi bilan bog'liq. If your peers are getting lost or confused by your code, it is probably unclear. Here are some questions to help you make your code clear:
+** Are the names of my variables and functions descriptive? If not, rename them.
+** Have I used comments to explain each block of code and any potentially confusing lines of code?
+** Have I used computational structures like custom functions and loops to help organize my code?
+** Can I structure my script to mirror the structure of my song? In some cases this can help the flow of reading.
+
+*Tengdoshlarning fikr-mulohazalari* dasturlashda keng tarqalgan bo‘lib, boshqalarning sharhlari ko'magida kod va musiqangizni mukammallashtirishga yordam beradi. Fikr-mulohaza *konstruktiv* bo'lishi kerak, ya'ni u tengdoshlar orasini buzishdan ko'ra ular orasidagi munosabatni mustahkamlaydi. When giving feedback:
+
+* *Aniq bo'ling* - Kodning muayyan bloklari va qatorlariga hamda musiqaning muayyan o'lchovlari va treklariga murojaat qiling.
+* *Tavsiflovchi bo'ling* - Skriptni mukammal qilish uchun o'z fikringizni va amalga oshirayotgan jarayoningizni tavsiflab bering.
+* *Tengdoshingizning musiqiy qarashlari/maqsadlariga hushyor bo'ling* - Sizning musiqiy didingiz tengdoshingiz musiqasini baholashga ta'sir qilmasligi kerak.
+* *Ijobiy bo'ling* - Mukammallik ehtiyoj sezgan narsalardan tashqari, kuchli kod bloklari va musiqiy parchalarni ko'rsatib o'ting.
+* *Taqqoslamang* - Tengdoshingizning kodini o'zingizning yoki boshqa tengdoshlaringizning kodlari bilan raqobatlashuvchi sifatida emas, balki ularning shaxsiy mulki sifatida ko'ring.
+
+Likewise, when receiving feedback:
+
+* *Aniq bo'ling* - Muammolarni keltirib chiqaradigan kodning bloklari yoki qatorlarini, musiqaning treklari yoki o'lchovlarini ko'rsating. This will allow your peers to provide feedback that is most helpful to you.
+* *Tinglang* - Tengdoshingiz gapirib bo'lguncha javob berishni kuting. Be attentive to the information your peer is conveying. Comment your code based on their feedback. These comments can be useful when revising.
+* *Savollar bering* - O'zingiz bilmagan mantiq, muammolar, nosozliklar, musiqiy uyg'unlik yoki to'g'rilikning biron bir elementi haqida so'rang.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* Boshlashdan avval doim qo'shiq uchun mavzu va tuzilma haqida fikr yuritish tavsiya etiladi. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Tovush va zarba satri o'zgaruvchilarini yarating hamda `fitMedia()` va `makeBeat()` chaqiruvlaridan foydalaning. You can upload your own sounds.
+* Qachon foydali bo'lsa, for-halqalari va maxsus funktsiyalar yarating.
+* `setEffect()` yordamida ba'zi effektlarni qo'shing. Siz tovushning asta kuchayishi/so'nishi, biroz kechiktirish va reverbatsiya qo'shishingiz mumkin...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in a list.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Create a full song and have it peer-reviewed by your neighbor to improve it. Here are some ideas to get you started:
+
+* Boshlashdan avval doim qo'shiq uchun mavzu va tuzilma haqida fikr yuritish tavsiya etiladi. Your structure can be as simple as ABA.
+* Start selecting sounds and testing things. Tovush va zarba satri o'zgaruvchilarini yarating hamda `fitMedia()` va `makeBeat()` chaqiruvlaridan foydalaning. You can upload your own sounds.
+* Qachon foydali bo'lsa, for-halqalari va maxsus funktsiyalar yarating.
+* `setEffect()` yordamida ba'zi effektlarni qo'shing. Siz tovushning asta kuchayishi/so'nishi, biroz kechiktirish va reverbatsiya qo'shishingiz mumkin...
+* You can use a conditional statement to mix your song (adapt the volume of each track).
+* You can ask for user input to modify something in your song.
+* If necessary, place some elements in an array.
+****
+
+[[chapter9summary]]
+=== Chapter 9 Summary
+
+[role="curriculum-python"]
+* A *list* is a collection of values combined into a single entity, a good way to organize data. Items stored within a list, or elements, can be any data type.
+* Like strings, list elements get assigned an index. List indices start at 0.
+* List elements are referenced with bracket notation, like `myList[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* `len()` funktsiyasi roʻyxatdagi elementlar miqdorini yoki satrdagi belgilar miqdorini qaytaradi. Sintaksis `len(list)`.
+* Ro'yxatlarni o‘zgartirish vositalari to‘plami - *ro'yxat operatsiyalari* yordamida yopishtirish va kesish mumkin.
+* Kattaroq, mavjud roʻyxatdan roʻyxatning quyi toʻplamini yaratish sintaksisi - `newList = oldList[startIndex: endIndex]`.
+* Roʻyxatlar yopishtirish operatori `+` yordamida birlashtirilishi mumkin, masalan, `newList = listA + listB`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different list indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same list.
+* Boshqalar bilan konstruktiv ma'lumot almashish *tengdoshlarning fikr-mulohazalari*ning bir shaklidir. It provides the opportunity to learn from others.
+
+[role="curriculum-javascript"]
+* An *array* is a collection of values combined into a single entity, a good way to organize data. Items stored within an array, or elements, can be any data type.
+* Like strings, array elements get assigned an index. Array indices start at 0.
+* Array elements are referenced with bracket notation, like `myArray[1]`. Characters in a string can be referenced similarly: `myString[1]`.
+* `length` xossasi massivdagi elementlar miqdorini yoki satrdagi belgilar miqdorini qaytaradi. Sintaksis `array.length` yoki `string.length`.
+* Massivlarni o‘zgartirish vositalari to‘plami - *massiv operatsiyalari* yordamida yopishtirish va kesish mumkin.
+* Kattaroq, mavjud massivdan massivni ajratib olish sintaksisi `newArray = oldArray.slice(startIndex, endIndex)`.
+* Kattaroq satrdan quyi-satrni kesib olish sintaksisi - `newString = oldString.substring(startIndex, endIndex)`.
+* Massivlarni `concat()` usuli yordamida yopishtirish mumkin, masalan, `newArray = arrayA.concat(arrayB)`.
+* `makeBeat()` can construct rhythms from multiple sounds at once by passing in a beat string that refers to different arrays indices. `makeBeat()` can access sounds in indices 0 through 9, provided they are stored in the same array.
+* Boshqalar bilan konstruktiv ma'lumot almashish *tengdoshlarning fikr-mulohazalari*ning bir shaklidir. It provides the opportunity to learn from others.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following operations is used to join lists/arrays?
+
+[answers]
+* Concatenation
+* Slicing
+* Combination
+* Addition
+--
+
+[role="curriculum-python"]
+[question]
+--
+What is the index number of the first element of a list in Python?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-python"]
+[question]
+--
+"len(myList)" nimani qaytaradi?
+
+[answers]
+* `myList` elementlari miqdori
+* `myList` ma`lumot turlari
+* `myList` elementlari
+* `myList` kengligi
+--
+
+[role="curriculum-python"]
+[question]
+--
+Ikki ro‘yxatni (`listA` va `listB`) yopishtirish sintaksisi qanday?
+
+[answers]
+* `listA + listB`
+* `listA ++ listB`
+* `listA va listB`
+* `listB + listA`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How can you get a list from oldList without the first and last elements?
+
+[answers]
+* `oldList[1:len(oldList) - 1]`
+* `oldList[1:len(oldList)]`
+* `oldList[0:len(oldList)]`
+* `oldList[2:len(oldList - 1)]`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What is the index number of the first element of an array in Javascript?
+
+[answers]
+* `0`
+* `1`
+* `2`
+* `-1`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+`myArray.length` nimani qaytaradi?
+
+[answers]
+* `myArray` elementlari miqdori
+* `myArray` ma`lumot turlari
+* `myArray` elementlari
+* `myArray` kengligi
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Ikki massivni (`arrayA` va `arrayB`) yopishtirish sintaksisi qanday?
+
+[answers]
+* `arrayA.concat(arrayB)`
+* `arrayA.concatenate(arrayB)`
+* `arrayB.concat(arrayA)`
+* `arrayB.concatenate(arrayB)`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+Birinchi va oxirgi elementlarsiz `oldArray` dan massivni qanday olish mumkin?
+
+[answers]
+* `oldArray.slice(1, oldArray.length - 1)`
+* `oldArray.slice(1, oldArray.length)`
+* `oldArray.slice(0, oldArray.length)`
+* `oldArray.slice(2:oldArray.length - 1)`
+--
+
+[[conclusion]]
+=== Conclusion
+
+Thank you so much for taking part in the EarSketch adventure! We hope you had fun and learned many things with this tool :)
+
+////
+Thank you video
+////
\ No newline at end of file
diff --git a/src/locales/uz/v2/effects-and-envelopes.adoc b/src/locales/uz/v2/effects-and-envelopes.adoc
new file mode 100644
index 000000000..c79ca1d5e
--- /dev/null
+++ b/src/locales/uz/v2/effects-and-envelopes.adoc
@@ -0,0 +1,321 @@
+[[effectsandenvelopes]]
+== Effects and Envelopes
+
+:nofooter:
+
+EarSketch lets the composer alter existing sounds to produce new and unique sounds. Bunga ushbu bobning diqqat markazida bo'lgan `setEffect()` funktsiyasi orqali erishiladi.
+
+[[effectsinearsketch]]
+=== Use Effects in EarSketch
+
+:nofooter:
+
+*Effektlar* bizga tovush sifatini o'zgartirish imkonini beradi. Similar to how adding a filter alters a photo, adding an audio effect changes the sound. For example, you can change the volume, add some echo or reverb, etc.
+
+[role="curriculum-python curriculum-mp4"]
+[[video4py]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video4js]]
+video::./videoMedia/004-01-UsingEffectsinEarSketch-JS.mp4[]
+
+We use the function `setEffect()`, which takes four arguments, similar to `fitMedia()`:
+
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+
+.PRACTICE
+****
+Write a new song with two tracks and modify the volume for both of the tracks using the `setEffect()` function.
+In that case, the effect name (second argument) is `VOLUME`, and the effect parameter (third argument) is `GAIN`. The effect value (fourth argument) is a number of decibels (dB), between `-60` and `+12`.
+****
+
+Here is an example below:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-volume-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-volume-effect.js.txt[]
+----
+
+Biz “OVOZ BALANDLIGI” effektini ko‘rdik. Endi “KECHIKTIRISH”ni ko'rib chiqamiz. Quyidagi 2 ta klipni tinglang, biri *kechiktirish* effekti qo'llaniladi, boshqasida esa yo'q.
+
+No effect:
+
+++++
+audioMedia/reference.mp3
+++++
+
+Delay effect:
+
+++++
+audioMedia/delay2.mp3
+++++
+
+In that case, the effect name (second argument) is `DELAY`, and the effect parameter (third argument) can either be `DELAY_TIME` (how long before the echo "answers") or `DELAY_FEEDBACK` (how loud your echo is). The value of `DELAY_TIME` is in milliseconds (1000 milliseconds is one second) and the value of `DELAY_FEEDBACK` is a number between `-120` and `-1`.
+
+For example, `setEffect(1, DELAY, DELAY_TIME, 500)` puts a delay onto track 1 with the delay/echo lasting for 500 ms.
+
+.PRACTICE
+****
+. Effektlar roʻyxatidagi kechiktirish effekti haqida bu yerda oʻqing: <>
+. Then run the code below and listen to the music without effects
+. So'ng birinchi `setEffect()` qatori boshidan sharhni olib tashlang va farqni tinglang
+. So'ng ikkinchi `setEffect()` qatori boshidan sharhni olib tashlang va farqni tinglang ("sharhni olib tashlash" `#` yoki `//` kod bloki kabi sharh sintaksisini o'chirishni anglatadi)
+E'tibor bering, kechiktirish vaqti - 500ms, bu bir zarbaning uzunligi hisoblanadi. Since the tempo is 120 beats per minute, there is one beat every 60/120 = 1/2 seconds. 1 second is 1000ms, so 1/2 second is 1000/2 = 500ms.
+You can try modifying the delay time and observing if your music sounds better or not.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-delay-effect.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-delay-effect.js.txt[]
+----
+
+{nbsp} +
+
+[[functionsandmoreeffects]]
+=== Functions and more effects
+
+Hozirgacha siz EarSketch-da `fitMedia()` yoki `setEffect()` kabi bir nechta funktsiyalardan foydalangansiz. Note that the function names always start with a lower-case letter, and are often a verb. Qaslar kompyuterga funktsiyani *chaqirish* yoki *bajarish*ni buyuradi. Qavslar orasidagi *Argumentlar* yoki parametrlar vergul bilan ajratiladi.
+
+[role="curriculum-python"]
+* `setTempo()`, `fitMedia()`, `makeBeat()` va so'ng `setEffect()` argumentlarni oladi. Ular EarSketch *Ilova Dasturlash Interfeysi* yoki *IDI* ning bir qismidir. EarSketch, or the EarSketch API, adds musical features to Python. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* Keyingi bobda siz o'zingizning shaxsiy funktsiyalaringizni qanday yaratishni ham o'rganasiz.
+
+[role="curriculum-javascript"]
+* `setTempo()`, `fitMedia()`, `makeBeat()` va so'ng `setEffect()` argumentlarni oladi. Ular EarSketch *Ilova Dasturlash Interfeysi* yoki *IDI* ning bir qismidir. EarSketch, or the EarSketch API, adds musical features to JavaScript. Another example of API is the Google Maps API: a set of tools for embedding maps into websites or apps.
+* Keyingi bobda siz o'zingizning shaxsiy funktsiyalaringizni qanday yaratishni ham o'rganasiz.
+
+The arguments of the function can each have a specific data type. The order of the arguments is important. Here are some data type examples:
+
+* *Raqamlar*
+** *Integers* are whole numbers, like 0, 5, or -26. Example: track numbers
+** *Suzuvchi nuqta* raqamlari 0,125 yoki -21,0 kabi ratsional sonlardir. Example: volume of -4.2dB
+* *Strings* represent text. Example: `"0000----0000----"`
+
+Endi `setEffect()` funktsiyasi bilan ko'proq ishlaymiz. The following video shows how to use some effects:
+
+////
+VIDEO IS BEEING MADE
+more info here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020
+("videos revamping" tab)
+////
+
+*Reverb* (reverberatsiya uchun qisqartma) bu devorlarga urilib, quloqlaringizga qaytadigan tovushdir. It gives a sense of space to your sound. Think about the difference between talking in a small bedroom and talking in a large church. The larger and "flatter" the room, the longer it takes the waves to return to your ears, hence that "large echoey room" sound. `REVERB` effekti tovushning so'nish vaqtini (`REVERB_DECAY`) va mavjud effekt miqdorini (`MIX`) boshqarish parametrlariga ega.
+
+Listen to the clips below to hear the result of adding reverb to a track:
+
+No effect:
+
+++++
+audioMedia/reverbReference.mp3
+++++
+
+Reverb effect:
+
+++++
+audioMedia/reverbEffect.mp3
+++++
+
+{nbsp} +
+
+.PRACTICE
+****
+Effektlarning toʻliq roʻyxati uchun <> ga oʻting.
+Create a song with a volume effect and two other effects. Nima qilayotganingizni sharhlarda yozishni va kerak bo'lganda o'zgaruvchilar yaratishni unutmang.
+****
+
+[[effectsandenvelopes2]]
+=== Effects and Envelopes
+
+Siz effektlardan foydalanishni boshladingiz va biroz vaqt o'tgach bir effektning o'zgarishini xohlaysiz. For example, you might want a fade in (volume getting higher) at the beginning of your song.
+
+*Zarflar* bizga effektning vaqt o'tishi bilan qanday o'zgarishini aniqlash imkonini beradi.
+
+We will use two value-time pairs. Each pair contains an effect value and a corresponding measure. For example, `(-60, 1, 0, 3)` means a point is placed at value `-60` at measure `1`, and another point is placed at value `0` at measure `3`. Zarf ushbu nuqtalar o'rtasida *qiyalik* deb nomlangan chiziq hosil qiladi:
+
+[[envelopepoints]]
+.An annotated envelope in EarSketch
+[caption="Figure 5.3.1: "]
+image::../media/U2/NewEnvelope.png[Alt Text]
+
+To change an envelope, you just need the `setEffect()` function with seven arguments (the last four arguments are the two value-time pairs):
+
+. track
+. type
+. parameter
+. startValue
+. start
+. endValue
+. end
+
+The last three out of seven parameters are *optional parameters*. If left unspecified, as was the case when we used `setEffect()` with only four parameters, the effect is applied to the entire track.
+
+Here is an example of fade in:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-envelopes.js.txt[]
+----
+
+Now watch this video for other envelope examples
+
+[role="curriculum-python curriculum-mp4"]
+[[video5b]]
+video::./videoMedia/005-03-MoreEffectsB-PY.mp4[]
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.py.txt[]
+----
+
+[role="curriculum-javascript curriculum-mp4"]
+video::./videoMedia/005-03-MoreEffectsB-JS.mp4[]
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-complex-envelopes.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Create a new song. Barcha treklarga zarf qo'shish uchun (masalan: barcha treklaringiz uchun tovushning asta kuchayishi va so'nishi) yoki ayni trekdagi effektni qayta takrorlash uchun bitta "for" halqasidan foydalaning. You can use any effect you like.
+Have your neighbor listen to your song, with and without the effect (to hear your song without the effect, comment out the lines that create the effect). Your neighbor has to guess which effect you added.
+****
+
+Below is an example of the above practice. Each iteration of the loop adds a one measure long segment of the envelope. Automating the GAIN parameter creates rhythmic volume fades. Try toggling the effect bypass in the DAW to hear the difference the effect makes (the "bypass" button to the left of the effect track in your DAW).
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-rhythmic-ramps.js.txt[]
+----
+
+And here is an example of fade in and fade out on all the tracks:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/effects-and-envelopes-fade-in-and-fade-out.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter5summary]]
+=== Chapter 5 Summary
+
+* *Effects* change the qualities of a sound to make them unique.
+* *Ovoz balandligi* tovushning jaranglash balandligi bilan bog'liq. *Kechiktirish* aks-sado hosil qiladi. *Reverb* tovushning keng xonada yangrayotgandek his qildiradi. *Panoramalash* musiqangizni chap yoki o'ng tomonga joylashtiradi.
+* Effektlar EarSketch-da `setEffect()` funktsiyasi bilan amalga oshiriladi. Its syntax is `setEffect(track, type, parameter, value)`.
+. *track*: Track number or `MIX_TRACK`
+. *type*: Effect constant, like `DELAY`
+. *parameter*: Parameter constant, like `DELAY_TIME`
+. *value*: Parameter value, like `200`. This value must be within the effect's range.
+* *Funktsiyalar* kompyuterning bajarishi uchun ko'rsatmalarni o'z ichiga oladi. Ma'lumotlar funktsiyalarga *argumentlar* orqali yuboriladi, bu funktsiya qanday bajarilishiga ta'sir qiladi. Ikki argumentli *chaqiruv* funktsiyasining sintaksisi `myFunction(argument1, argument2)`. 4 ta argumentli *chaqiruv* funktsiyasida ishlatiladigan sintaksisga `makeBeat(kick, 2, measure, kickBeat)` misol bola oladi.
+* EarSketch effektlarining toʻliq roʻyxati va ularning parametrlarini har biri uchun tavsiflari bilan birga <> da topish mumkin.
+* *Zarflar* - effekt parametri vaqt o'tishi bilan qanday o'zgarishini belgilaydi. Ular _(qiymat, vaqt, qiymat, vaqt)_ kabi qiymat-vaqt juftliklari bilan tavsiflanadi.
+* For an envelope, the 7-parameter `setEffect()` arguments are: `setEffect(track, type, parameter, startValue, start, endValue, end)`.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+What does an effect allow you to do in EarSketch?
+
+[answers]
+* Change the qualities of sound within a project
+* Add a sound to a track
+* Create a drum beat
+* Change the tempo of a song
+--
+
+[question]
+--
+Bulardan qaysi biri `setEffect()` argumenti EMAS?
+
+[answers]
+* Clip Name
+* Effect Name
+* Effect Value
+* Track Number
+--
+
+[question]
+--
+How would you set the delay time of a delay effect on track 3 to 50 milliseconds?
+
+[answers]
+* `setEffect(3, DELAY, DELAY_TIME, 50.0)`
+* `setEffect(DELAY, 3, DELAY_TIME, 50.0)`
+* `fitMedia(DELAY, 3, DELAY_TIME, 50.0)`
+* `setEffect(50, DELAY_FEEDBACK, 1)`
+--
+
+[question]
+--
+Quyidagilardan qaysi biri `setEffect()` zarflarida foydalaniladigan parametr emas?
+
+[answers]
+* Clip Length
+* Start Value
+* Track Number
+* Effect
+--
+
+[question]
+--
+Quyidagi `setEffect()` funktsiyasi qanday vazifa bajaradi?
+
+[source,python]
+----
+setEffect(1, DISTORTION, DISTO_GAIN, 0, 1, 50, 11)
+----
+
+[answers]
+* Increase the amount of distortion on track 1 over 10 measures.
+* Decrease the amount of distortion on track 1 over 50 measures.
+* Increase the volume of track 1 over 10 measures.
+* Decrease the volume on track 1 over 50 measures.
+--
\ No newline at end of file
diff --git a/src/locales/uz/v2/get-user-input.adoc b/src/locales/uz/v2/get-user-input.adoc
new file mode 100644
index 000000000..2105dcedf
--- /dev/null
+++ b/src/locales/uz/v2/get-user-input.adoc
@@ -0,0 +1,391 @@
+[[getuserinput]]
+== Get User Input
+
+:nofooter:
+
+In this chapter, you will learn how to ask for input from users and adapt your music accordingly. Buning uchun biz qaytarish bayonotlari va `readInput()` funktsiyasini ko'rib chiqamiz.
+
+[[returnstatement]]
+=== Return Statement
+
+Watch this video first:
+
+[role="curriculum-python curriculum-mp4"]
+[[video131py]]
+video::./videoMedia/013-01-ReturnStatements-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video131js]]
+video::./videoMedia/013-01-ReturnStatements-JS.mp4[]
+
+* In addition to taking inputs (parameters), functions can output a value. In programming, we call this returning a value.
+* *Qaytarish bayonoti* funktsiya tanasi ichidagi bayonot bo'lib, u: A. funktsiyaga qiymat chaqirilganda qaytarishni aytadi. B. signals the function to stop. Agar sizda `return` kalit so'zidan keyin biron-bir bayonot bo'lsa, ular e'tiborga olinmaydi.
+* To use the value that is returned by the function, create a variable and assign it the function call.
+* A return statement is not compulsory. Without a return statement a function does not output a value. `fitMedia()` va `setEffect()` hech narsa qaytarmaydigan funktsiyalarga misollardir.
+
+Here is a code example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements.js.txt[]
+----
+
+With the return statement, the complete control flow for a function looks like this:
+
+[[return]]
+.Return statement control flow
+[caption="Figure 8.1.1: "]
+image::../media/U2/Return.png[Alt Text]
+
+.PRACTICE
+****
+Create a function that will implement a musical section with:
+
+* Boshlang'ich o'lchovini ifodalovchi `start` deb nomlangan faqat bitta parametr bilan.
+* One `return` statement that returns the end measure.
+* `fitMedia()` funktsiyalari bilan tana funktsiyasi.
+
+Your section can last as many measures as you like.
+Then call the function, and print the end measure.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-return-statements-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-return-statements-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Aytaylik, sizda A bo'limi bor, lekin qo'shiqning turli lahzalarida chaqirilganda uning biroz o'zgarishini xohlaysiz. You will create a function called `sectionA()` with two `fitMedia()` calls.
+
+The function should take two parameters: `start` and a boolean parameter `variation` that will allow the user to choose a variation when calling the function.
+
+In the function body, you should have a conditional statement which will evaluate the parameter. Depending on the parameter value, you will change the sound used in one of your `fitMedia()` calls.
+
+Then call the function at different measures with different variations.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-conditional-statement.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-conditional-statement.js.txt[]
+----
+
+{nbsp} +
+
+[[userinput]]
+=== Get User Input
+
+“Ishga tushirish” tugmasi bosilganda foydalanuvchi ma'lumotlarini qanday so‘rashni ko‘ramiz. Bu `readInput()` funktsiyasi ko'magida mumkin bo'ladi. This function takes as a parameter a string (like "what tempo would you like for your music?"). When the user runs the code, they will see a new window with the string and are prompted to write an answer. `readInput()` funktsiyasi u yerda foydalanuvchi yozgan narsalarni qaytaradi.
+
+For example, copy the following code in a new script, and run it:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-untitled1.js.txt[]
+----
+
+We might need to convert the returned user input into a different data type. Here are useful functions:
+
+[role="curriculum-python"]
+* `str()` - istalgan qiymatni satrga aylantiradi.
+* `int()` - raqamlardan iborat satrni butun songa aylantiradi (masalan: `"3"` - `3` ga aylanadi).
+* `float()` - o'nlik kasrli raqamlarni o'z ichiga olgan satrni suzuvchi songa aylantiradi (masalan: `"3.5"` - `3.5`ga aylanadi).
+
+[role="curriculum-javascript"]
+* `String()` - istalgan qiymatni satrga aylantiradi. E'tibor bering, bu funktsiya nomi katta harf bilan boshlanadi.
+* `Number()` - satrni raqamga aylantiradi (masalan: `"3,5"` - `3,5` ga aylanadi).
+
+In the example below, console input is used to determine the tempo of the song. We make sure to convert user input into an integer.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-1.js.txt[]
+----
+
+Here is another example of what you can do with user input.
+
+*Yopishtirish* bu `+` belgisidan foydalanib, satrlarni bir-biriga bog'lash vositasidir. For example, concatenating the strings `"Hello"` and `"World"` yields `"HelloWorld"`. In the following example, the user is prompted to specify a clip number. Raqam “DUBSTEP_BASS_WOBBLE_0” bilan yopishtirilib, “DUBSTEP_BASS_WOBBLE_010” kabi toʻliq klip nomini hosil qiladi.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-user-input-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-user-input-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Ask for a user input to modify something in your song.
+
+Here are ideas of tools you can use:
+
+. string concatenation,
+. data conversion,
+. creating a specific parameter in a custom function
+****
+
+{nbsp} +
+
+[[booleanlogic]]
+=== Boolean Logic
+
+We will now combine boolean logic and user input for another example of user interaction.
+
+[role="curriculum-python"]
+Keling, avval boolean mantig'ini ko'rib chiqaylik. Bilasizki, *taqqoslash operatorlari* mantiqiy qiymat yaratishga yordam beradi. For example, the operator `==` checks if two values are equal, and if so the boolean is set to `True`.
+
+[role="curriculum-javascript"]
+Keling, avval boolean mantig'ini ko'rib chiqaylik. Bilasizki, *taqqoslash operatorlari* mantiqiy qiymat yaratishga yordam beradi. For example, the operator `===` checks if two values are equal, and if so the boolean is set to `true`.
+
+Endi *mantiqiy operatorlarni* ko'rib chiqaylik: bular bir nechta mantiqiy qiymatlarni birlashtirishga yordam beradi. There are three boolean operators:
+
+[role="curriculum-python"]
+* `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+* `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+* `not`: takes one boolean input and returns the opposite (negated) boolean.
+
+[role="curriculum-javascript"]
+* `&&`: is called "and"; it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+* `||`: is called "or"; it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+* `!`: is called "not"; it takes one boolean input and returns the opposite (negated) boolean.
+
+For example if you are sixteen, the sentence "I'm sixteen" is true and the sentence "I'm seventeen" is false. "I'm sixteen and I'm seventeen" (true and false) is false because you are not both sixteen and seventeen. But the sentence "I'm sixteen or I'm seventeen" (true or false) is true.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `Rostmi` yoki `Yolg'onmi`?
+
+* `Rost emas`
+* `Rost va Yolg'on`
+* `Rost yoki Yolg'on`
+* `Rost va Rost`
+* `(True and False) or True`
+* `True and not False`
+* `not (False or False)`
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+What do you think the following expressions evaluate to? `rostmi` yoki `yolg'onmi`?
+
+* `!true`
+* `true && false`
+* `true || false`
+* `true && true`
+* `(true && false) || true`
+* `true && !false`
+* `!(false || false)`
+****
+
+Use the following code to print the answers:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-expressions.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-expressions.js.txt[]
+----
+
+Here is a reminder of boolean creation, and some examples of boolean operations:
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/Screencast-Ch17-2-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/Screencast-Ch17-2-JS.mp4[]
+
+.PRACTICE
+****
+Now we will combine user input and boolean operations.
+
+Write a script that will ask for the user to choose a genre, with a limited number of options (for example "hip hop" and "classical"). Foydalanuvchining javobiga qarab, janr bilan yaxshi ishlaydigan zarba satrni tanlang. You can accept several possibilities. For example, "HIP HOP", "hip hop" and "Hip Hop" will output the same song.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/get-user-input-boolean-operations.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/get-user-input-boolean-operations.js.txt[]
+----
+
+{nbsp} +
+
+.CHALLENGE
+****
+This is the Jukebox challenge: write a script that will ask for user input in terms of genre, with three options (for example "latino", "trap" and "dubstep"). Foydalanuvchining javobiga qarab, janrga mos keladigan qo'shiq yarating.
+****
+
+{nbsp} +
+
+[[chapter8summary]]
+=== Chapter 8 Summary
+
+[role="curriculum-python"]
+* *Qaytarish bayonotlari* funktsiya chaqirilganda natijani chiqarish uchun funktsiya izohiga kiritilishi mumkin.
+* `readInput()` kodingizni ishga tushirganingizda foydalanuvchi kiritishini talab qiladi. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. `str()` istalgan qiymatni satrga aylantiradi.
+`int()` raqamlardan iborat satrni butun songa aylantiradi. `float()` o'nlik kasrli raqamlarni o'z ichiga olgan satrni suzuvchi songa aylantiradi.
+* Siz satrlarni *yopishtirishingiz* (bog'lashingiz) mumkin: "Hello"+"World" - "HelloWorld" deb baholanadi.
+* *Boolean mantig'i* mantiqiy oamaliyotlarni o'z ichiga oladi. Here are boolean operators:
+** `and`: takes two boolean inputs and returns `True` only when both inputs are `True`, otherwise returns `False`.
+** `or`: takes two boolean inputs and returns `True` when at least one input is `True`, otherwise returns `False`.
+** `not`: takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[role="curriculum-javascript"]
+* *Qaytarish bayonotlari* funktsiya chaqirilganda natijani chiqarish uchun funktsiya izohiga kiritilishi mumkin.
+* `readInput()` kodingizni ishga tushirganingizda foydalanuvchi kiritishini talab qiladi. The only parameter is a string that the user will see. You can then use what the user has typed in your code, for example, to change the tempo or the genre of your music.
+* Some functions allow you to convert data from one type to another. For example, str() converts data into a string. `String()` istalgan qiymatni satrga aylantiradi. E'tibor bering, bu funktsiya nomi katta harf bilan boshlanadi. `Number()` satrni raqamga aylantiradi.
+* Siz satrlarni *yopishtirishingiz* (bog'lashingiz) mumkin: "Hello"+"World" - "HelloWorld" deb baholanadi.
+* *Boolean mantig'i* mantiqiy oamaliyotlarni o'z ichiga oladi. Here are boolean operators:
+** `&&`: is called "and", it takes two boolean inputs and returns `true` only when both inputs are `true`, otherwise returns `false`.
+** `||`: is called "or": it takes two boolean inputs and returns `true` when at least one input is `true`, otherwise returns `false`.
+** `!`: is called "not": it takes one boolean input and returns the opposite (negated) boolean.
+* You now have many tools to introduce variations in your music: User input can determine elements. You can add a parameter in your custom functions to select a variation when you call your function.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following would be considered an example of data type conversion?
+
+[answers]
+* Turning a string into a number.
+* Storing a user-defined tempo in a variable.
+* Foydalanuvchidan janrni so'rash uchun `readInput()` dan foydalanish.
+* Producing a Boolean through a comparison operator.
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+not (True and (4 > 5))
+----
+
+[answers]
+* `True`
+* `5`
+* `4`
+* `False`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+!(true && (4 > 5));
+----
+
+[answers]
+* `true`
+* `4`
+* `false`
+* `5`
+--
+
+[question]
+--
+Which of the following is an example of concatenation?
+
+[answers]
+* `x = beatstring1 + beatstring2`
+* `x = beatstring1.beatstring2`
+* `x = (beatstring1, beatstring2)`
+* `x = beatstring1[beatstring2]`
+--
+
+[role="curriculum-python"]
+[question]
+--
+How would you obtain the boolean True with the booleans True and False?
+
+[answers]
+* `Rost yoki Yolg'on`
+* `Rost emas`
+* `Rost va Yolg'on`
+* `true or false`
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+How would you obtain the boolean true with the booleans true and false?
+
+[answers]
+* `true||false`
+* `!true`
+* `true&&false`
+* `True||False`
+--
\ No newline at end of file
diff --git a/src/locales/uz/v2/getting-started.adoc b/src/locales/uz/v2/getting-started.adoc
new file mode 100644
index 000000000..dcb58d0e1
--- /dev/null
+++ b/src/locales/uz/v2/getting-started.adoc
@@ -0,0 +1,386 @@
+[[getstartedwithearsketch]]
+== Getting Started with EarSketch
+
+:nofooter:
+
+In this chapter you will learn how EarSketch works. You will place sounds into your music and see how to debug your code.
+
+[[discoverearsketch]]
+=== Discover EarSketch
+
+:nofooter:
+
+In EarSketch, you will give the computer instructions by writing code. One line of code is one instruction. All the instructions together are called the program (these instructions can also be called an algorithm). Just like following a recipe in a cookbook can lead to cooked meal, executing a program in EarSketch can lead to a song. How does it work? Find out in the video below!
+
+[role="curriculum-mp4"]
+[[video1a]]
+video::./videoMedia/1_1_Discover_EarSketch.mp4[]
+
+////
+TODO: upload video
+////
+
+As you become familiar with EarSketch these are the main panels.
+
+* *Content Manager* _(left)_: Your scripts and sounds
+* *DAW* _(top-center)_: The song timeline and "play" button
+* *Editor* _(mid-center)_: The code editor and "run" button
+* *Console* _(bottom-center)_: The script output and errors
+
+{nbsp} +
+
+_RAIS nima?_
+
+A *DAW*, or *Digital Audio Workstation*, is software that produces or edits audio on a computer, be it in a professional studio or in home laptop-based studios.
+
+Some popular DAWs include https://www.ableton.com/[Ableton Live^], https://www.image-line.com/[FL Studio^], https://www.apple.com/logic-pro/[Logic Pro^], http://www.apple.com/mac/garageband/[GarageBand^], https://www.avid.com/pro-tools[Pro Tools^], and http://www.reaper.fm/[Reaper^].
+
+EarSketch is DAW that allows you to create music by writing code.
+
+Here is how to make full use of the DAW:
+
+[role="curriculum-mp4"]
+[[video1b]]
+video::./videoMedia/001-06-TheDAWinDetail-PY-JS.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+Keling, EarSketch-da kod misolini ishga tushirishga harakat qilaylik! On the box below, press the blue clipboard icon in the top right corner. Bu misol kodini *kod muharriri*dagi yangi faylga joylashtiradi. Hali kodni tushunishning hojati yo'q, shunchaki _Ishga Tushir_ tugmasini bosing va musiqangiz RAIS da paydo bo'ladi. Uni tinglash uchun _ijro_ tugmasini bosishingiz mumkin.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-intro-script.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-intro-script.js.txt[]
+----
+
+{nbsp} +
+
+[[createanewscript]]
+=== Create your first script!
+
+Let's see how to create a script from scratch.
+
+. *Create.* In the editor tabs, click the white "+" icon.
++
+If this is your first script, click the large blue text "Click here to create a new script!"
++
+[[newscriptplus]]
+.Create a new script, open scripts
+[caption="Figure 1.2.1: "]
+image::../media/U1P1/NewScriptPlus.png[Alt Text]
+. *Choose a name and language.* Give your new script a name, and choose between Python and JavaScript programming languages.
++
+[[newscriptpromptpy]]
+.The create a new script dialog box
+[role="curriculum-python"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptPY.png[Alt Text]
++
+[[newscriptpromptjs]]
+.The create a new script dialog box
+[role="curriculum-javascript"]
+[caption="Figure 1.2.2: "]
+image::../media/U1P1/newScriptPromptJS.png[Alt Text]
+. *(OPTIONAL) Sign in or create a new account.* To save your scripts for future editing and sharing, sign in with an EarSketch account.
++
+_Note: Your EarSketch account does not require any personal information or email._
+
+*_Dasturlash tili nima?_*
+
+Code is written in a *programming language*. Like a spoken language it has vocabulary and syntax. You need to follow your programming language's grammar rules as you would with spoken language.
+
+When you press the *run* button, a *compiler* translates the Python or JavaScript instructions into machine code which the computer can understand. Then the computer *executes* the code, which causes your music appear in the DAW.
+
+At the deepest level, computers execute code using *binary*. This means that all computer code eventually becomes `1` 's and `0` 's as it is processed by electrical components in the computer.
+
+[[fitmedia]]
+=== `fitMedia()` funktsiyasi
+
+Endi siz birinchi skriptingizni yaratdingiz, keling, musiqangiz ustida ishlashni boshlaylik!
+
+Watch this video to see how to add an audio clip to your song:
+
+[role="curriculum-python curriculum-mp4"]
+[[video110py]]
+video::./videoMedia/1_3_fitmedia_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video110js]]
+video::./videoMedia/1_3_fitmedia_js.mp4[]
+
+To add a sound to the DAW, we start by typing `fitMedia()` and use the following form.
+
+`fitMedia(sound, track, start, end)`
+
+There are 4 *parameters*, separated by commas.
+
+. *Sound*: the sound constant from the sound browser
+. *Track*: the track number
+. *Start*: the starting measure
+. *End*: the ending measure
+
+_Example:_
+
+`fitMedia(Y18_DRUM_SAMPLES_2, 2, 1, 5)`
+
+The statement above will place the sound `Y18_DRUM_SAMPLES_2` on track `2` from measures `1` to `5`. *bayonot* kompyuterga biror amalni bajarishni buyuradi.
+
+Try adding `fitMedia()` to a script.
+
+When you've finished adding all your parameters, press _run_. You will see your sounds visualized in the DAW. Press _play_ to listen to your song.
+
+[role="curriculum-javascript"]
+Note: In JavaScript an optional semicolon `;` can be added to the end of each statement. Use of the semicolon is your personal choice.
+
+////
+OPTIONAL
+////
+
+{nbsp} +
+
+*_The Sound Browser_*
+
+The *sound browser* provides a library of over four thousand sounds to use in your music.
+Contributors include celebrity musicians
+https://en.wikipedia.org/wiki/Alicia_Keys[Alicia Keys^],
+https://en.wikipedia.org/wiki/Ciara[Ciara^],
+https://en.wikipedia.org/wiki/Common_(rapper)[Common^],
+https://en.wikipedia.org/wiki/Khalid[Khalid^],
+https://en.wikipedia.org/wiki/Pharrell[Pharrell^],
+https://en.wikipedia.org/wiki/Richard_Devine[Richard Devine^],
+and https://en.wikipedia.org/wiki/Young_Guru[Young Guru^].
+
+You can explore the sound browser within the *Content Manager* (left) by clicking "sounds". Try using different sound constants inside `fitMedia()`.
+
+Note: The https://earsketch.gatech.edu/landing/#/license[EarSketch License Agreement^] covers fair use of stock sounds.
+
+////
+END OF OPTIONAL
+////
+
+////
+OPTIONAL
+////
+
+Below is an example script using `fitMedia()`. Remember, you can import this script by clicking the blue clipboard icon.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia.js.txt[]
+----
+
+Qo'shimcha vazifa uchun, quyida qilganimizdek, skriptingizga ko'proq `fitMedia()` chaqiruvlarini qo'shing. E'tibor bering, biz har bir `fitMedia()` chaqiruvi uchun farqli trek raqamidan foydalanamiz:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-using-fitmedia-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-using-fitmedia-2.js.txt[]
+----
+
+{nbsp} +
+
+.PRACTICE
+****
+Using sounds that you like:
+
+. Place sounds on two different tracks
+. Place sounds from measure `2` to `12`
+. Create a short song with three tracks that is eight measures long or more
+
+For each exercise, you can have your neighbour listen to your song.
+
+If you have errors when running your code, check out the next chapter about debugging.
+****
+
+[[debugging]]
+=== Debug your code
+
+Sometimes programmers make mistakes that cause code to work incorrectly, or not run at all. Dasturlashda kodlash xatoliklari *xatolar* yoki *nosozliklar* deb ataladi. Xatolarni topish va tuzatish jarayoni *Nosozliklarni tuzatish* deb ataladi. You can use debugging strategies, using the console.
+
+[role="curriculum-python curriculum-mp4"]
+[[video3py]]
+video::./videoMedia/1_4_Debugging_Console_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video3js]]
+video::./videoMedia/1_4_Debugging_Console_js.mp4[]
+
+////
+TODO: This video needs some revamping. See recommandations here: https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=302140020 (videos revamping tab)
+////
+
+////
+OPTIONAL
+////
+
+What are the different types of errors?
+
+. *Syntax errors*: Your program does not run because your code breaks the language's *syntax* rules (ex: you forgot to close a parenthesis, or you wrote `fitMedia` incorrectly).
+. *Ijro etish xatolari*: Dasturingiz ishlay boshlaydi, lekin xato tufayli toʻxtab qoladi.
+. *Mantiqiy xatolar*: Dasturingiz ishlaydi, lekin u kutilgan ishni bajarmaydi. You can fix these by looking at the DAW to check if the clips you meant to add were actually added in the right place.
+
+////
+END OF OPTIONAL
+////
+
+Here are some common errors:
+
+[role="curriculum-python"]
+. *Imlo xatosi:* `fitMedia()` yoki tovush konstantalari kabi funktsiyadan foydalanganda imloni tekshiring.
+. *Harf sezgirligi:* Dasturlashda qoʻllaniladigan soʻzlarning koʻpchiligi katta-kichik harflarga sezgir bo'ladi (kompyuter bosh va kichik harflar oʻrtasidagi farqni taniydi). Pay attention to lowercase and uppercase letters. Masalan, `FitMedia()` yoki `fitmedia()` emas, balki `fitMedia()` deb yozing. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Qavslar:* Qavsni kerakli joyda ochish yoki yopishni unutish <> hosil bo'lishiga olib keladi.
+. *Script setup:* EarSketch adds some code to a new script automatically, but you might accidentally delete `from earsketch import *`.
+. *Tinish belgilari:* Vergullarning mavjud emasligi yoki boshqa tinish belgilaridagi xatoliklar
+
+[role="curriculum-javascript"]
+. *Imlo xatosi:* `fitMedia()` yoki tovush konstantalari kabi funktsiyadan foydalanganda imloni tekshiring.
+. *Harf sezgirligi:* Dasturlashda qoʻllaniladigan soʻzlarning koʻpchiligi katta-kichik harflarga sezgir bo'ladi (kompyuter bosh va kichik harflar oʻrtasidagi farqni taniydi). Pay attention to lowercase and uppercase letters. Masalan, `FitMedia()` yoki `fitmedia()` emas, balki `fitMedia()` deb yozing. The functions in EarSketch use a style called *Camel Case*: the first word is lower case, and the first letter of subsequent words are capitalized, as in `exampleFunctionName()`.
+. *Qavslar:* Qavsni kerakli joyda ochish yoki yopishni unutish <> hosil bo'lishiga olib keladi.
+. *Tinish belgilari:* Vergullarning mavjud emasligi yoki boshqa tinish belgilaridagi xatoliklar
+
+Time to practice!
+Find the five errors in the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/getting-started-finding-errors.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/getting-started-finding-errors.js.txt[]
+----
+
+////
+OPTIONAL
+////
+
+Here is the answer
+
+. The `setTempo()` function is missing a parentheses
+. The first `fitMedia()` is missing an `e`
+. Birinchi `fitMedia()`da uchinchi va toʻrtinchi parametrlar orasida vergul yoʻq
+. The second `fitMedia()` is missing an uppercase `M`
+. Ikkinchi `fitMedia()`da parametrlar tartibi toʻgʻri emas: u ovozli klip nomi, so'ng trek raqami boʻlishi kerak
+
+////
+END OF OPTIONAL
+////
+
+Turli xil xatolarning tavsifi va ularni oldini olish uchun nima qilishingiz mumkinligi haqida <>ni koʻrib chiqing.
+
+////
+TODO: when options are ready, modify the link
+////
+
+[[chapter1summary]]
+=== Chapter 1 Summary
+
+* A computer *program* is a sequence of instructions the computer executes to accomplish a specific task.
+* A *script* is a nickname for a short program.
+* A *DAW*, or Digital Audio Workstation, is a type of computer software for recording and editing audio. EarSketch is a DAW that lets you make music with code.
+* To make music, type code into the *editor*, click "run", and click "play" to listen.
+* *Sounds* can be found in the *Sound Browser*. You can add sounds to your code by using the *sound constant* in a function like `fitMedia()`.
+* *Programming languages* are collections of words and symbols that are understood by the computer.
+* The rules of *syntax* define how code must be written and how punctuation (`.`, `,`) is used.
+* Create a new script by clicking the large blue link "Click here to create..." or the "+" icon on the editor tabs.
+* `fitMedia()` is a way of adding sounds to the DAW. It has the following four parameters.
+** *Sound*: the sound constant from the sound browser
+** *Track*: the track number
+** *Start*: the starting measure
+** *End*: the ending measure
+* *Debugging* is the process of finding and fixing *bugs*, or errors, made by the programmer.
+* *Konsol* dasturning holati haqidagi ma'lumotlarni ko'rsatadi, bu esa sintaksis xatolarini tuzatish uchun foydali bo'ladi.
+* Common programming errors include typos, incorrect cases, missing parentheses, improper script setup, and logic errors.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following is NOT a panel in the EarSketch workspace?
+
+[answers]
+* The effects browser
+* The code editor
+* The DAW
+* The console
+--
+
+[question]
+--
+`fitMedia()` funktsiyasi uchun sizga nechta parametr kerak?
+
+[answers]
+* 4
+* 6
+* 2
+* 3
+--
+
+[question]
+--
+Bitta skript ... ga mos keladi
+
+[answers]
+* One EarSketch song
+* One line of code
+* One programming language
+* One programmer
+--
+
+[question]
+--
+What is a measure?
+
+[answers]
+* A musical time unit
+* An audio volume unit
+* A line in the DAW
+* A pitch unit
+--
+
+[question]
+--
+Which of the following is NOT a common type of error found in code?
+
+[answers]
+* Grammatical Errors
+* Runtime Errors
+* Logic Errors
+* Syntax Errors
+--
+
+[question]
+--
+Where in the EarSketch workspace can you get information about your bugs?
+
+[answers]
+* The console
+* The sound browser
+* The script browser
+* The DAW
+--
\ No newline at end of file
diff --git a/src/locales/uz/v2/legacy.adoc b/src/locales/uz/v2/legacy.adoc
new file mode 100644
index 000000000..aefd25a8d
--- /dev/null
+++ b/src/locales/uz/v2/legacy.adoc
@@ -0,0 +1,6 @@
+[[legacy]]
+== Archived Curriculum (2015-2020)
+
+:nofooter:
+
+This is an archive of the EarSketch core curriculum in use from 2015-2020.
\ No newline at end of file
diff --git a/src/locales/uz/v2/loops-and-layers.adoc b/src/locales/uz/v2/loops-and-layers.adoc
new file mode 100644
index 000000000..8f1b4a767
--- /dev/null
+++ b/src/locales/uz/v2/loops-and-layers.adoc
@@ -0,0 +1,414 @@
+[[loopandlayers]]
+== Loops and Layers
+
+:nofooter:
+
+Ushbu bobda siz `for` halqalari hamda kodingiz va musiqangizda takrorlashni qanday yaratishingiz haqida bilib olasiz. We will also cover musical layers and textures as well as some debugging tips.
+
+[[forloops]]
+=== `for` halqalari
+
+Musiqachilar andozani *halqada* qayta-qayta ijro etishi mumkin bo'lgani kabi, dasturchilar ham kompyuterdan vazifalarni qayta-qayta bajarishni so'rashi mumkin... *halqa* ichida! This is more concise: instead of writing an instruction many times, you write one loop with the instructions, and the computer knows to repeat them.
+
+Misol uchun, agar siz yaratgan `makeBeat()`ni takrorlamoqchi bo'lsangiz, `makeBeat()` funktsiyalarining bir necha qatorini yozish o'rniga, `for` halqasini yaratishingiz mumkin.
+
+////
+add new video
+more info here https://docs.google.com/spreadsheets/d/114pWGd27OkNC37ZRCZDIvoNPuwGLcO8KM5Z_sTjpn0M/edit#gid=0
+in the "revamping videos" tab (includes link to script)
+////
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-looping-my-beats.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-looping-my-beats.js.txt[]
+----
+
+[role="curriculum-python"]
+Python-da `for` halqalari 3 ta asosiy qismdan iborat:
+
+[role="curriculum-javascript"]
+JavaScript-da `for` halqalari 4 ta asosiy qismdan iborat:
+
+[[loop-components-PY]]
+.The basic components of a for loop
+[role="curriculum-python"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_PY.png[Alt Text]
+
+[[loop-components-JS]]
+.The basic components of a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.1.1: "]
+image::../media/U1P2/Loop_Components_JS.png[Alt Text]
+
+[role="curriculum-python"]
+* *Loop Counter*: Halqa hisoblagichi sifatida foydalanish uchun o'zgaruvchini yaratadi. Siz `for` halqasida bir nechta koʻrsatmalar qatoriga ega boʻlishingiz mumkin.
+* *Range*: halqa hisoblagichi uchun sonlar roʻyxatini tuzadigan funktsiya. The keyword `in` connects the loop counter to the range. `range()` ikkita argument oladi, boshlang'ich nuqta (o'z ichiga olgan holda) va tugash nuqtasi (mustasno holda): `range(startingNumber, endingNumber)`.
+* *Loop body*: halqaning tanasi qayta-qayta bajariladigan bayonotlarni o'z ichiga oladi. U `:` ikki nuqtadan so'ng to'g'ridan-to'g'ri *chekingan* (_tab_ tugmasi yordamida) barcha narsalarni o'z ichiga oladi.
+
+[role="curriculum-javascript"]
+* *Initialization*: Bu birinchi halqa ishga tushishidan oldin *halqa hisoblagichi* sifatida foydalanish uchun oʻzgaruvchini yaratadi.
+* *Loop Condition*: Bu halqa qayta ishga tushishini tekshiradi. If the statement is true, the loop body executes again. If the counter gets too high, the statement will be false, and we exit the loop. The computer then continues executing code after the loop.
+* *Takrorlanish bayonoti*: halqa hisoblagichini yangilaydigan bayonot. It counts up each time the loop repeats.
+* *Loop body*: halqaning tanasi qayta-qayta bajariladigan bayonotlarni o'z ichiga oladi. U jingalak qavslar `{ }` bilan o'ralgan va (_tab_ tugmasi yordamida) *chekingan*. Siz `for` halqasida bir nechta koʻrsatmalar qatoriga ega boʻlishingiz mumkin.
+
+.PRACTICE
+****
+. Create a `for` loop with the counter `measure` to have your `makeBeat()` from measures `1` to `4`
+. Modify your code to go from measures `3` to `7`
+. Then modify your code to have your beats on track `2` instead of track `1`, still from measures `3` to `7`
+. So'ng hisoblagich nomini o'zgartiring, trek va o'lchovlarni tanlang va tegishli `for` halqasini yarating
+. Qo‘shningizga so'nggi `for` halqasini ko'rsating va ular sizning zarbangiz qaysi trekda yoqilganligini, unda qaysi o'lchovlar yoqilaganini va hisoblagichingizning nomini aniqlashlarini so‘rang.
+****
+
+{nbsp} +
+
+[[printstatements]]
+=== Print statements
+
+To better understand the flow of your code, you can use `print()`. It allows you to display information in the console when you run the code.
+
+[role="curriculum-python"]
+When use provide data to `print()`, it is *evaluated*, or simplified it to its basic form.
+
+[role="curriculum-javascript"]
+When use provide data to `println()`, it is *evaluated*, or simplified it to its basic form.
+
+Then the data is converted into text and shown in the console.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+Before running the following code, try to guess what the console will display for each `print()` call.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+Quyidagi kodni ishga tushirishdan oldin, har bir `println()` chaqiruvi uchun konsol nimani ko'rsatishini taxmin qilishga harakat qiling.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-printing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-printing.js.txt[]
+----
+
+Here, you will see in your console the following lines:
+
+----
+4 (this is 1+3, simplified)
+1 (initially your counter measure is equal to 1)
+ok
+2 (now your counter measure is equal to 2)
+ok (every time we go through one loop, we print "ok", that's why it's repeated)
+3
+ok
+4
+ok
+----
+
+and it ends there since measure has to be lower than 5, so 4 is your limit.
+
+[[controlflow]]
+=== Control Flow
+
+`For` halqalaridan qanday foydalanishga yana bir misol:
+
+[role="curriculum-python curriculum-mp4"]
+[[video12bpy]]
+video::./videoMedia/012-03-ExampleLoop-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video12bjs]]
+video::./videoMedia/012-03-ExampleLoop-JS.mp4[]
+
+Biz musiqamizda takrorlanish uchun `fitMedia()` ni turli oʻlchov raqamlari bilan qayta-qayta kiritishimiz mumkin:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-no-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-no-loops.js.txt[]
+----
+
+We can use a `for` loop to create the exact same music with less code. Our counter here is `measure`. Note that the body of the loop contains two lines of code, both of which use the counter `measure`.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-loops.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-loops.js.txt[]
+----
+
+*Interpretator* skriptni o‘qiydi va bajaradi. Uning bajarilish tartibi *boshqaruv oqimi* deb ataladi. It usually goes line by line, top to bottom. This is why we need to define variables before calling them in the code.
+
+Halqa bu tartibni o'zgartiradigan *boshqaruv oqimining bayonoti*. At the end of a loop body, it jumps back to the top of the loop.
+
+Bu animatsiya boshqaruv oqimining `for` halqasida qanday harakatlanishini va halqa hisoblagichining qiymati har bir *takrorlanish*da yoki halqa tanasining takrorlanishida qanday o‘zgarishini ko‘rsatadi:
+
+[[loop-py]]
+.Stepping through a for loop
+[role="curriculum-python"]
+[caption="Figure 4.2.1: "]
+image::../media/U1P2/LoopPy_updated.gif[Alt Text]
+
+.Stepping through a for loop
+[role="curriculum-javascript"]
+[caption="Figure 4.2.1: "]
+[[loop-js]]
+image::../media/U1P2/LoopJS_updated.gif[Alt Text]
+
+////
+Although it is valid syntax, a `*monospace bold phrase*` causes a build error in AsciidocFX. Might be something to do with DocBook conversion. No bold for now. May see how ES handles it in the future.
+
+BMW
+////
+
+`for` halqalari haqida yana bir qiziqarli narsa - bu o'sish.
+
+[role="curriculum-python"]
+O'sish hisoblagich qiymatini oshirishni anglatadi. `for` halqalarida hisoblagichni oshirish uchun `range()` funktsiyasidan foydalandik. We've seen two parameters for range: `startingNumber` and `endingNumber`. `O'sish` deb nomlanuvchi ixtiyoriy uchinchi parametr mavjud. By default, `increment` is equal to one, but you can use it to increment by more than one. For example, range(0, 10, 4) would increment by 4 between 0 and 10.
+
+[role="curriculum-javascript"]
+O'sish hisoblagich qiymatini oshirishni anglatadi. `for` halqalarida biz `measure = measure + 1` atamalaridan foydalanganmiz. This increments the counter `measure` by `1` for on each repeat. Uni bir necha marta oshirish mumkin, masalan, `measure = measure + 4'.
+
+.PRACTICE
+****
+Before running the following code, try to guess what it will do.
+****
+
+{nbsp} +
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/loops-and-layers-incrementing.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/loops-and-layers-incrementing.js.txt[]
+----
+
+[role="curriculum-python"]
+Bu yerda biz `range()` funktsiyasidan foydalandik, lekin siz `measure = measure + 1` ifodasi yordamida oʻzgaruvchini oshirish (o'sish) yoki tushirishingiz (pasayish) ham mumkin. This means measure is now equal to its former value plus one. Siz o'sish uchun `+=` yoki pasayish uchun `-=` qisqartmasidan foydalanishingiz mumkin. Bu quyidagicha: `measure += 1` va `measure = measure + 1` teng iboralar. Shuningdek, `measure -=1` va `measure = measure- 1` teng iboralar
+
+[role="curriculum-python"]
+* `measure += 1` increments measure by 1. Agar siz bir nechta orttirmoqchi bo'lsangiz, `measure += 2` dan foydalaning.
+* `measure -= 1` decrements measure by 1. Agar siz birdan ortiq pasaytirmoqchi bo'lsangiz, `measure -= 2` dan foydalaning.
+
+[role="curriculum-javascript"]
+Bu yerda biz `measure = measure + 4` deb yozdik, yaʼni oʻlchov endi avvalgi qiymatiga nisbatan toʻrttaga ko'p qiymatga teng. Siz ba'zi qisqartmalardan foydalanishingiz mumkin:
+ `+=` (yoki pasayish uchun `-=`). The following is a shorthand method for incrementing (or decrementing) a counter:
+
+[role="curriculum-javascript"]
+* `measure++` yoki `measure += 1` o'lchovni 1 ga oshiradi. Agar siz bir nechta orttirmoqchi bo'lsangiz, `measure += 2` dan foydalaning.
+* `measure--` yoki `measure -= 1` o'lchovni 1 ga pasaytiradi. Agar siz birdan ortiq pasaytirmoqchi bo'lsangiz, `measure -= 2` dan foydalaning.
+
+[[debuggingtips]]
+=== Debugging Tips
+
+Programming is not only writing code. Bundan tashqari, undagi nosozliklarni tuzatish va xizmat ko'satish. Debugging means finding and solving bugs. Bugs are another term for errors in your code. Try following these steps if you run into an error:
+
+[role="curriculum-python"]
+. *Ishoralar uchun konsolni o'qing*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-python"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. Siz kod blokiga sharh sintaksisini qo'yish yoki *uni sharhlash* va kodni ishga tushirish orqali xatoni qisqartirishingiz mumkin. If there is no error, the error is somewhere in the commented block.
+.. *Chop etishda nosozliklarni tuzatish* xatoni aniqlash uchun ham ishlatilishi mumkin. Read through the problem section of your code and try to follow the logic. Insert `print()` calls where you are unsure of the logic, getting the value of variables and checking program state. This helps you check your understanding of the program against what is actually happening.
+. *Xatoni bartaraf qiling:* Xatolarni tekshiring va uni keltirib chiqargan kodni tahrirlang, so'ng uning to'g'riligini tekshirish uchun uni ishga tushiring.
+. *Yordam so'rang:* Agar xatoga ko'p vaqt sarflaganingizni aniqlasangiz, kimdandir yordam so'rang! A fresh pair of eyes can do wonders for spotting mistakes.
+
+[role="curriculum-javascript"]
+. *Ishoralar uchun konsolni o'qing*.
+. *Locate the error in your code:* You have three options here.
+[role="curriculum-javascript"]
+.. If the console provided a line number, take a look at that line and the previous line in your code.
+.. Use the "comment out" method. Siz kod blokiga sharh sintaksisini qo'yish yoki *uni sharhlash* va kodni ishga tushirish orqali xatoni qisqartirishingiz mumkin. If there is no error, the error is somewhere in the commented block.
+.. *Chop etishda nosozliklarni tuzatish* xatoni aniqlash uchun ham ishlatilishi mumkin. Read through the problem section of your code and try to follow the logic. Mantiqqa ishonchingiz komil bo'lmagan, o'zgaruvchilar qiymatini olish va dastur holatini tekshirish uchun `println()` chaqiruvlarini kiriting. This helps you check your understanding of the program against what is actually happening.
+. *Xatoni bartaraf qiling:* Xatolarni tekshiring va uni keltirib chiqargan kodni tahrirlang, so'ng uning to'g'riligini tekshirish uchun uni ishga tushiring.
+. *Yordam so'rang:* Agar xatoga ko'p vaqt sarflaganingizni aniqlasangiz, kimdandir yordam so'rang! A fresh pair of eyes can do wonders for spotting mistakes.
+
+Below, we walk through an example of printing variables to help debug a script:
+
+[role="curriculum-python curriculum-mp4"]
+[[video15py]]
+video::./videoMedia/015-02-TheDebuggingProcess-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video15js]]
+video::./videoMedia/015-02-TheDebuggingProcess-JS.mp4[]
+
+1-Bobda siz uchratishingiz mumkin bo'lgan xatolar ro'yxatini ko'rdingiz. Here are some other errors that you might encounter:
+
+[role="curriculum-python"]
+. *O'zgaruvchilarni ishga tushirish*: O'zgaruvchini skriptda foydalanishdan avval uni ishga tushirish kerak. This means you should assign a value to your variable before using it later.
+. *Sharhlar:* Noto'g'ri sharhlash <>ga sabab bo'ladi. Python sharhlari `#` belgisi bilan boshlanishi kerak.
+. *Chekinish:* Python-da chekinish juda muhim. `for` halqa jismlarida chekinish bo`lmasa, <> hosil bo`ladi.
+. *Qo'shtirnoqlar:* Ochish yoki yopish qo'shtirnoq belgisini unutish ham <> hosil bo'lishiga olib keladi.
+. *Argumentlar:* Funktsiya argumentlari bilan bog'liq xatolar barcha turdagi xatolarga olib kelishi mumkin. You must provide the correct number and type of arguments to a function call.
+
+[role="curriculum-javascript"]
+. *O'zgaruvchilarni ishga tushirish*: O'zgaruvchini skriptda foydalanishdan avval uni ishga tushirish kerak. This means you should create it with `var` before using it later.
+. *Semicolons in for loop definition*: Semicolons must be used to separate the three parts (initialization, condition, and iteration statement) of a for loop definition.
+. *Sharhlar:* Noto'g'ri sharhlash <>ga sabab bo'ladi. JavaScript sharhlari `//` belgisi bilan boshlanishi kerak.
+. *Qo'shtirnoqlar:* Ochish yoki yopish qo'shtirnoq belgisini unutish ham <> hosil bo'lishiga olib keladi.
+. *Argumentlar:* Funktsiya argumentlari bilan bog'liq xatolar barcha turdagi xatolarga olib kelishi mumkin. You must provide the correct number and type of arguments to a function call.
+
+Turli xil xatolarning toʻliq tavsifi va ularni oldini olish uchun nima qilishingiz mumkinligi haqida <>ni koʻrib chiqing.
+
+[[musicaltips]]
+=== Musical tips
+
+Endi sizda musiqa yaratish uchun `fitMedia()`, `makeBeat()` va `for` halqalari kabi koʻplab vositalar mavjud boʻlgani uchun biz musiqiy gʻoyalarni koʻrib chiqamiz.
+
+Qo'shiqingizning *kalitidan* boshlaylik:
+
+* *Tovush pardasi* - bu nota qanchalik baland yoki past ovozda chiqishi. Biz nisbiy musiqiy ohanglarga *shkalada* yoki tovush chastotasining jarangiga qarab musiqiy notalar to'plamiga buyurtma beramiz.
+* Qo'shiqning *kaliti* musiqa tuzilgan miqyosdagi tovush pardalarining shkalasi yoki guruhini ko'rsatadi. Keys can be major (usually sounds "happier") or minor (usually sounds "darker").
+* For beginner composers, we recommend that you have just one key for your song. Tovushlarni turli kalitlardan tanlash bu narsaga olib keladi... soxta jaranglash! In general, sounds within the same folder in the EarSketch sound library are all in the same key.
+
+Listen to the audio clip below to hear the difference between major and minor keys (the major scale and chord is first):
+
+++++
+audioMedia/MajorMinor.mp3
+++++
+
+Endi sizda bo'lishi mumkin bo'lgan treklarning har xil turlari haqida gapiraylik. You might remember that you can use one track of your DAW for each type of instrument. In a pop song, you can find the following basic tracks:
+
+* *Melodiya* - bu ko'pincha balandroq pardada bo'lgan asosiy g'oya yoki "yetakchi kuylanadigan notalar." It can be a voice, higher notes of a keyboard, guitar, etc.
+* *Uyg'unlik* - bu pianinodagi akkordlar, chalinadigan gitara yoki satrlar to'plami kabi "ohangni qo'llab-quvvatlovchi" uzunroq tovushli notalardir.
+* Sizda *bas qatori* ham bor. These are lower pitches. It can be a bass, a cello, the lower notes of a keyboard, etc.
+* Keyin *zarbdorlik* mavjud. Agar siz `makeBeat()` dan foydalansangiz, bu bir nechta treklarni olishi mumkin. For example, you can have one track for your kick, one for your snare, and one for your hi-hat.
+
+Bular qo'shig'ingizning tuzilishini yaratadigan asosiy g'oyalardir. However, you can have some parts of your song that only contain one or two of the four. You can also add a lot more tracks: you can create a second melody, add drones (very long notes in the background), recorded sounds, whooshes, etc. The possibilities are endless! Explore ideas and keep the ones you like most!
+
+Nihoyat, keling, *takrorlash* va *kontrast*ni muhokama qilaylik. Psixologlar _shunchaki ta'sir qilish effekti_ deb ataydigan ibora tufayli odamlar takrorlashni yaxshi ko'radilar. Upon hearing a repeated section of music, the brain will try to imagine the next note before it is played, which makes us feel as if we are participating. Likewise, each time a section of music is repeated, the listener can notice different details of the piece, because the brain no longer has to focus on processing the raw melodic content.
+
+Contrast refers to differences in subsequent sections of music, providing an important balance with repetition. Contrast is used to bring new elements to the listener’s attention. Musicians provide contrast with: rhythmic change, new melodic lines or harmonies, or variations in the instruments or sounds used.
+
+.PRACTICE
+****
+Create a complete song with:
+
+* A theme (please mention your chosen theme in your commented intro in the code)
+* `fitMedia()` va `makeBeat()` fuktsiyalari
+* `fitMedia()` yoki `makeBeat()` bilan bir yoki bir nechta `for` halqa(lar)
+* At least four tracks
+* At least sixteen measures
+* At least one uploaded sound
+* Comments and variables to organize your code
+
+Remember that you can try things out and keep only the sounds/ideas that you like most. Feel free to share your music!
+****
+
+{nbsp} +
+
+[[chapter4summary]]
+=== Chapter 4 Summary
+
+[role="curriculum-python"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` halqalari halqa tanasi, halqa hisoblagichi va diapazondan iborat. The code in the loop body must be indented.
+* *Boshqaruv oqimi* bayonotlar kompyuter tomonidan bajarilish tartibini ifodalaydi.
+* `print()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Umumiy dasturlash xatolarining kengaytirilgan ro'yxatini qayta ko'rib chiqish: <>.
+* Ohangning *tovush pardasi* nisbiy shkalada uning qanchalik baland yoki past yangrashini aniqlaydi.
+* Qo'shiqning *kaliti* parcha yaratilgan miqyosdagi tovush pardalarining *shkalasi* yoki guruhini ko'rsatadi hamda *tonik* notasini belgilaydi. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use 3 basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[role="curriculum-javascript"]
+* A *`for` loop* instructs the computer to execute a code section repeatedly, requiring less code. `for` halqalari halqa tanasi, ishga tushirish, takrorlanish bayonoti va halqa shartidan iborat. The code in the loop body should be indented.
+* *Boshqaruv oqimi* bayonotlar kompyuter tomonidan bajarilish tartibini ifodalaydi.
+* `println()` displays the data in the console. It is a useful tool for debugging because it allows the programmer to learn the state of the program.
+* Printing, commenting out code, and the console can all be used to debug code. Additionally, asking someone for help can significantly speed up the debugging process.
+* Umumiy dasturlash xatolarining kengaytirilgan ro'yxatini qayta ko'rib chiqish: <>.
+* Ohangning *tovush pardasi* nisbiy shkalada uning qanchalik baland yoki past yangrashini aniqlaydi.
+* Qo'shiqning *kaliti* parcha yaratilgan miqyosdagi tovush pardalarining *shkalasi* yoki guruhini ko'rsatadi hamda *tonik* notasini belgilaydi. Keys are either major or minor, which tend to give a different impression to the listener.
+* You can use three basic tracks for the backbone of your songs: higher pitched melody, lower pitched bass, and percussion.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Quyidagilardan qaysi biri `for` halqasining komponenti EMAS?
+
+[answers]
+* Loop interpreter
+* Loop Counter
+* Loop Body
+* Loop Range
+--
+
+[question]
+--
+Which of the following is NOT a good use of loops in a musical composition?
+
+[answers]
+* Creating a beat pattern than never repeats
+* Placing musical clips on every third measure
+* Repeating a beat on several consecutive measures
+* Placing musical clips on odd measures
+--
+
+[question]
+--
+Which of the following is NOT a recommended technique for debugging?
+
+[answers]
+* Copying and pasting code into Google
+* Printing variable values to the console
+* Looking at error lines identified in the console
+* Asking others for help
+--
+
+[question]
+--
+Which of the following is NOT something that can be printed to the console?
+
+[answers]
+* Code Comments
+* Strings
+* Mathematical Expressions
+* Variables
+--
+
+[question]
+--
+____ tovushning qanchalik baland yoki pastligini belgilovchi sifati.
+
+[answers]
+* Pitch
+* Tempo
+* Rhythm
+* Loudness
+--
\ No newline at end of file
diff --git a/src/locales/uz/v2/mixing-with-conditionals.adoc b/src/locales/uz/v2/mixing-with-conditionals.adoc
new file mode 100644
index 000000000..23b87407f
--- /dev/null
+++ b/src/locales/uz/v2/mixing-with-conditionals.adoc
@@ -0,0 +1,363 @@
+[[mixingwithconditionnals]]
+== Mix with Conditionals!
+
+:nofooter:
+
+In coding, you can automate things. An example of automation is if you are programming a robot so that it stops when an obstacle is detected. In this scenario, the robot won’t need a human being to tell it to stop manually. Instead, the robot will have a sensor to detect obstacles, and if there is one, it will stop. We can do musical automations in EarSketch using conditionals (`if` statements). We will see how to automate the mixing of the tracks. Mixing means if a track is too loud, we’ll reduce its volume and if it’s too quiet, we’ll increase its volume.
+
+[[analyzetrack]]
+=== `analyzeTrack()`dan foydalaning
+
+We’ll see how to detect the loudness, or volume of a track. Make sure you understand the difference between the pitch (high or low) and volume (loud or quiet) of a sound. Biz `analyzeTrack()` deb nomlangan EarSketch funktsiyasidan foydalanamiz. Import and run the following code:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-analyzetrack.js.txt[]
+----
+
+You can read in your console that the printed loudness is 0.10306035109110138.
+
+* The loudness can go from 0 (silence) to 1 (maximum loudness).
+* Sometimes you will see a number looking like this: 1.74630733714e-05. This is called scientific notation: see the e-05 at the end? It means move the decimal to the left 5 places (replacing with 0 if needed). This is equal to 0.0000174630733714.
+* Most of the sounds will have a loudness under 0.4
+
+`analyzeTrack()` funktsiyasi 2 ta argumentni oladi:
+
+. *track*: Track number
+. *feature*: Analysis constant, like `RMS_AMPLITUDE`
+
+.PRACTICE
+****
+. Try using the code given above with different sounds (change the variable `sound`) to see what the output is.
+. Ikkinchi trekni qo'shing va uning ovoz balandligini konsolda chop etish uchun `analyzeTrack()` funktsiyasidan foydalaning. When you run the code, before looking at your console, listen to your music and try to guess which track is louder.
+****
+
+`analyzeTrack()` parametri ovoz balandligini baholash uchun `RMS_AMPLITUDE` yoki tovush yorqinligini tahlil qilish uchun `SPECTRAL_CENTROID` boʻlishi mumkin. Biz ushbu bobda ovoz balandligini tahlil qilishga e'tibor qaratamiz.
+
+[[booleansandcomparisons]]
+=== Booleans and comparisons
+
+We will now see how *Boolean Logic* works. This will help us automate some tasks.
+
+[role="curriculum-python"]
+*Mantiqiy qiymatlar* ma'lumotlar turidir. Boolean ma'lumotlar turi faqat ikkita mumkin bo'lgan qiymatga ega, `True` va `False`. `True` va `False` soʻzlari bosh harf bilan boshlanadi va qo'shtirnoqsiz yoziladi.
+
+[role="curriculum-javascript"]
+*Mantiqiy qiymatlar* ma'lumotlar turidir. Boolean ma'lumotlar turi faqat ikkita mumkin bo'lgan qiymatga ega, `true` va `false`. `true` va `false` kichik harf bilan boshlanadi va qo'shtirnoqsiz yoziladi.
+
+[role="curriculum-python"]
+--
+Mantiqiy qiymat yaratish uchun siz o‘zgaruvchini ishga tushirishingiz mumkin (`var variable1 = True;`) yoki taqqoslashdan foydalanishingiz mumkin. Taqqoslash uchun biz *taqqoslash operatoridan* foydalanamiz. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|==
+|is equal to
+
+|!=
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Ikki qiymatni taqqoslash, ularning bir xilligini aniqlash uchun: `==`
+1. O'zgaruvchiga qiymat tayinlash: `=`
+--
+
+[role="curriculum-javascript"]
+--
+Mantiqiy qiymat yaratish uchun siz o‘zgaruvchini ishga tushirishingiz mumkin (`var variable1 = true;`) yoki taqqoslashdan foydalanishingiz mumkin. Taqqoslash uchun biz *taqqoslash operatoridan* foydalanamiz. Here are the comparison operators:
+
+[cols="^h,1"]
+|===
+|===
+|is equal to
+
+|!==
+|is not equal to
+
+|>
+|is greater than
+
+|>=
+|is greater than or equal
+
+|<
+|is less than
+
+|\<=
+|is less than or equal
+|===
+
+Note the difference between:
+
+1. Comparing two values to see if they are equal: `===`
+1. O'zgaruvchiga qiymat tayinlash: `=`
+--
+
+[role="curriculum-python curriculum-mp4"]
+[[video17apy]]
+video::./videoMedia/6_2_1_boolean_py.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video17ajs]]
+video::./videoMedia/6_2_1_boolean_js.mp4[]
+
+// this video will be cut at 2' to delete the section about boolean operators//
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Agar birinchi trek ikkinchi trekdan balandroq bo'lsa, `Rost`, aks holda `Yolg'on` deb chop eting.
+* Har bir trek uchun ovoz balandligi 0,01 dan aniq katta ekanligini tekshirish uchun `trek` hisoblagichi bilan for halqasidan foydalaning. Agar shunday bo'lsa, `Rost`ni, bo'lmasa, `Yolg'on`ni chop eting.
+* Siz `True` yoki `False`ni chop etishdan oldin qo‘shimcha chop etish bayonotlaridan foydalanishingiz mumkin, shunda konsolni o‘qiganingizda nima `Rost` yoki `Yolg'on` ekanligini bilib olasiz. For example, you can first print the track number and then 'True' or 'False'.
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script, and add sounds on two tracks.
+* Agar birinchi trek ikkinchi trekdan balandroq bo'lsa, `rost`, aks holda `yolg'on` deb chop eting.
+* Har bir trek uchun ovoz balandligi 0,01 dan aniq katta ekanligini tekshirish uchun `trek` hisoblagichi bilan for halqasidan foydalaning. Agar shunday bo'lsa, `rost`ni, bo'lmasa, `yolg'on`ni chop eting.
+* Siz `true` yoki `false`ni chop etishdan oldin qo‘shimcha chop etish bayonotlaridan foydalanishingiz mumkin, shunda konsolni o‘qiganingizda nima `rost` yoki `yolg'on` ekanligini bilib olasiz. For example, you can first print the track number and then 'true' or 'false'.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-boolean-example.js.txt[]
+----
+
+[role="curriculum-python"]
+In this example, we used `print()` with strings to help read the content of the console. Biz `+` operatoridan *yopishtirish* yoki satrlarni qoʻshish uchun, str() funktsiyasidan esa raqamlarni satrlarga aylantirish uchun foydalandik.
+
+[role="curriculum-javascript"]
+In this example, we used `println()` with strings to help read the content of the console. Biz `+` operatoridan *yopishtirish* yoki satrlarni qoʻshish uchun foydalandik.
+
+[[conditionalstatements]]
+=== Conditional Statements
+
+What is a conditional statement? *Bayonot* - bu kompyuter uchun ko'rsatma. *Shartli bayonot* - bu ma'lum bir *shart* rost bo'lgandagina bajarilishi kerak bo'lgan ko'rsatma. For example if you program a robot for it to stop in front of an obstacle, the condition is "is there an obstacle?". If yes, then stop. Agar yo'q bo'lsa, hech narsa qilmang (davom eting).
+
+Below is an example of conditional statement, note the similarity with a for loop:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled1.js.txt[]
+----
+
+.PRACTICE
+****
+* Create a new script with two tracks.
+* If the first track is louder than the second one, then reduce its volume. You'll need the `analyzeTrack()` and `setEffect()` functions, plus an `if` statement.
+* You will need a negative gain (between -1dB and -60dB) to reduce the volume.
+****
+
+Here is an example:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-1.js.txt[]
+----
+
+We might want to check several conditions and execute a different set of statements depending on each condition. You can chain multiple conditions together. We use the following syntax:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled2.js.txt[]
+----
+
+[[mixingyourtracks]]
+=== Mix your tracks
+
+Keling, qo'shiqni miks qilish uchun ushbu barcha vositalardan foydalanaylik. Mixing is modifying the volume of tracks so that they sound well balanced together.
+
+[role="curriculum-python"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or one track that you wish to highlight.
+* Agar sizning asosiy trekingiz boshqa treklardan balandroq bo'lmasa, `setEffect()` funktsiyasidan foydalanib uning ovoz balandligini oshirganingizga ishonch hosil qiling. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `print()` to show your process in the console. Here is an example: `print("Is track number" + str(track) + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?". The function `str()` converts a number (ex: `1`) into a string (ex: `"1"`).
+****
+
+[role="curriculum-javascript"]
+.PRACTICE
+****
+* Create a new script.
+* Add sounds on at least three tracks for at least sixteen measures.
+* You can use the `makeBeat()` function and a `for` loop to add percussion.
+* Choose your "main" track. It can be your melody, or the track that you wish to highlight.
+* Agar sizning asosiy trekingiz boshqa treklardan balandroq bo'lmasa, `setEffect()` funktsiyasidan foydalanib uning ovoz balandligini oshirganingizga ishonch hosil qiling. Don't take the percussive track into account, as `analyzeTrack()` is not relevant for percussion. `analyzeTrack()` returns a mean whereas percussion are bursts of sound, so a mean doesn't really evaluate the loudness.
+* Use `println()` to show your process in the console. Here is an example: `println("Is track number" + track + "greater than 0.01?")`, if the counter `track` is equal to `1`, this will print "Is track number 1 greater than 0.01?".
+****
+
+Keling, ba'zi lug'atlarni ko'rib chiqaylik:
+
+1. *Operator*: harakatni ifodalovchi belgi. We have seen arithmetic operators (`\+`, `-`, `\*`, `=`) and comparison operators (`>`, `>=`, `<`, `\<=`, `===`, `!==`).
+1. *Ifoda*: qiymatlar, konstantalar, o‘zgaruvchilar, operatorlar va funktsiyalar birikmasi. The computer evaluates expressions to produce a result, usually a single numeric or boolean value. For example: `1 + 2` (evaluated to 3) or `1 < 2` (evaluated to True) or `analyzeTrack(1, RMS_AMPLITUDE)` (evaluated to the loudness of track `1`, a float between 0 and 1).
+1. *Bayonotllar* - bu kompyuter bajarishi uchun ko'rsatma.
+
+Below is an example of automated mixing. Agar siz bir yoki bir nechta tovushni o'zgartirsangiz, ularning ovoz balandligini tekshirishingiz va o'zingiz o'zgartirishingiz shart emas, chunki u allaqachon kodga kiritilgan. Shuning uchun biz buni avtomatlashtirilgan deb aytishimiz mumkin.
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-automatic-mixing-2.js.txt[]
+----
+
+{nbsp} +
+
+[[chapter6summary]]
+=== Chapter 6 Summary
+
+[role="curriculum-python"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* *Boolean* maʼlumotlar turi faqat ikkita mumkin boʻlgan qiymatga ega, `True` va `False`.
+* Mantiqiy qiymatlar ushbu taqqoslash operatorlari tomonidan hosil qilinadi: `==`, `!=`, `>`, `>=`, `<`, `\<=`.
+* `==` 2 ta qiymat tengligini baholaydi, `=` esa o`zgaruvchiga qiymat tayinlaydi.
+* *Operator*: harakatni ifodalovchi belgi.
+* *Ifodalar* qiymat ishlab chiqarish uchun kompyuter tomonidan baholanadi.
+* *Bayonot* - bu kompyuter uchun ko'rsatma.
+* *Shart* `Rost` yoki `Yolg'on` deb baholanadigan iboradir.
+* The `if` statement only executes its code block when its condition is `True`.
+* In the event that an `if` statement's condition is `False`, an optional `else` statement allows an alternative code block to be executed.
+
+[role="curriculum-javascript"]
+* The `analyzeTrack()` function takes two arguments: the track and feature. When the feature is `RMS_AMPLITUDE`, the function will return the loudness of the track (a number between 0 and 1). When the feature is `SPECTRAL_CENTROID`, the function will return the brightness of the track.
+* *Boolean* maʼlumotlar turi faqat ikkita mumkin boʻlgan qiymatga ega, `true` va `false`.
+* Boolean values are generated by comparison operators: `===`, `!==`, `>`, `>=`, `<`, `\<=`.
+* `===` evaluates if 2 values are equal, whereas `=` assigns a value to a variable.
+* *Operator*: harakatni ifodalovchi belgi.
+* *Ifodalar* qiymat ishlab chiqarish uchun kompyuter tomonidan baholanadi.
+* *Bayonot* - bu kompyuter uchun ko'rsatma.
+* *Shart* `rost` yoki `yolg'on` deb baholanadigan iboradir.
+* The `if` statement only executes its code block when its condition is `true`.
+* In the event that an `if` statement's condition is `false`, an optional `else` statement allows an alternative code block to be executed.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+Which of the following elements is a boolean?
+
+[answers]
+* `5+4 === 5`
+* `o'lchov = 1`
+* `2<3<4`
+* `False()`
+--
+
+[role="curriculum-python"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,python]
+----
+include::code-examples/mixing-with-conditionals-untitled3.py.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[role="curriculum-javascript"]
+[question]
+--
+What would the output of this block of code be (what would print to the console)?
+
+[source,javascript]
+----
+include::code-examples/mixing-with-conditionals-untitled3.js.txt[]
+----
+
+[answers]
+* 10
+* 5
+* True
+* False
+--
+
+[question]
+--
+What is mixing?
+
+[answers]
+* adapting the volume of each track so they sound well balanced
+* adapting the pitch of each track so they sound well balanced
+* adding a fade in
+* adding a fade out
+--
+
+[question]
+--
+How many conditions can you check in a conditional statement?
+
+[answers]
+* any number of conditions
+* 1 condition
+* 2 conditions
+* 3 conditions
+--
\ No newline at end of file
diff --git a/src/locales/uz/v2/optional.adoc b/src/locales/uz/v2/optional.adoc
new file mode 100644
index 000000000..fcb6d81fa
--- /dev/null
+++ b/src/locales/uz/v2/optional.adoc
@@ -0,0 +1,6 @@
+[[optional]]
+== Optional: To Learn More!
+
+:nofooter:
+
+Ushbu bo'limda siz kod ko'rsatmalarini samarali tarzda takrorlash imkonini beruvchi for halqalari haqida bilib olasiz. Shuningdek, biz tovush effektlari va vaqt o'tishi bilan effektlarning evolyutsiyasi bo'lgan zarflarni ko'rib chiqamiz. Va nihoyat, siz treklaringizni mix qilish va shartlardan foydalanishni o'rganasiz.
\ No newline at end of file
diff --git a/src/locales/uz/v2/reference.adoc b/src/locales/uz/v2/reference.adoc
new file mode 100644
index 000000000..86cbc2462
--- /dev/null
+++ b/src/locales/uz/v2/reference.adoc
@@ -0,0 +1,6 @@
+[[reference]]
+== Effektlar, Xatolar va EarSketch Funktsiyalari
+
+:nofooter:
+
+Ushbu bo'limda siz barcha effektlar, xatolar va EarSketch IDI funktsiyalariga havolalarni topasiz.
\ No newline at end of file
diff --git a/src/locales/uz/v2/unit-1.adoc b/src/locales/uz/v2/unit-1.adoc
new file mode 100644
index 000000000..06a04347c
--- /dev/null
+++ b/src/locales/uz/v2/unit-1.adoc
@@ -0,0 +1,18 @@
+[[unit1]]
+== 1-dars: Zarba yaratish va qo'shish
+
+:nofooter:
+
+Ushbu bo'limda siz EarSketch qanday ishlashini o'rganasiz, musiqangizga tovushlarni (kliplarni) joylashtirasiz, kodingizdagi nosozliglarni tuzatasiz, qo'shig'ingizni sozlaysiz va musiqiy janringizga mos zarbalar qo'shasiz.
+
+Har kim (ayniqsa, siz) dasturlashni o'rganishi mumkin! Muvaffaqiyatga erishish uchun musiqa asbobini o'rganish kabi izchil mashq qilish kerak. Agar bir joyda qotib qolsangiz tushkunlikka tushmang, bu jarayonning bir qismi. Sinfingizdan yordam so'rang yoki kerak bo'lsa, internetdan qarang.
+
+Sizga omad tilaymiz va boshlashdan oldin EarSketch bilan nima qilishingiz mumkinligiga misol keltiramiz:
+
+[role="curriculum-python curriculum-mp4"]
+[[video1livepy]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-PY.mp4[]
+
+[role="curriculum-javascript curriculum-mp4"]
+[[video1livejs]]
+video::./videoMedia/001-01-WhyLearnProgrammingforMusic-JS.mp4[]
\ No newline at end of file
diff --git a/src/locales/uz/v2/unit-2.adoc b/src/locales/uz/v2/unit-2.adoc
new file mode 100644
index 000000000..e465b17c1
--- /dev/null
+++ b/src/locales/uz/v2/unit-2.adoc
@@ -0,0 +1,6 @@
+[[unit2]]
+== 2-dars: Halqalar, Effektlar, Mix qiliish
+
+:nofooter:
+
+Ushbu bo'limda siz kod ko'rsatmalarini samarali tarzda takrorlash imkonini beruvchi for halqalari haqida bilib olasiz. Shuningdek, biz tovush effektlari va vaqt o'tishi bilan effektlarning evolyutsiyasi bo'lgan zarflarni ko'rib chiqamiz. Va nihoyat, siz treklaringizni mix qilish va shartlardan foydalanishni o'rganasiz.
\ No newline at end of file
diff --git a/src/locales/uz/v2/unit-3.adoc b/src/locales/uz/v2/unit-3.adoc
new file mode 100644
index 000000000..a9cf2928f
--- /dev/null
+++ b/src/locales/uz/v2/unit-3.adoc
@@ -0,0 +1,8 @@
+[[unit3]]
+== 3-dars: Qo'shiqlaringizni tuzing
+
+:nofooter:
+
+Endi sizda qo'shiq yaratish, effektlar qo'shish va treklaringizni mix qilish uchun ko'plab vositalar mavjud bo'lgani uchun biz qo'shiqning tuzilishini ko'rib chiqamiz. Buning uchun biz maxsus funktsiyalardan foydalanamiz: bu oʻzingiz yaratadigan funktsiyalar!
+
+Shuningdek, biz shaxsiylashtirilgan qo'shiqlarni yaratish uchun foydalanuvchi tomonidan kiritilgan ma'lumotlarni hamda ularni kodingizga qanday joriy etish mumkinligini ko'rib chiqamiz. Va nihoyat, kodingizni soddalashtirish uchun ma'lumot tuzilmalaridan qanday foydalanishingiz mumkinligini ko'rib chiqamiz.
\ No newline at end of file
diff --git a/src/locales/uz/v2/welcome.adoc b/src/locales/uz/v2/welcome.adoc
new file mode 100644
index 000000000..232cf7e36
--- /dev/null
+++ b/src/locales/uz/v2/welcome.adoc
@@ -0,0 +1,26 @@
+[[welcome]]
+== Welcome Students and Teachers!
+
+:nofooter:
+
+Welcome to EarSketch!
+
+*O‘qituvchilar*: https://earsketch.gatech.edu/teachermaterials/EarSketch_Alignment_Guide.pdf[yangi o‘quv dasturi bo‘yicha qo‘llanma^] bilan tanishing va qo‘shimcha ma’lumot uchun https://www.teachers.earsketch.org[EarSketch O'qituvchi Saytiga^] tashrif buyuring.
+
+*Talabalar*: EarSketch haqida batafsil ma'lumot olish uchun quyida davom eting
+
+Here you will learn computer science and music technology side by side. You will use either Python or JavaScript to create your own music.
+
+Musicians and programmers write computer code to create new sounds, effects, and songs.
+
+[role="curriculum-mp4"]
+[[video0]]
+video::../landing/media/homepagevid.a1cf3d01.mp4[poster=../landing/img/homepagevid-poster.8993a985.png]
+
+Learning to write computer code is a skill that will be useful to you in a variety of career paths.
+
+Balki siz afsonaviy musiqa prodyuseri yoki sanoatning eng talabgor ovoz yozish muhandisi bo'lasiz! We wish you good luck on your EarSketch journey.
+
+Click on the right arrow at the top of this text to get started.
+
+Oʻqituvchilar, bepul oʻqituvchi materiallari va hamjamiyatiga kirish uchun https://www.teachers.earsketch.org/[bu yerga^] bosing!
\ No newline at end of file
diff --git a/src/locales/uz/v2/your-first-song.adoc b/src/locales/uz/v2/your-first-song.adoc
new file mode 100644
index 000000000..d38132644
--- /dev/null
+++ b/src/locales/uz/v2/your-first-song.adoc
@@ -0,0 +1,290 @@
+[[customizeyourfirstsong]]
+== Customize your first song
+
+:nofooter:
+
+In this chapter you will learn how to change the tempo of your song, add comments to your code, and upload your own sounds to enhance the message of your song.
+
+[[settempo]]
+=== `setTempo()` funktsiyasi
+
+[role="curriculum-python"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `#`: we'll cover that in next section
+. loyihaga EarSketch funktsiyalarini (masalan, `fitMedia()`) qo‘shadigan `from earsketch import*` qatori
+. `setTempo(120)` funktsiyasi, biz uni quyida batafsil ko'rib chiqamiz
+--
+
+[role="curriculum-javascript"]
+--
+By now you've noticed that when you create a new script, there are preexisting elements added for your benefit:
+
+. Some comments starting with `//`: we'll cover that in next section
+. `setTempo(120)` funktsiyasi, biz uni quyida batafsil ko'rib chiqamiz
+--
+
+`setTempo()` funktsiyasi qo'shiq tezligini aniqlaydi. G'arb musiqasida *Temp* - bu daqiqada zarbalar miqdori (dzm) sanaladi. In EarSketch, the default tempo (i.e. the initial value of the tempo) is set to 120bpm, which corresponds to a fast walk or march speed. Tempni oʻzgartirish uchun `setTempo()` funktsiyasida qavslar orasidagi raqamni oʻzgartirish kifoya. The higher the tempo, the faster your music. Siz tempni _45dzm va 220dzm_ oraligʻida tanlashingiz mumkin.
+
+.PRACTICE
+****
+. Create a new script.
+. Place sounds on two different tracks.
+. Modify your tempo and listen to the song.
+. Play your song at three different tempos for a friend. Then ask them to rank from slowest to fastest tempo.
+****
+
+A genre is a category of artistic composition (e.g. music), characterized by similarities in form, style, or subject matter. Different genres have different tempo ranges. For instance:
+
+[cols="^3*"]
+|===
+|GENRE |BPM |EXAMPLE
+
+|Pop
+|110-130
+|"Thriller" - Michael Jackson
+
+"I Wanna Dance With Somebody" - Whitney Houston
+
+|Hip-Hop
+|70-100
+|"Rapper's Delight" - The Sugar Hill Gang
+
+"Fight the Power" - Public Enemy
+
+|Country
+|90-110
+|"I Walk the Line" - Johnny Cash
+
+"Jolene" - Dolly Parton
+
+|House / EDM
+|110-130
+|"One More Time" - Daft Punk
+
+"Good Vibrations" - Marky Mark
+
+|Dubstep / Trap
+|140-150
+|"Scary Monsters and Nice Sprites" - Skrillex
+
+"Turn Down for What" - Lil Jon
+|===
+
+.PRACTICE
+****
+. Select one artist you really like and find out what genre they belong to.
+. Ushbu janrni qidiring (https://soundcloud.com/[Soundcloud] da yoki shunga o'xshash) va shu janrdagi qo'shiqlardan bir nechta parchalarni tinglang.
+. Listen for similarities between the songs.
+. You can also research the genre on Wikipedia to get more information about it.
+****
+
+Sounds are automatically stretched to fit your song's tempo. This is why sounds previewed in the Sound Browser sometimes appear different from in your song. The effect can be extreme if the tempos are very different.
+
+To find the original tempo of sound, hover over the sound constant Sound Browser.
+
+[[comments]]
+=== Adding comments to your code
+
+*Comments* are lines of code ignored by the computer. People use comments to make notes within the code.
+
+EarSketch scripts begin with comments that you can use to enter a description of your song. These details make it easier for other programmers to understand what your code is about.
+
+[role="curriculum-python"]
+Pythonda sharhlar qatori funt belgisi - `#` bilan boshlanadi.
+
+[role="curriculum-javascript"]
+JavaScript-da sharhlar qatori ikki yotiq chiziq belgisi - `//` bilan boshlanadi.
+
+.PRACTICE
+****
+In your current script, write a comment with a description of your song on the first line.
+****
+
+You can also use comments to describe what different sections of your code do. Here is an example below. You can paste and run the code. Note how the comments describe the different sections:
+
+[role="curriculum-python"]
+[source,python]
+----
+include::code-examples/your-first-song-comments.py.txt[]
+----
+
+[role="curriculum-javascript"]
+[source,javascript]
+----
+include::code-examples/your-first-song-comments.js.txt[]
+----
+
+{nbsp} +
+
+[[uploadingsounds]]
+=== Uploading your own sounds
+
+You can upload your own sounds through the Sound Browser on the left side of your screen. Under the "Sounds" tab, click on the "Add sound" button.
+
+You must be logged in to upload sounds.
+
+Let's explore the first three options.
+
+. *Upload Sound* allows you to choose audio files already on your computer.
+. *Quick Record* lets you record directly from your computer's microphone.
+. *Freesound* allows you to import sounds from http://freesound.org[freesound.org^], an open-source audio database. In the search bar, you can look for a type of sound. Then select the toggle button in front of the file name to select.
+
+[role="curriculum-mp4"]
+[[video101rec]]
+video::./videoMedia/010-01-Recording&UploadingSounds-PY-JS.mp4[]
+
+.PRACTICE
+****
+Music, and art in general, is often a way to convey a message. It can be either through lyrics, and/or through the mood of the song. We would like for you to create a short song that expresses something. Bu siz baham ko'rmoqchi bo'lgan tuyg'u yoki hikoya bo'lishi mumkin.
+
+. Ifodalashni xohlayotgan narsangizni tasavvur qiling
+. Then either:
+.. Write some lyrics and record yourself singing or reading them or
+.. Record or download some sounds that are related to your message
+. Add these recordings to your song using `fitMedia()`
+. Then add additional sounds using `fitMedia()`
+. Present your song to your friend
+. You can discuss your songs and the things you were trying to express
+****
+
+An active computer program is called a *process*.
+
+When you start a process, the computer code is first stored in the computer's *memory* for quick access. The *CPU*, or Central Processing Unit, accesses each instruction from the memory and executes it. The CPU is often considered the "brain" of the computer.
+
+A computer's memory is sometimes called primary storage or RAM. It is designed to be fast and temporary, for active processes only.
+
+There is a difference between memory (or short-term storage) and long-term storage. Long-term storage, like a hard-drive or cloud, is referred to as secondary storage. *Ikkilamchi xotira*, hatto kompyuter o'chirilgandan keyin ham uzoq vaqt davomida katta hajmdagi ma'lumotlarni saqlaydi. The CPU does not interact directly with secondary storage. When the CPU carries a process out, data from secondary storage must first be put into memory so that the CPU can access it quickly.
+
+Sometimes the data in memory for the CPU to use comes from an input device instead of secondary storage. *Kirishlar* - bu mikrofondan audio kabi kompyuter tomonidan qabul qilingan signallar yoki ma'lumotlar. Xuddi shunday, *chiqishlar* undan yuboriladigan signallar yoki ma'lumotlar, masalan, karnay orqali audio chiqishi. Input/output, or I/O, is how the computer communicates with the outside world, including humans!
+
+Keling, misol sifatida EarSketch-ga ovoz yozishni ko'rib chiqaylik. First, we record data into the computer with the input device, the microphone. The CPU stores that audio data in its memory. If you press the play button to hear your recording, the CPU accesses the data and sends it to an output, the speakers or headphones. When you press the upload button, the CPU runs a process that converts the audio data into a standard sound file format (a WAV file, or .wav) and sends it to the EarSketch server. The server is an external system that provides services to all EarSketch users, including your own computer. EarSketch serveri tovush faylini xotiradan serverning ikkilamchi xotirasiga saqlaydi, shunda siz kelajakda unga kirishingiz mumkin.
+
+Check out the following supplementary video:
+
+[role="curriculum-mp4"]
+[[video11cpu]]
+video::./videoMedia/010-02-ProcessesandMemory-PY-JS.mp4[]
+
+////
+END OF OPTIONAL
+////
+
+[[copyright]]
+=== Use Copyright Wisely
+
+*Mualliflik huquqi* qonunning *intellektual mulk* yoki musiqa kabi ijodiy ishlarga egalik huquqini qamrab oluvchi qismidir. When using samples (small pieces of music) or remixing existing music, you need to give credit to the authors, and you can do so in the comments of your code. Before using sounds from other musicians and sharing your own music, learn more about copyright!
+
+When you create something original and substantial enough, you get a copyright automatically! In the United States, this means you can: make copies, make modifications, and share what you create.
+
+There are two copyrights involved with a song: rights to the song (by the writer or composer) and rights to the sound recording (often by the record label). Royalties from public performances go to the songwriter and most royalties from record sales go to the record label.
+
+*Mualliflik huquqining buzilishi* musiqani noqonuniy yuklab olish kabi mualliflik huquqining buzilishidir. Qo'shma Shtatlarda *adolatli foydalanish* mualliflik huquqi bilan himoyalangan kontentdan ma'lum sharoitlarda, masalan, ta'lim yoki tanqidiy maqsadlarda foydalanishga ruxsat beradi, asarning faqat kichik qismini qayta ishlatishga imkon beradi. Fair use disputes are determined by a judge on a case-by-case basis.
+
+Besides fair use, there are other ways to use and share music openly. EarSketch works because artists have shared their work with you through *samples* (a small part of sound recording) in the Sound Browser.
+
+Copyright is not all about getting people in trouble. If you upload a song to the internet, you might not mind if someone downloads it without asking; you want people to share your music! Copyright should help us make and share more art, not less. When you are creating songs in EarSketch, we want you to think less about _stealing_ and more about _sharing_. EarSketch works because artists have shared their work with you, resulting in the library of samples you use to make new music. Sharing your music or letting other students remix your code is a way of paying this forward and helping to put new art into the world.
+
+When using sounds in your EarSketch scripts, you'll need to be sure that you have permission from the copyright holder to use the sounds, or that you are using them in accordance with fair use.
+
+For full details, refer to our https://earsketch.gatech.edu/landing/#/license[LICENSE^].
+
+[[chapter2summary]]
+=== Chapter 2 Summary
+
+[role="curriculum-python"]
+* *Temp* - bu musiqa asarining ijro etilish tezligi, u daqiqada zarba miqdorida (dzm) belgilanadi. Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `from earsketch import *` loyihangizga EarSketch IDI-ni qo‘shadi.
+* `setTempo();` qo'shiqning tempini belgilash imkonini beradi. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Qayta ishlash - dastur ko'rsatmalarini bajarish uchun mas'ul bo'lgan kompyuterning *Markaziy Protsessori* tomonidan amalga oshiriladi.
+* *Xotira* (RAM yoki asosiy xotira deb nomlanadi) Markaziy Protsessor foydalanishi uchun maʼlumotlar va ishlov berish koʻrsatmalarini vaqtincha saqlaydi.
+* *Ikkilamchi xotira* ma'lumotlarni uzoq muddatli, ko'pincha katta hajmlarda saqlashni nazarda tutadi. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. Bastakorlar uchun bu muhim, chunki u boshqa shaxsning ishidan qanday foydalanish va almashish mumkinligini belgilaydi.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* Musiqa asarini *litsenziyalash* boshqalarga undan foydalanishga ruxsat beradi.
+
+[role="curriculum-javascript"]
+* *Temp* - bu musiqa asarining ijro etilish tezligi, u daqiqada zarba miqdorida (dzm) belgilanadi. Tempo is tied to genre.
+* The sounds in the EarSketch Sound Browser are organized into folders of related sounds. To see the exact tempo of a clip, hover over the name in the Sound Browser.
+* Comments are lines of code that are ignored by the computer. They are useful for making notes within a script.
+* `setTempo();` qo'shiqning tempini belgilash imkonini beradi. It must be included in every EarSketch script.
+* You can upload your own sounds to EarSketch through the Sound Browser. Just click "Add Sound".
+* A *process* is a program running on a computer. Qayta ishlash - dastur ko'rsatmalarini bajarish uchun mas'ul bo'lgan kompyuterning *Markaziy Protsessori* tomonidan amalga oshiriladi.
+* *Xotira* (RAM yoki asosiy xotira deb nomlanadi) Markaziy Protsessor foydalanishi uchun maʼlumotlar va ishlov berish koʻrsatmalarini vaqtincha saqlaydi.
+* *Ikkilamchi xotira* ma'lumotlarni uzoq muddatli, ko'pincha katta hajmlarda saqlashni nazarda tutadi. Data from secondary storage must be put into memory before the CPU can access it.
+* *Copyright* is a portion of law that covers ownership of creative works, like music. Bastakorlar uchun bu muhim, chunki u boshqa shaxsning ishidan qanday foydalanish va almashish mumkinligini belgilaydi.
+* If you create a musical work that is tangible and new, you have an automatic copyright. In other words, you have rights over the work you created.
+* Musiqa asarini *litsenziyalash* boshqalarga undan foydalanishga ruxsat beradi.
+
+[[chapter-questions]]
+=== Questions
+
+[question]
+--
+`setTempo()` EarSketch-da qanday imkoniyat beradi?
+
+[answers]
+* Specify the tempo of a song
+* Add a sound to a track
+* Create a drum beat
+* Change the qualities of sound within a project
+--
+
+[question]
+--
+What is the unit for tempo?
+
+[answers]
+* Beats Per Minute (BPM)
+* Measures
+* Decibels(dB)
+* Seconds
+--
+
+[question]
+--
+What can you use comments for?
+
+[answers]
+* All of the above
+* Organizing your code
+* Writing a description of your script at the beginning of your script
+* Making your code easy to read for other programmers
+--
+
+[question]
+--
+Which of the following statements is true?
+
+[answers]
+* A hard drive is an example of secondary storage
+* Audio data is saved to a computer’s CPU
+* The CPU holds instructional data for programs
+* Secondary storage stores data for short periods of time
+--
+
+[question]
+--
+How do you get a copyright?
+
+[answers]
+* By creating and publishing any new work
+* By buying a patent
+* By joining a secret organization
+* By choosing a license for your work
+--
+
+[question]
+--
+What is a music license?
+
+[answers]
+* A license gives others permission to use a musical work
+* A composing process
+* A musical genre
+* A description of your song
+--
\ No newline at end of file