diff --git a/.github/workflows/Emscripten.yml b/.github/workflows/Emscripten.yml
index be4746ad8..30a3462b4 100644
--- a/.github/workflows/Emscripten.yml
+++ b/.github/workflows/Emscripten.yml
@@ -21,6 +21,12 @@ jobs:
steps:
- uses: actions/checkout@v3
+ - name: Checkout Examples
+ uses: actions/checkout@v3
+ with:
+ repository: 32blit/32blit-examples
+ path: 32blit-examples
+
- name: Install deps
run: |
sudo apt update && sudo apt install doxygen graphviz python3-setuptools
@@ -50,7 +56,7 @@ jobs:
- name: Configure CMake
shell: bash
working-directory: ${{runner.workspace}}/build
- run: emcmake cmake $GITHUB_WORKSPACE -D32BLIT_DIR=$GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_CXX_FLAGS_RELEASE="-O2 -DNDEBUG"
+ run: emcmake cmake $GITHUB_WORKSPACE/32blit-examples -D32BLIT_DIR=$GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_CXX_FLAGS_RELEASE="-O2 -DNDEBUG"
# Problem matching
- uses: ammaraskar/gcc-problem-matcher@master
diff --git a/.github/workflows/Visual Studio.yml b/.github/workflows/Visual Studio.yml
deleted file mode 100644
index 48204bc75..000000000
--- a/.github/workflows/Visual Studio.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Visual Studio (.sln)
-on:
- push:
- branches:
- - '**' # only run on branches
- pull_request:
-
-jobs:
- build:
- runs-on: windows-latest
-
- steps:
- - uses: actions/checkout@v3
-
- - name: Install deps
- shell: bash
- run: |
- ci/install_sdl_vs.sh
- python -m pip install 32blit
-
- - name: Add msbuild to PATH
- uses: microsoft/setup-msbuild@v1.1.3
-
- - name: Build
- run: msbuild.exe vs/32blit.sln
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
index 1ebfb12d4..e345ff9fd 100644
--- a/.github/workflows/cmake.yml
+++ b/.github/workflows/cmake.yml
@@ -21,7 +21,7 @@ jobs:
- os: ubuntu-20.04
name: Linux
cache-key: linux
- release-suffix: LIN64
+ artifact-suffix: LIN64
cmake-args: '"-DCMAKE_CXX_CLANG_TIDY=clang-tidy;-header-filter=(32blit|32blit-sdl)/;-checks=performance-*,portability-*,modernize-*,-modernize-use-trailing-return-type,-modernize-avoid-c-arrays,-modernize-use-nodiscard" -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache'
apt-packages: ccache clang-tidy libsdl2-dev libsdl2-image-dev libsdl2-net-dev python3-setuptools
@@ -36,8 +36,8 @@ jobs:
pico-sdk: true
name: PicoSystem
cache-key: picosystem
- release-suffix: PicoSystem
- cmake-args: -D32BLIT_DIR=$GITHUB_WORKSPACE -DPICO_SDK_PATH=$GITHUB_WORKSPACE/pico-sdk -DPICO_BOARD=pimoroni_picosystem -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
+ artifact-suffix: PicoSystem
+ cmake-args: -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/pico.toolchain -DPICO_SDK_PATH=$GITHUB_WORKSPACE/pico-sdk -DPICO_BOARD=pimoroni_picosystem -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
apt-packages: ccache gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib python3-setuptools
- os: ubuntu-20.04
@@ -56,7 +56,7 @@ jobs:
- os: windows-latest
name: Visual Studio
cache-key: windows
- release-suffix: WIN64
+ artifact-suffix: WIN64
cmake-args: -DSDL2_DIR=$GITHUB_WORKSPACE/vs/sdl
runs-on: ${{matrix.os}}
@@ -68,6 +68,12 @@ jobs:
- name: Checkout 32Blit SDK
uses: actions/checkout@v3
+ - name: Checkout Examples
+ uses: actions/checkout@v3
+ with:
+ repository: 32blit/32blit-examples
+ path: 32blit-examples
+
# pico sdk/extras for some builds
- name: Checkout Pico SDK
if: matrix.pico-sdk
@@ -121,7 +127,9 @@ jobs:
run: ci/install_sdl_mingw.sh
- name: Create Build Environment
- run: cmake -E make_directory ${{runner.workspace}}/build
+ run: |
+ cmake -E make_directory ${{runner.workspace}}/build
+ cmake -E make_directory ${{runner.workspace}}/build-examples
- name: Set Tag Variable
if: github.event_name == 'release'
@@ -149,19 +157,25 @@ jobs:
cmake --build . --config $BUILD_TYPE -j 2
ccache --show-stats || true
- #- name: Test
- # working-directory: ${{runner.workspace}}/build
- # shell: bash
- # Execute tests defined by the CMake configuration.
- # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
- # run: ctest -C $BUILD_TYPE
+ - name: Configure Examples
+ shell: bash
+ working-directory: ${{runner.workspace}}/build-examples
+ # installs into same dir as SDK
+ run: cmake $GITHUB_WORKSPACE/32blit-examples -D32BLIT_DIR=$GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$RUNNER_WORKSPACE/build/install -DCPACK_PACKAGE_FILE_NAME=${{env.RELEASE_FILE}} ${{matrix.cmake-args}}
+
+ - name: Build Examples
+ working-directory: ${{runner.workspace}}/build-examples
+ shell: bash
+ run: |
+ cmake --build . --config $BUILD_TYPE -j 2
+ ccache --show-stats || true
- name: Prepare Artifact
if: github.event_name != 'release'
- working-directory: ${{runner.workspace}}/build
shell: bash
run: |
- cmake --build . --config $BUILD_TYPE --target install
+ cmake --build $RUNNER_WORKSPACE/build --config $BUILD_TYPE --target install
+ cmake --build $RUNNER_WORKSPACE/build-examples --config $BUILD_TYPE --target install
- name: Upload Artifact
if: github.event_name != 'release'
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7c04782ca..37fbdcd1e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,7 +12,7 @@ else()
endif()
find_package (32BLIT CONFIG REQUIRED PATHS .)
-add_subdirectory(examples)
+add_subdirectory(utilities)
add_subdirectory(launcher-shared)
diff --git a/README.md b/README.md
index 06263657d..a3710906a 100644
--- a/README.md
+++ b/README.md
@@ -42,7 +42,7 @@ The `32blit-stm32` directory contains the STM32 HAL for 32blit, compatible with
## Examples / Projects
-The `examples` directory contains example projects, these can be built into both SDL or STM32 binaries and cover a range of techniques from simple concepts to complete games.
+Examples can be found at https://github.com/32blit/32blit-examples/, these can be built into both SDL or STM32 binaries and cover a range of techniques from simple concepts to complete games.
Refer to the OS/platform specific documentation files in the `docs/` folder for instructions on how to compile and run these examples.
diff --git a/assets/README.md b/assets/README.md
deleted file mode 100644
index 5bc6bac18..000000000
--- a/assets/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# 32Blit Assets
-
-## Artists
-
-### Sam (@s4m_ur4i)
-
-Our Space Shooter, Platformer, Dingbads, Pirates and Top Down Shooter spritesheets have been lovingly crafted by Sam.
-
-You can find him and his work at:
-
-* https://s4m-ur4i.itch.io/
-* https://samvieten.com/
-* https://twitter.com/s4m_ur4
\ No newline at end of file
diff --git a/assets/gadgetoid_raycaster.png b/assets/gadgetoid_raycaster.png
deleted file mode 100644
index 9cdc279d9..000000000
Binary files a/assets/gadgetoid_raycaster.png and /dev/null differ
diff --git a/assets/platformer.tmx b/assets/platformer.tmx
deleted file mode 100644
index ac2dcbce0..000000000
--- a/assets/platformer.tmx
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
diff --git a/assets/platformer.tsx b/assets/platformer.tsx
deleted file mode 100644
index 8ea70bcea..000000000
--- a/assets/platformer.tsx
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/assets/s4m_ur4i-dingbads.png b/assets/s4m_ur4i-dingbads.png
deleted file mode 100644
index 075698bfc..000000000
Binary files a/assets/s4m_ur4i-dingbads.png and /dev/null differ
diff --git a/assets/s4m_ur4i-pirate-characters.png b/assets/s4m_ur4i-pirate-characters.png
deleted file mode 100644
index de7bbf630..000000000
Binary files a/assets/s4m_ur4i-pirate-characters.png and /dev/null differ
diff --git a/assets/s4m_ur4i-pirate-tilemap.png b/assets/s4m_ur4i-pirate-tilemap.png
deleted file mode 100644
index 0777d355e..000000000
Binary files a/assets/s4m_ur4i-pirate-tilemap.png and /dev/null differ
diff --git a/assets/s4m_ur4i-platformer.png b/assets/s4m_ur4i-platformer.png
deleted file mode 100644
index 0589c6761..000000000
Binary files a/assets/s4m_ur4i-platformer.png and /dev/null differ
diff --git a/assets/s4m_ur4i-space-shooter-backdrop-palette.png b/assets/s4m_ur4i-space-shooter-backdrop-palette.png
deleted file mode 100644
index a22f09ddd..000000000
Binary files a/assets/s4m_ur4i-space-shooter-backdrop-palette.png and /dev/null differ
diff --git a/assets/s4m_ur4i-space-shooter-backdrop.png b/assets/s4m_ur4i-space-shooter-backdrop.png
deleted file mode 100644
index 692274a3a..000000000
Binary files a/assets/s4m_ur4i-space-shooter-backdrop.png and /dev/null differ
diff --git a/assets/s4m_ur4i-space-shooter-ships.png b/assets/s4m_ur4i-space-shooter-ships.png
deleted file mode 100644
index befd14b01..000000000
Binary files a/assets/s4m_ur4i-space-shooter-ships.png and /dev/null differ
diff --git a/assets/s4m_ur4i-top-down-shooter.png b/assets/s4m_ur4i-top-down-shooter.png
deleted file mode 100644
index c363d5a7a..000000000
Binary files a/assets/s4m_ur4i-top-down-shooter.png and /dev/null differ
diff --git a/assets/tilemap-test.tmx b/assets/tilemap-test.tmx
deleted file mode 100644
index bcb048a0f..000000000
--- a/assets/tilemap-test.tmx
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
diff --git a/assets/wasp_raycaster.png b/assets/wasp_raycaster.png
deleted file mode 100644
index 820268b4e..000000000
Binary files a/assets/wasp_raycaster.png and /dev/null differ
diff --git a/docs/32blit.md b/docs/32blit.md
index 1771caaab..8cc1029e2 100644
--- a/docs/32blit.md
+++ b/docs/32blit.md
@@ -36,13 +36,21 @@ You should also make sure you have a cross-compile environment set up on your co
To build an example for 32blit using `arm-none-eabi-gcc` you must prepare the Makefile with CMake using the provided toolchain file.
-From the root of the repository:
+Clone the examples repository:
+```
+git clone https://github.com/32blit/32blit-examples
+
+cd 32blit-examples
+```
+
+From the root of the examples repository:
```
mkdir build.stm32
cd build.stm32
-cmake .. -DCMAKE_TOOLCHAIN_FILE=../32blit.toolchain
+cmake .. -DCMAKE_TOOLCHAIN_FILE=../../32blit-sdk/32blit.toolchain
```
+(Assuming 32blit-sdk is cloned next to 32blit-examples)
And then run `make examplename` to build an example.
@@ -122,7 +130,7 @@ You can either press Menu and select "Exit Game" or long-press Menu to exit.
### Flasher Can't Find 32Blit Port
-If `make example.flash` fails with `Unable to find 32Blit`, re-run `cmake` with `-DFLASH_PORT=[PORT PATH]`.
+If `make example.flash` fails with `Unable to find 32Blit`, re-run `cmake` with `-DFLASH_PORT=[PORT PATH]`.
Port-detection does not work if your device is in DFU mode. Either reset it to get it out, or it it's stuck in DFU mode (or just boots into a black screen), you may need to reflash the firmware.
diff --git a/docs/Linux.md b/docs/Linux.md
index f869a054b..e60f3932e 100644
--- a/docs/Linux.md
+++ b/docs/Linux.md
@@ -45,13 +45,22 @@ If you want to run code on 32Blit, you should now refer to [Building & Running O
## Building & Running Locally
+
+Clone the examples repository:
+```
+git clone https://github.com/32blit/32blit-examples
+
+cd 32blit-examples
+```
+
Set up the 32Blit Makefile from the root of the repository with the following commands:
```shell
mkdir build
cd build
-cmake ..
+cmake -D32BLIT_DIR=../../32blit-sdk ..
```
+(Assuming 32blit-sdk is cloned next to 32blit-examples)
Now to make any example, type:
diff --git a/docs/Windows-VisualStudio.md b/docs/Windows-VisualStudio.md
index 5634cce71..fd61ce5f7 100644
--- a/docs/Windows-VisualStudio.md
+++ b/docs/Windows-VisualStudio.md
@@ -5,9 +5,8 @@ You can use Visual Studio 2019 to examine the samples (compile them and run them
See [Building & Running On 32Blit](32blit.md) if you want to compile examples/projects to run on 32Blit.
- [Requirements](#requirements)
-- [Option 1: Use the solution file](#option-1-use-the-solution-file)
+- [Building with Visual Studio's built-in CMake support](#building-with-visual-studios-built-in-cmake-support)
- [Get started with your own game](#get-started-with-your-own-game)
-- [Option 2: Use Visual Studio's built-in CMake support](#option-2-use-visual-studios-built-in-cmake-support)
- [Building your own game](#building-your-own-game)
- [Building for 32Blit](#building-for-32blit)
- [Troubleshooting](#troubleshooting)
@@ -22,20 +21,7 @@ You will also need to download SDL2 development libraries from the [SDL releases
Place these in the `vs\sdl\` folder. You will need to merge the include/lib directories. If you are using CMake/Open Folder, these are downloaded automatically.
-
-There are two methods of building with Visual Studio:
-
-## Option 1: Use the solution file
-
-This should be the most familiar option for existing Visual Studio users.
-
-The solutions and projects are made to use toolset version c142.
-
-The solution file is located at `vs\32blit.sln`. It contains two static linked libraries, _32blit_ and _32blit-sdl_ and all the examples that will compile to .EXE.
-
-## Option 2: Use Visual Studio's built-in CMake support
-
-This has the advantage of being closer to the build for the device.
+## Building with Visual Studio's built-in CMake support
1. Open Visual Studio
diff --git a/docs/Windows-WSL.md b/docs/Windows-WSL.md
index 7860f3f42..d1b44ad46 100644
--- a/docs/Windows-WSL.md
+++ b/docs/Windows-WSL.md
@@ -84,7 +84,7 @@ sudo mkdir -p /opt/local/
Grab and install the SDL2 mingw development package:
```shell
-wget https://github.com/libsdl-org/SDL/releases/download/release-2.24.0/SDL2-devel-2.24.0-mingw.tar.gz
+wget https://github.com/libsdl-org/SDL/releases/download/release-2.24.0/SDL2-devel-2.24.0-mingw.tar.gz
tar xzf SDL2-devel-2.24.0-mingw.tar.gz
sudo cp -r SDL2-2.24.0/x86_64-w64-mingw32 /opt/local/
```
@@ -111,13 +111,21 @@ sudo cp -r SDL2_net-2.2.0/x86_64-w64-mingw32 /opt/local/
### Building
+Clone the examples repository:
+```
+git clone https://github.com/32blit/32blit-examples
+
+cd 32blit-examples
+```
+
Finally, set up the 32Blit Makefile from the root of the repository with the following commands:
```shell
mkdir build.mingw
cd build.mingw
-cmake .. -DCMAKE_TOOLCHAIN_FILE=../mingw.toolchain
+cmake .. -DCMAKE_TOOLCHAIN_FILE=../../32blit-sdk/mingw.toolchain
```
+(Assuming 32blit-sdk is cloned next to 32blit-examples)
#### Single Example
diff --git a/docs/Windows.md b/docs/Windows.md
index 609ce7245..ff35d764a 100644
--- a/docs/Windows.md
+++ b/docs/Windows.md
@@ -4,8 +4,8 @@ These instructions cover building 32blit on Windows (without WSL).
- [Prerequisites](#prerequisites)
- [Using Visual Studio](#using-visual-studio)
-- [Building & Running on 32Blit](#building--running-on-32blit)
-- [Building & Running Locally](#building--running-locally)
+- [Building \& Running on 32Blit](#building--running-on-32blit)
+- [Building \& Running Locally](#building--running-locally)
- [Build Everything](#build-everything)
## Prerequisites
@@ -46,13 +46,21 @@ nmake
## Building & Running Locally
+Clone the examples repository:
+```
+git clone https://github.com/32blit/32blit-examples
+
+cd 32blit-examples
+```
+
Set up the 32Blit Makefile from the root of the repository with the following commands:
```shell
mkdir build
cd build
-cmake -G"NMake Makefiles" ..
+cmake -G"NMake Makefiles" -D32BLIT_DIR=../../32blit-sdk ..
```
+(Assuming 32blit-sdk is cloned next to 32blit-examples)
Now to make any example, type:
diff --git a/docs/macOS.md b/docs/macOS.md
index 59c92e59f..9c55ce544 100644
--- a/docs/macOS.md
+++ b/docs/macOS.md
@@ -6,9 +6,10 @@ These instructions cover building 32blit on macOS.
- [Python3](#python3)
- [Installing python3](#installing-python3)
- [Installing pip3 dependecies](#installing-pip3-dependecies)
+ - [Verifying install](#verifying-install)
- [Installing `gcc-arm-none-eabi`](#installing-gcc-arm-none-eabi)
-- [Building & Running on 32Blit](#building--running-on-32blit)
-- [Building & Running Locally](#building--running-locally)
+- [Building \& Running on 32Blit](#building--running-on-32blit)
+- [Building \& Running Locally](#building--running-locally)
- [Build Everything](#build-everything)
- [Troubleshooting](#troubleshooting)
@@ -87,13 +88,21 @@ You'll need to install `SDL2`, `SDL2 Image` and `SDL2 Net`
brew install sdl2 sdl2_image sdl2_net
```
+Clone the examples repository:
+```
+git clone https://github.com/32blit/32blit-examples
+
+cd 32blit-examples
+```
+
Then, set up the 32Blit Makefile from the root of the repository with the following commands:
```shell
mkdir build
cd build
-cmake ..
+cmake -D32BLIT_DIR=../../32blit-sdk ..
```
+(Assuming 32blit-sdk is cloned next to 32blit-examples)
Now to make any example, type:
diff --git a/docs/pico.md b/docs/pico.md
index bb8baba42..62d29013c 100644
--- a/docs/pico.md
+++ b/docs/pico.md
@@ -5,7 +5,7 @@ The Pico port brings the 32blit SDK to PicoSystem and other RP2040-based devices
Since RP2040 is slower and less capable than 32blit's STM32H750 there are some limitations, but most of the 32blit SDK conceniences work well.
- [Why use 32blit SDK on PicoSystem?](#why-use-32blit-sdk-on-picosystem)
-- [Building The SDK & Examples](#building-the-sdk--examples)
+- [Building The SDK \& Examples](#building-the-sdk--examples)
- [Fetch Pico SDK Automatically (Quick-Start)](#fetch-pico-sdk-automatically-quick-start)
- [Existing Pico SDK (Advanced)](#existing-pico-sdk-advanced)
- [Starting Your Own 32blit SDK Project](#starting-your-own-32blit-sdk-project)
@@ -13,7 +13,7 @@ Since RP2040 is slower and less capable than 32blit's STM32H750 there are some l
- [Building](#building)
- [Copying to your PicoSystem](#copying-to-your-picosystem)
- [Extra configuration](#extra-configuration)
-- [API Limitations & Board Details](#api-limitations--board-details)
+- [API Limitations \& Board Details](#api-limitations--board-details)
- [Unsupported Features](#unsupported-features)
- [Limitations](#limitations)
- [Board-specific details](#board-specific-details)
@@ -73,10 +73,12 @@ You can use Pico SDK's fetch-from-git feature and build like so:
```
git clone https://github.com/32blit/32blit-sdk
-cd 32blit-sdk
+git clone https://github.com/32blit/32blit-examples
+
+cd 32blit-examples
mkdir build.pico
cd build.pico
-cmake .. -D32BLIT_DIR=`pwd`/.. -DPICO_SDK_FETCH_FROM_GIT=true -DPICO_EXTRAS_FETCH_FROM_GIT=true -DPICO_BOARD=pimoroni_picosystem
+cmake .. -D32BLIT_DIR=`pwd`/../../32blit-sdk -DPICO_SDK_FETCH_FROM_GIT=true -DPICO_EXTRAS_FETCH_FROM_GIT=true -DPICO_BOARD=pimoroni_picosystem
```
And then run `make` as usual.
@@ -93,10 +95,12 @@ To build the examples for a PicoSystem:
```
git clone https://github.com/32blit/32blit-sdk
-cd 32blit-sdk
+git clone https://github.com/32blit/32blit-examples
+
+cd 32blit-examples
mkdir build.pico
cd build.pico
-cmake .. -D32BLIT_DIR=`pwd`/.. -DPICO_SDK_PATH=/path/to/pico-sdk -DPICO_BOARD=pimoroni_picosystem
+cmake .. -D32BLIT_DIR=`pwd`/../../32blit-sdk -DPICO_SDK_PATH=/path/to/pico-sdk -DPICO_BOARD=pimoroni_picosystem
```
And then run `make` as usual.
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
deleted file mode 100644
index 9b542c769..000000000
--- a/examples/CMakeLists.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-cmake_minimum_required(VERSION 3.9)
-project (examples)
-find_package (32BLIT CONFIG REQUIRED PATHS ..)
-add_subdirectory(audio-test)
-add_subdirectory(audio-wave)
-add_subdirectory(doom-fire)
-add_subdirectory(fizzlefade)
-add_subdirectory(flight)
-add_subdirectory(geometry)
-add_subdirectory(hardware-test)
-add_subdirectory(picosystem-hardware-test)
-add_subdirectory(jpeg)
-add_subdirectory(logo)
-add_subdirectory(matrix-test)
-add_subdirectory(metadata-test)
-add_subdirectory(mp3)
-add_subdirectory(multiplayer)
-add_subdirectory(palette-cycle)
-add_subdirectory(palette-swap)
-add_subdirectory(particle)
-add_subdirectory(piano)
-add_subdirectory(platformer)
-add_subdirectory(profiler-test)
-add_subdirectory(raycaster)
-add_subdirectory(rotozoom)
-add_subdirectory(saves)
-add_subdirectory(scrolly-tile)
-add_subdirectory(serial-debug)
-add_subdirectory(shmup)
-add_subdirectory(sprite-test)
-add_subdirectory(text)
-add_subdirectory(tilemap-test)
-add_subdirectory(tilt)
-add_subdirectory(timer-test)
-add_subdirectory(tunnel)
-add_subdirectory(tween-demo)
-add_subdirectory(tween-test)
-add_subdirectory(voxel)
-add_subdirectory(waveform-demo)
diff --git a/examples/audio-test/CMakeLists.txt b/examples/audio-test/CMakeLists.txt
deleted file mode 100644
index cea302834..000000000
--- a/examples/audio-test/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-cmake_minimum_required(VERSION 3.9)
-project (audio-test)
-find_package (32BLIT CONFIG REQUIRED PATHS ../..)
-blit_executable (audio-test audio-test.cpp)
-blit_metadata (audio-test metadata.yml)
\ No newline at end of file
diff --git a/examples/audio-test/audio-test.cpp b/examples/audio-test/audio-test.cpp
deleted file mode 100644
index bd6dd9c7f..000000000
--- a/examples/audio-test/audio-test.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-#include
-#include
-#include
-#include
-
-#include "audio-test.hpp"
-
-using namespace blit;
-
-#define HAT 20000
-#define BASS 500
-#define SNARE 6000
-#define SUB 50
-
-// Gadgetoid's amazing masterpiece!
-const int16_t notes[5][384] = {
- { // melody notes
- 147, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 247, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 330, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 349, 0, 330, 0, 294, 0, 220, 0, 262, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 247, 0, 220, 0, 196, 0, 147, 0, 175, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0,
- 147, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 247, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 330, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 349, 0, 330, 0, 294, 0, 220, 0, 262, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 247, 0, 220, 0, 196, 0, 147, 0, 175, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0,
- 147, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 247, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 330, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 349, 0, 330, 0, 294, 0, 220, 0, 262, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 247, 0, 262, 0, 294, 0, 392, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- },
- { // rhythm notes
- 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 392, 0, 523, 0, 659, 0, 523, 0, 392, 0, 523, 0, 659, 0, 523, 0, 698, 0, 587, 0, 440, 0, 587, 0, 698, 0, 587, 0, 440, 0, 587, 0, 523, 0, 440, 0, 330, 0, 440, 0, 523, 0, 440, 0, 330, 0, 440, 0, 349, 0, 294, 0, 220, 0, 294, 0, 349, 0, 294, 0, 220, 0, 294, 0, 262, 0, 247, 0, 220, 0, 175, 0, 165, 0, 147, 0, 131, 0, 98, 0,
- 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 392, 0, 523, 0, 659, 0, 523, 0, 392, 0, 523, 0, 659, 0, 523, 0, 698, 0, 587, 0, 440, 0, 587, 0, 698, 0, 587, 0, 440, 0, 587, 0, 523, 0, 440, 0, 330, 0, 440, 0, 523, 0, 440, 0, 330, 0, 440, 0, 349, 0, 294, 0, 220, 0, 294, 0, 349, 0, 294, 0, 220, 0, 294, 0, 262, 0, 247, 0, 220, 0, 175, 0, 165, 0, 147, 0, 131, 0, 98, 0,
- 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 392, 0, 523, 0, 659, 0, 523, 0, 392, 0, 523, 0, 659, 0, 523, 0, 698, 0, 587, 0, 440, 0, 587, 0, 698, 0, 587, 0, 440, 0, 587, 0, 523, 0, 440, 0, 330, 0, 440, 0, 523, 0, 440, 0, 330, 0, 440, 0, 349, 0, 294, 0, 220, 0, 294, 0, 349, 0, 294, 0, 220, 0, 294, 0, 262, 0, 247, 0, 220, 0, 175, 0, 165, 0, 147, 0, 131, 0, 98, 0,
- },
- { // drum beats
- BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0,
- BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0,
- BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0
- },
- { // hi-hat
- HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1,
- HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1,
- HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1
- },
- { // bass notes under bass drum
- SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0,
- SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0,
- SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0
- },
-};
-
-/* setup */
-void init() {
- // configure voices
-
- // melody track
- channels[0].waveforms = Waveform::TRIANGLE | Waveform::SQUARE;
- channels[0].attack_ms = 16;
- channels[0].decay_ms = 168;
- channels[0].sustain = 0xafff;
- channels[0].release_ms = 168;
- channels[0].volume = 10000;
-
- // rhythm track
- channels[1].waveforms = Waveform::SINE | Waveform::SQUARE;
- channels[1].attack_ms = 38;
- channels[1].decay_ms = 300;
- channels[1].sustain = 0;
- channels[1].release_ms = 0;
- channels[1].volume = 12000;
-
- // drum track
- channels[2].waveforms = Waveform::NOISE;
- channels[2].attack_ms = 5;
- channels[2].decay_ms = 10;
- channels[2].sustain = 16000;
- channels[2].release_ms = 100;
- channels[2].volume = 18000;
-
- // hi-hat track
- channels[3].waveforms = Waveform::NOISE;
- channels[3].attack_ms = 5;
- channels[3].decay_ms = 5;
- channels[3].sustain = 8000;
- channels[3].release_ms = 40;
- channels[3].volume = 8000;
-
- // bass track
- channels[4].waveforms = Waveform::SQUARE;
- channels[4].attack_ms = 10;
- channels[4].decay_ms = 100;
- channels[4].sustain = 0;
- channels[4].release_ms = 500;
- channels[4].volume = 12000;
-
- // set global volume
- // volume = 2048;
-
- screen.pen = Pen(0, 0, 0, 255);
- screen.clear();
-}
-
-uint16_t beat = 0;
-
-void render(uint32_t time_ms) {
- screen.pen = Pen(20, 30, 40, 100);
- screen.clear();
-
- // yeah, this is ugly... let's find a way to get a real
- // waveform out of the audio functionality
- for(int i = 0; i < 160; i++) {
- uint8_t no = (i + beat) % 384;
- uint8_t n1 = notes[0][no] >> 4;
- uint8_t n2 = notes[1][no] >> 4;
- uint8_t n3 = notes[2][no] >> 4;
-
- screen.pen = Pen(255, 0, 0, 100);
- screen.line(Point(i, 120), Point(i, 120 - n1));
- screen.pen = Pen(0, 255, 0, 100);
- screen.line(Point(i, 120), Point(i, 120 - n2));
- screen.pen = Pen(0, 0, 255, 100);
- screen.line(Point(i, 120), Point(i, 120 - n3));
- }
-
- screen.watermark();
-}
-
-void update(uint32_t time_ms) {
- static uint16_t tick = 0;
- static uint16_t prev_beat = 1;
- beat = (tick / 8) % 384; // 125ms per beat
- tick++;
-
- if (beat == prev_beat) return;
- prev_beat = beat;
-
- for(uint8_t i = 0; i < 5; i++) {
- if(notes[i][beat] > 0) {
- channels[i].frequency = notes[i][beat];
- channels[i].trigger_attack();
- } else if (notes[i][beat] == -1) {
- channels[i].trigger_release();
- }
- }
-}
-
diff --git a/examples/audio-test/audio-test.hpp b/examples/audio-test/audio-test.hpp
deleted file mode 100644
index 21d2d7a39..000000000
--- a/examples/audio-test/audio-test.hpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#pragma once
-
-#include
-
-#include "32blit.hpp"
-
-void init();
-void update(uint32_t time);
-void render(uint32_t time);
-
-
diff --git a/examples/audio-test/metadata.yml b/examples/audio-test/metadata.yml
deleted file mode 100644
index d047d5c67..000000000
--- a/examples/audio-test/metadata.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-title: Audio Test
-description: A basic audio test.
-author: pimoroni
-splash:
- file: ../no-image.png
-icon:
- file: ../no-icon.png
-version: v1.0.0
-url: https://github.com/32blit/32blit-sdk
-category: demo
\ No newline at end of file
diff --git a/examples/audio-wave/CMakeLists.txt b/examples/audio-wave/CMakeLists.txt
deleted file mode 100644
index 5d2ccf06b..000000000
--- a/examples/audio-wave/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-cmake_minimum_required(VERSION 3.9)
-project (audio-wave)
-find_package (32BLIT CONFIG REQUIRED PATHS ../..)
-blit_executable (audio-wave audio-wave.cpp)
-blit_assets_yaml (audio-wave assets.yml)
-blit_metadata (audio-wave metadata.yml)
diff --git a/examples/audio-wave/assets.yml b/examples/audio-wave/assets.yml
deleted file mode 100644
index 5cd1b6fc8..000000000
--- a/examples/audio-wave/assets.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-assets.hpp:
- assets/glass.bin: glass_wav
diff --git a/examples/audio-wave/assets/glass.bin b/examples/audio-wave/assets/glass.bin
deleted file mode 100644
index aa1273ef2..000000000
--- a/examples/audio-wave/assets/glass.bin
+++ /dev/null
@@ -1 +0,0 @@
-€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€}}~|qb\bt¯Óéæα™{Q$
7a‘ÂßЗW56G^ÒÛɪ„V)8Y…ºÜɈH2@Tcs…šµÚã¸qCAWis†§ÉÚΦtTQ[WD=V¤°¨“w`VRG5.Af‹žœˆv}¥ÓÙ«p[ºÝÒ§y„];?o¢®’qhv…‚jRNa{›°Ã»“j`ušˆobr—°°©±Ä›a3'Fƒ·ÁŸoPB?P{«½“~d<,E]¡¨Žrr‡——‡‰¨Î׸ˆg]bu•©psjG)0JM4+Q‘Â˯|H.6Mb|¨ÕáÉœN4Pc‡ÀêᵌpVES|˜jN=11P„«®™‡†•ÁÀ§‚dRO^~¡‡jbm{ˆœ°®Š\HUf`H=T‚©·´®¬¥‘pM:Fd~Š–²ÔàÇ•gVf‰§°¨¥²ÃÀ¤€eWQMO\xžº¸™vjwŒª´¯—{ouƒŽŽƒpcbku„¡ÅÜØÀžuNDg¼·§¡Ÿ“vpn|›°žtax˜Ž‰“•‰ƒŽ‘‹}k`mˆ’wNA[˜žœ•‹zz†Ÿ¶·ž}ifmy‰“ŠlF,*Hz ¦’|mZB;Po~‚½„Y?B\vwd\ipY9:^}xwxvzˆ„Y%Gv{^JSoŒ›i;$2W}’”Ž˜nVLHIYtzY26f‘•„€ˆ‰~r`A%4m¢§‹}Œ¡¦ ›”ƒpijeZTSM?c–¹Á¸¥Ž{rjYD@Sju{…‹„z„›£up|†‚xqq|‘ ™|bZcoy…˜•…l[b”‹pds‰z\A5Fo‘ŽjIDThw€}ql¢¯šzlsynV>6Hs¢´Ÿ~u†•‹oWI<14NqŽš—Š}yyqZEEXkt}–‹si{—šwB"5nž¡‚ksŠwR86KhuhPLfŒ¢¡’kZV`puhVWw¢±Y=Ou†yb\nŠœ™ˆwl`OFQk}~wz‡“™˜ƒ{€‡gSXrŽ›˜‡q]TXdorlcbo‚Š‚rlw‰\DOx£wjiq‰qt©¤Žƒˆˆ{t‚’‰iNIRZ]bl}‘ •‰}qfiz„zjlŽŽ‡}hQQt—•ucrŒ—˜œ›‰pgicTRf~ˆ’«ÆÊ´™gLDVp€‰™±vvfs—¢‹‹ž ‚dh…˜‘‚‚}~Š »Ê¾›xhhimš°®°¯Ÿ„po}‘Ÿœ‡ppŽ´À§€p‚ £„fn—»» —·©Ž{€”œ|€›°¯œŠ„‡‹{mwš¸¸£˜ž‘…œš…ol›¯©Ž{‰¿©}^^x™ª•ˆ‘¤©–~ojlvˆ“††“•‘ƒx|Œ–‘‡„ŠŽŽŠ†„ˆ“˜~snfYWn’¬›…wx„ˆ{cZm‘§ ‚`R_}”“ox‘¤‚g_k}‡‡ƒ~€„…~m]Zgw€ype\[fsui]aw‹‹yil|‹Œ‡{plqwupr{ƒ‚|wtsuz}vhahw€}rkkt~‚}tlhkvƒ„tbexr^`t‚{vma^kxz{‰š•zdfpkYP[rˆ—›”‰ƒudX\iqqmknw„ŽŠ€sfbs’¥œe`m…{iam€ˆ€uu{}vkbaju{wrs{„ŒŽ‰{nkr{ˆ‹ye]bilsŒ‘ˆ{wust|Œ—“…}†•š~tsy|vkel{ˆŠ†~tmo{„rhn’“‚ojw‹”Žtvtcby•ž’…‚†‡„‚‚ƒ…ˆ„wr„£³¥‰vog\[ft{‡Ž‚slq‚“˜‹yqx„…{rv†™Ÿ“{jl{Š‹…}xsru|xpp~”ˆuko|ƒ€vu‚—¢œŽ…†Š‹‡†ˆ‰„}‹–”„riiou}‡Ž‰xqmnu|ƒ…†„|pim|™ž¡¢ •…yx‚Ž”’‹ƒytzŠ˜˜ƒxmchw…Ž”™˜‡„yprƒ– œ‘ˆƒ‚…ˆ‹‰ut’…ukebbjwƒ’Ž„ˆ–•‚nl|‹‘’—œžž—ˆxqsurmp˜¦¥ž™—~la`enzˆ•›’‡„‡‰„„’™”‰…†„zt{œž“†‚ˆƒ€ˆ’x€Œƒ{{~~~‚Š’——‘‰‰˜—Œ‚}|~„‹†„‘–Œynpzƒ†ƒ€Œ£—jcis|ƒ˜Ÿ–‘‰~uu|‚ˆ•’…xsvz|{wsy‰˜–ˆ„‹‰€}ƒ‹‘”‘…vptyxw{†Œ‰xnw‚w[Sp–¡“‹”˜ƒaPZt†‰‚}‘…rfirvx~‰‘€oir€„{su{ztu€‰…xmlrx|~€|mXRh†Žzjz–c?Ly•ƒˆ~[EOlƒ‰†ƒ‚vh]_kvvpow€xsu{zofl‚˜˜‚kgs}zpkoutlhs‡•|nllcZ`q{ws~’Šukcgt{sily}wtj[Vh„‘‹„„€pae{‹y‰Œ†zplr}ˆŠ‚wpqvwspt|~vll{Ž–‰q^]k”œpXa‡§¡fj~‹‹ˆ‡qjs‚†{rv‚‰„zv{‚‚|x{†’‹†ymp‚“’‚rs€ˆƒzy…x‘Ÿžƒ|wokmsvx{€ƒ„‰’‰}z‚Š‹ˆ‡Š‰ƒ}Š‹ƒƒ‰‹‡‚†ˆ€ˆŒˆ~vszˆ•”‡yv}„…„ƒ€{y€Œ‘‰zt}Ž™’‚y~Š‰€~‚‡…ƒ‹‘Ž„~}{ur}’¡›ˆxw€‹„wwŠ¤ªfMY‚¬»§{UPp›°¢_T`~ ±¢k{œ¦ql~Ž”˜›jLT©²˜t[Ymˆ˜”†~~…’qf`bq‡‡€¢¥ysvvuz‚vqyz€š˜”–’}^Qd‰£¤–‡|‰“”‰zrx‡—¡¤¡™Šub]fyŒ–xft Ň`hŽ¡‰\BPzž£Šnk~‹…Ž¢ª™{jw—®§‡jgx‚u^TazŒŽqjp}„ƒ€|thev•ª£Šus}‡ˆxoigijilw€uotzvos„‘Žuuy|}ztpqvulflz…†€||‚‚yrnnw…Œ~qlpuvvy~ƒ‡’“Šzmku…‹yeaq„‰€|‡“’ƒww…‡‡…ˆ“ž›‡sp}‡‚xu~ˆŒŠƒ~}‚€„‹‘’ˆˆ‹ˆ†œ°¬“…’¤ ‰wwykWPa~“”ƒngt‚~lf~Ÿ«•wq†ˆut‚Ž“ © …dT^uƒ¤©š‡…ƒpXPd‡œ‘ugvŽ’{`Xg~Ž…|z|{tqx~ofq‰™‘yiktp]OZy‹xr„hSZw‹wio€‘‡zpkllnuƒyllz„|h^j‚’Ž€w{‚{gYb|ŽŒƒ„‘™tXMZu†lh{”š|sph]Zg–šŒ~‹ŒsQG`…—Ž‡ž±¬‘q]Z_dfq‰¢¨•‚ƒ“—‚g\gv{{“½¶•p_j|„‚‚†„{w€Œ}h]eš¨¥›œ”€miu‡™¤£™Ž‰„ynnx€~€‘©² ‚oo}Š‰{p{›¹½¨‚~xru…˜¡œ“”—Žwa]mƒŒ†€†–¡›‰wsy€z|‹¦Ÿ„‚|ss~‹…‚Œœ¡’{lmz…‡‚~‚ŠŒ…|wwxw{„ˆ|v{‰’Œ{ns†•“…yyƒ}||zwv|…‰‚tjn{…sim|Š‹~ohnwwmfkx~xs}Ž{edw‰‹~rr}‰Ž‡vf]_it{zrllrz{ujdjzˆ‹uory|yqmr‹ˆzmmxƒ…~tlhinx~wppv~~qa^l€„s__s†‰wusps~‹‰€yslgecah|‘–ˆz€”¡—}ichmqvz{wrrxƒ‹Š‚}€ˆŠƒvjden|††‚Ž™˜Ž„{vrrsqpwˆšŸ’|or€‹‹…ƒ‡‹‰†‡‰†|rr€“Š~|…•„xsv~ƒ‡Œ’“‹€~„†}rq{„…„‡“––‘ˆ{{||~†–˜–’‹‚{{‰ŽŽ‹ƒzw}…ˆ†…Œ”™—‘ŽŽˆƒˆŠ‰††ˆ‘Šƒ…Œ…€€ˆ‰‚€„ˆ‹‹‰†„…‰Š…|†Œ‰†…ˆŽ’…ƒ’Š}x{}yx{†Ž‹ˆ†‚‚„„ƒ…ˆŠˆ†††„~|{|ˆ‰~tsy~}z{„‹Œ‡…†‡„ƒ‚|urtzƒˆƒvmoy}{†ˆ„€€ƒ‚yvx}‚ƒ~xvz~{vtuwuqpw~zy€‡…zqrxysmp{|qjnx€ƒ‚zvutrnotxwux€„‚|wvx{}~~€‚umlqsrquxwssy€ƒ|upqw}~|yxz~~vnmptwz}|xuw{~{uporwyyxy}€€}wqmlnrw~…‡ƒ}z{|||}}}}‚„‚}zxwyz{{}…†‡†„zvv|€xonu…„€|{|€„…‚{xy~‚€~{{ƒ„}|~€€ƒˆ‹‰yvx{|z{€…ˆˆ†…†…ƒ}€|z}ƒ‡ˆ†‚€€‚‚‚„ˆ‹Š‡ƒ}}}}||„Š‰…‚‚ƒ„„ƒ„…†††‡ˆˆˆ‹Œ‡zz~ƒ‡‡ƒ|z~†‹Šˆ††††‡ˆˆ‡‡†…ƒ‚€}|…‰ˆ†‡‹ŽŒŒŠ‡†‡‰‡‚€€}{†‰…€€ƒ…ƒ~{{€†‰‰‡†††„‚€€„‹’•ˆƒ‚ƒ„„…‡‰Š‡„€~~~~|{~…ŒŒ…~|„…yvvtrsx‚ƒˆ‘˜˜“ŽŽ‹‰…~umjnv|}{yz€„ƒ|wx€‡‡‚|yz~ƒ}yy{~„…‚}{~‚ƒ€|{|~~}}€ƒ„~{z{z{}‚|rmr}‚|phn}ŠŒ‡|xtv~„‚|xz}ƒ‚ylbbhp|›ž”„wpnnnmlmnqsxˆ‡snpy…ƒ€€‚ƒƒ€~~~}zskimqsv€ˆƒtku…Šƒ}~~wmlu€‡‰‡€xsrohcix‰—˜ˆulputonqux}…‹Š‚ysqtvurt|…‹’‘‹ƒ}ytmkouy}ƒ…tpv|y}…‡€us|‰ŽŠ‚}zwx}}vv€ŠŠ…€ztsw|~‚‚ƒ‡ˆ„{vvvttw~‚…‡ˆˆ†ƒ€~|{}€„ˆ‹ˆzvvxz}~~~ƒ‡‡‚~~€|yy|†ŠŒŠ†…ƒ~~‚‡Š‹‹Šˆ„‚‚‚‚~ztpquz|„ˆ‰ˆˆ‰Š‰…€|yxz…ŠŒ‰„~zy{~€€ƒ…ƒ~zz„†…„†‰‰‡ƒƒ†‰†~vty€…ˆˆˆˆˆŠŠˆ‡ˆ‰‡zxz}~~}~€€‚‚ƒ†‹Ž‹†wsuz€€„††ƒ€~€‚ƒ‚€~~€ƒ‡‡„~|„†…‚‚…‡†ƒ||~„„‚€‚ƒ„|xwz~~ytu|…‹‹ˆ„‚„†…‚~{{|€€€€ƒˆ‹‰„ƒ†Š‰‚{xxxwwxz|~€ƒ……ƒ€‚ƒ„„‚}~‚„„‚}zwuuuvy{|}~€‚€€€€}{}…ŒŠ„‚…‡„~zy{|{z{„‡†„…‡†{x{€„…ƒ€ƒƒ{yzzxvz€…‚}{~{sory€ƒ‚€~{yz}~|z|€„†…‚~zxwuv|…‹‰‚}}~|wvz†…€{z|~€ƒ…ƒ}zy{}|zz{}~|yx{~~{z|€€}zxz}€‚ƒ‚~xw|…‰†ƒ‚ƒƒ‚‚ƒƒ‚€|xwxzzxw{~}wsv}‚€{wvy|~€€~~}{{€…‡ƒ~|}€zwy„„~}|{zz{~ƒ‚€ƒƒ€€‚€yss{…ˆ„~{~ƒ†‡…‚€‚‚|~‚„€xtvz|}~„†„~~‚……‚‚…‰‰‚||ƒ‰ˆƒ~{zyxwwx{~€…‰‰†„…ˆ‡~€‡Œ‰ƒ~{||{{}€~||‚‚~{yz{|}„‰‹‰…‚€~}ƒ†…}~|vvy|{y{„‡ˆ‡„€~zy}‚ƒ„ƒ|}€~yw{…„€‚††ƒ~zyy{||}‚ƒ‚€€‚ƒƒƒƒ……ƒ~ƒ„{xy}ƒ‚€€ƒ‚€€~{y|~~‚…†…ƒ€‚…„€€€}zz}‚‚}wyˆ‰‡†…‚}}†‰‡†…„yvy€†‡…‚€}{z}ƒˆ‹ŽŒˆƒ~wqqu{}{yy{|{{}…†„~~~~„†ˆ‡…ƒƒ„‡Š‹Š†‚€‚ƒ‚€€‚ƒƒ‚€}zxy|€~||}€€~}~~}}‚ƒ„‚€‚†ŠŠ†zxxxxwy~„ˆ‡‚~ytsu|‚†‡‡†…„‚‚€~}}}~€‚ƒ|xy~ywz€~|}€€€‚ƒƒ€|z{{yvux~‚‚€€ƒ††…‚€€€~~„…ƒ€}zyyyz|ƒ}z{~}}}~‚ƒ‚€}|}€‚}}~~}}~~}}~~~}}~€€~|zz|€~{|„†„€}|}}}~„††„}|{{}€€}{{}€~~€€}{z{}~€€~ƒ„…„„„„ƒ~}}~~}~€€~}€~~~|{}~|xvx{}~€‚ƒ‚‚ƒƒ‚€€‚ƒƒƒ~||€‚~|ƒ‚~z|„„‚~}}~€‚‚€|z{|{yz~ƒ††…~‚†…€|zz{{|}~€‚„„„‚€~€€~}~‚‚‚‚~~~~~~~}{zyz|~€€‚ƒ‚~„„‚€~~~€€}z{€„„{~„†{z‡‰‡ƒ€}{z|€€|{{|}~}ƒƒ€||‚‚}}€‚‚€€ƒ„‚~€„…}|~‚|z|€„…ƒ€}}€}|~ƒ…ƒzy{~€€‚…‡„}}~}{|~~~€ƒ„ƒƒƒ„ƒ€~}~ƒ~€‚~}{z|€ƒ‚‚ƒ„„ƒ€}|~€€~}}}€‚„ƒ‚‚‚ƒƒ‚‚€€‚€~|}~~}}~€‚ƒƒ‚€}}||~ƒƒ‚€‚ƒ„„ƒ‚‚‚‚‚€~|{{{zyz}€‚„……ƒ€€€|{|‚‚‚€~}||~‚€€€€~}|{|~ƒ„ƒ‚€~}~}|zz{~€‚‚€€}}~~~}}~€€€€€€€~}‚ƒ€}zz|‚ƒƒƒƒƒƒ‚€}{yz}€‚ƒ‚€€€€‚……ƒ€€~}|||}€€~€‚€~|}€„†…~‚ƒƒ‚€€€€~}}~}~ƒƒ~{{}€€~}}ƒƒ~€ƒ„ƒ}}€~~€€~}}}‚}}~€‚}}‚‚ƒƒ||}€€~~~~~}|{|~€€~~€‚€€}|zz|‚‚‚€~}~€€€€|zz~€€~€‚‚€€~}}~€|xx{€€‚‚„†„{tx„Š„|z~~€„…~xzƒ‰‡‚~{y|€ƒ~~|}†ƒ{vx|z{„‰†~wx~„„‚}}‚„‚}yy|„ƒ~z|†…€{y{„†ƒ~|||z|€…†ƒ~|~‚…ƒ~wtx…†‚}ƒ|xy~„‡…€{x{…„{|‚‡‰†|z|€~zwy†ˆ†€||‚~{y{‚‰Š…~z{€ƒƒ~zz†‰†€zwx}‚€||€…‡…€|z|……}|~‚†…€{y|€„„‚~}……€zutx€‡ˆyzƒ‹‹ƒ|xxz‡‡€yx}‚„€zuu|†‹ˆ||€…‡„|vv}†Š‡xvz€„ƒ|wyŒŒ‚z{†…xuz‚Š‹‡zy|€}vrw‰Šƒ{wz‚‚}xw|„Š‰ƒ|yz~ƒƒyw|…‹Šxuy€…„~y{‚‰Œˆ€xvz€„ƒ{|‚ˆŠ…{sqv…„~z|ƒ‰‰ƒ{wx}‚…ƒ~{}‚††€xrsz„€{y}„ˆ„|ts{„‰‡|z}‚†…xuy‚Š‰‚~ƒ…‚}xw}†ŒŠ„}{~zvuz‚ˆˆ‚{wx|€zuv|ƒ‡„~zxy}~}{{~ƒˆ‹Š…~z|‚†…~~‚‡‰†zy}‚„ƒ€}}‚ƒ‚|uru}„…~~ƒ‡†|xy|ƒ‚~{|‚‚€}{|€†‰‡}}„ƒ€|z|„ƒ€}}€‚‚}{}€ƒ„„~~€ƒƒ~zz~‚…„‚€~zwwz}€ƒ……~}ƒƒ€ƒ‡‡„}}€}zz}‚ƒƒ{y{~~ƒ……‚}{|~}}~€‚ƒ‚€~|{{}€€€‚„…‚|{~‚…„€~zvw}„…‚{x{…‘™™‘€iWYn„‹…ƒƒ…†~vv{€‚†‡„{wvz‚…{{…‚{wwz~„ˆ‰…~yy}‚‚…‰‰vpt}†Š†~xx{||~…‹Š„}yvw{€ƒ|wuw}…Š‰„{{|~‚‚„†…|yz~‚ƒzxy|~~~~~€ƒ…„€|{ƒ‡ˆ…€~{{‚|yxz€‡‹‹†zj`exžž”†yqpu|…Š~rlnu~…Šˆ‚|z{€…ŠŠ†||€€„‡‡‚ypow…‘–‘‡zpmsˆˆƒ‚‚}vtz…ŒŠ‚xrrw€ˆŒŒ‰…}{|}|yx{~~~€‚‚‚~{y|‚}‚…††„€|{~‚„ƒ€|yz~‚‚~€€€‚„‚~|~ƒ„„„~}|||ƒ…‚}zy{}€ƒƒ‚€€}}€€~~~ƒ‚~……ƒ}}‚~|zz{|~€‚ƒ‚~z{~‚‚‚€}{{}ƒ~}}}|}€€€‚‚}}}||}|{|~}zy|„…‚€~{xuw~…ˆ…‚€~‚€€€}|}~€€€‚~€€‚‚~}~€€~|{{}~€ƒ……‚~{{ƒ†…€|{~€|{|~~}}}ƒ„……‚}xw{‡‰‡ƒ€€~}~ƒ‚~}{{ƒƒ€~€ƒ‚}{|~~}~€€€‚‚~zyz~‚‚€€€}ywz€…„€|}„…‚~||€}{}€€€€~ƒ…„‚€€€}yy}‚|yy{~‚~‚ƒ„„‚|||}~†‰ˆƒ~{z|~€€~}~€€€€€€‚‚‚ƒƒ}||||{{}€ƒ„ƒ}{z~ˆŒ~plt€ˆˆ„}ywx~„ˆ‡‚}yx|ƒŠŽ‹„}yxz~‚€}{}}|zz}„„ƒ€~~€‚ƒ€}{yz}ƒ‚}}}}}~€‚„„ƒ€€}zxy{~€€€‚„ƒ€~~€ƒ…„€}}€ƒƒ€}}||}ƒƒ|y{„†„‚}{{~~}}~~‚€|z{†ˆ„~{{ƒ………„ƒzvvz€ƒƒ€}||‚ƒ„ƒ‚€~}}~‚ƒ‚€~|yy{‚‡‡yv{ƒ~~‚~xvx~ƒ„‚~€ƒƒ~}~€ƒ„‚}yx|„…„‚||€ƒ‚|}€}{|~„„‚€€€~€~~€„„€{xwy}‚ƒ€||‚€€ƒ„…ƒ||€€€~||}~€ƒ…„‚€€~~€€€‚‚}zyz‚ƒ~}€€~€‚‚~~€€~||}~~~€‚‚|{}€‚ƒ‚~~€€~{{}„…ƒ~zy{~‚‚ƒƒ‚€~}}}}}~€}{{|~~€‚‚€}||}}||~€‚‚€‚ƒ~|~„…ƒ~~~€‚€~~€€€€€€€€~}}€}|}~€€€~~€€~|}~€€~€€€€‚ƒƒ€€€€‚ƒ…‡‡„€|z|€~}}}}|||}ƒ„††…‚~~€€~|||~€‚ƒƒ‚€~~~€‚‚€~|{|}€€€~~€€€€€€€„…ƒ~zy{~ƒ††„€|{{}~~}}€€~€€~}}~€‚€€~}‚„„ƒ~|{{|~~~~€‚‚€€€€~€‚‚‚~{yz}€‚‚‚€}|}~€€‚„…„~€€€€‚‚€}zwuvx{}}~€€~}~€€€ƒƒƒ€€‚‚‚‚ƒ‚€€~|}~~~~~€‚€~}||}€~}|}}}}}~~}|~€€‚‚€€‚‚€€€€‚‚ƒ‚‚€~}}€ƒ…†„|z|}~~€€~~~}|}€‚ƒ……ƒ~yvwz}~~~~€ƒ„†‡ˆˆ†‚~€}zyyz}€~~€€~~~}{z{}€‚~}~ƒ…†…‚€€€€€€~~~}{|€~{{}~}|~€ƒ„„ƒ‚ƒ…‡‡…„‚}||}~~~~}{yy{~€€~}}}}}}}~€ƒ…‡…ƒ€€ƒƒ‚~~€€€€‚‚€€€~||{{{}€ƒ„ƒ€€‚ƒ‚~}}|||{zyyz|}~‚„……‚€~€~€‚€€€€€~|{{~€€}|~„„‚‚‚‚}{{|}}}||}~ƒƒ€€‚‚ƒ„„ƒ‚}||}}}}~€‚‚‚}~~{z|‚‚~~€€€€€€€€~}||~€€€ƒ…†„‚€€€~}}~~}~€€~}}~~}|}~~€‚ƒƒ‚€‚‚‚€~}|{|~€~~€€€€~}}~€€€€‚ƒ‚€~}~€ƒ„ƒ€|{}€€~~€€€~ƒ„ƒ€~}}~~~}}~€€€}{{|‚ƒ‚€~~~€€€‚ƒƒ‚€€€~~€~|}~€€~}€‚ƒ‚€~~€€€~€€~~~€€€~}}}~~‚‚€€~}}€‚ƒ„ƒ‚€€€~~€€~}}~~~}}}~€‚‚€€€€~~€‚‚~}}}}|{|~€‚‚‚‚ƒƒ‚€€€€~}~~€€€€€€€~}{z{}~~}|}~€€€€€€€~‚ƒ€€€€‚€‚‚}|}~€€€~~€€€€€€€€~~~€€€€~~‚}}}}~~€‚ƒ‚€€€€€€€€‚€€€€€€€~~~‚‚~€€~||~€‚‚€€€~}~€~|{|}€€~~~€€~~~€€‚€€€~~€€€€€€€~~~‚~|}€‚‚€€}||}}~‚„„~|z{~€~~‚„„|y{€„ƒ€~~~}}~~}}€~|}„‚}yz}€‚‚€~€€€€€~}~~~~~€~}}‚€}~€‚€‚‚}||~~~€‚€~~~~~€€€€€€‚‚€~€‚ƒ‚~€€€€€€€€€€~€€€~~~~~~~€€~€‚ƒ€€€~€~€€~~~€€€€‚‚€€€€€~~€€€€€€€~~~~~~~~~‚‚€€€~~~~}|}~€€€~‚‚€~}}~‚‚‚€~}||||}~€€€€€€~~~~}}€‚‚€€~~~€€~~~€€€€€€~~~€€€€€~}}~~~~~~~~~€€€€€€€~{yz}€€€€€‚‚‚ƒƒƒ‚€~}}|{{|}~~‚ƒ‚‚€~~~~}|||}~€€€€€‚‚~€‚‚‚€€‚‚€€€€€€€~~€€~~€€€€€€€€€€~}{z{~ƒ‚€‚„ƒ‚|zz{{|{{z|~ƒ…†‡†„‚€~||€~|}ƒƒ|xvwz~ƒ„ƒ‚ƒƒ‚€~~€€~‚‚€|xwy}„‚€€|{{ƒ†‡…‚€€€€}{{}~€‚~}~€‚ƒ‚‚€}|{|~~~€~~~~€‚€€€€€€~~~~~~€€€€~}~‚„ƒ~wtw{‚ƒƒ„‡†‚€ƒ„ƒ€|wtuy||zz|„†‡‰‹‹†z{}}‚ƒƒ{vstvz„‡†ƒ€ƒ„‚~{~ƒ…‚|xy……‚|wv{„‰†€ƒ…ƒ}xvyˆ‰…€}}~€€}{|~|}‚„|{‚€ƒƒ‚€~|||}~€€€€~‚}~€€€‚‚~|}€€€€~~‚‚€€~}~€‚ƒ€|yz|}‚‚‚‚ƒƒ‚€€€€}}}~~‚~~~|||~€‚‚‚}~€€~}|}~~}~€‚ƒƒ‚€}|{|}~€€~~~~~€~~€~~~}}}€€~}|||}}~€€‚‚‚€~||~‚‚€~}}~€€~||{{|~€‚ƒƒ€€€€€€~|}~€€~~~~}}€‚€~~€€€‚‚‚~~~€€€€€€€~}~~€€~~~~~~~~€€‚‚€€€~~~~€~}~€€~~€€€€€€€€€~~~}}}}}~€‚‚‚}}~€€~~~~~~~~~~€€€€€€€€~|{|}~~ƒƒ‚€€€~~€‚‚€~~|{|~~~‚‚}|„‘‘~heu‡Œˆƒ|z~ƒ…ƒ€}{{|}zz€‡‰‚{xz}†‰…}uuy~‚ƒƒ‚|{|‡Š‡€ywz}€€~~€‚‚||}€~|}ƒ‚€}{{~‚„„‚€€€€~~}}}}~‚††‚~€€‚ƒ‚~„„~xw|‚…‚|yy|~ƒ‰Š„}}€€zy€ˆ‰zxyz{„ˆ‡‚ztv€ŠŒ†‚‚|xz‚‚zw|…‡€|€‚wjs‘§œzcdv†‹€uquz€ˆŠ€tpx„Œ†}|{{}}€„„xvz‡†xz€„‚{yˆ‰wx€„‚~}}{{}‚€}|}„…‚€~|{„…‚~~}}}~€€}|‚……ƒ|z{~€€€€‚ƒ‚€|xx{€„…ƒ€€‚€€‚zvwyyz}……ƒ~€€€€€~~€€}|~ƒ„„‚|urv†‡‚{xy}ƒ‡‡‚zvw~…‡ƒ}yz~‚ƒ‚€~|z{~‚†‡„||‚€€~|{{}€€~}}~~}~€‚„…„‚|zz|€~}~‚„ƒ‚€~~~}}~‚€||ƒ„‚‚~~~~~€‚ƒƒ‚‚‚‚ƒƒ‚~||}~~~~~~~~€€~~€ƒ‚|z|~ƒƒ€~}€€~~~|}‚†…€||~€€€~~}|{|~€€~}}‚€~|{}€‚ƒƒƒ‚}|}~~€€~€‚‚~zz~‚‚€}}‚€~}~€€~~€€~~}~€€~}~€€~~€‚~€‚€‚ƒ‚€~€€~~€€}~ƒ‚€}}~€€}|}~€€€€€€€€€}}‚ƒ‚~€‚‚€}|~‚„‚~|}€‚|{~ƒ}}~€‚‚€~~€~~€}~„ƒ€~€~{|††‚}|}€}|~€€€€€~~‚€€€€~}}€ƒ„~}€~|}€~}€€}|~‚€€‚ƒ‚€~}}~~~~~~€~~€€€}~‚€}}€€€~€~~€€~~€€}{{~~|{|}~€€€‚~€€€€€€€€~~}~€€}|~€€€€€}|}~~}|}~€€€‚}}~€€}~€€€‚€€‚€€‚€€€}{{}~~€€€‚€~}}}~€‚ƒ‚}}€€€}}~€‚‚€€‚ƒ„ƒ€~~~~~}}}}~€€~|{{{{|~}|}~~}}~€€€€€€€€€€€€€€€€€€€‚‚€€‚‚€~}zz}€€~~€€€€‚ƒƒ‚}}‚‚~ƒ‚€€€€€€~}}}}}}}}|||~€€~€€€€€€~}|~€‚ƒ€€€€€€€~‚ƒ~~~}}~~€~~€€€~}}}}~~~~~~~€}}~€€€€€€€€€€€€€€‚‚‚€€€‚ƒƒ‚}|}~€€~~~~~€~~~~~~}}~~}|||}}~~~€‚€€€~~~€}{|}~~~€€~}~€‚€~}}}~~~‚~~~~~~~ƒ„„ƒƒ‚‚€€€~}}}~€‚‚‚‚‚ƒ„„‚€€€~}}}||}~~~~€‚ƒ„„ƒƒ‚€€~|{|}€~}}‚€„†…~~~~~€€~|||~~‚~~€€€€€€€~~~~~€~~€€€€€€€~~€~~~}~€€~~€€€€€€~~~€€€€€€}|~€‚~~~€€~~~~~‚€~~€~~~~€‚‚‚~~~€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€‚‚€€‚‚€€€€€€€€€€€‚ƒ‚€€€€€€€€~~~€€~}~€€~~~~}|}~€‚€€€€€~~~~}}}~~~}}~~~~~~~€€€~~~~€€€€€€€~~~€€€~~~~~~€~~~€€€~€€€€~~‚„ƒ€}}}}€€€€‚ƒƒ‚ƒ…†ƒ€~~~~~~~}{z{~~}}‚ƒ‚‚‚€€~}|}~€€~}~€€€€€€€€‚‚~€€€~}||}€€~~~}}}|{{|}}~€‚‚‚€€€€€€€~~~}}}}~€€€€€‚‚€~}}~~~}~‚‚ƒ‚‚€~}}~~~}~~~~€€~~~~€€€€~~~~€€~~~€€€€€~}~~~~€€€€€€€€€€€€~}||}~~~~~€€‚‚‚ƒƒƒ‚‚€~}}}~}}|}~€€€€~~€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€~~~€€€~€€~~~~€€€~~~~~~€€€€€€€€€€€€€€€€€~~~~~~€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€~€€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€~~~~~~€€€~~~~€€€~~~€€€€€€€€€€€€€€€€€€€€€€~~€€€€~~~~~€€€€€€€~~~~~~~€€€€€€€€€€€€€€€€€€€~}}€€~‚~~€€€€€€~ƒ‚}}€}}~€€€€€€€€~}~€€~}~€‚€~}~€€~~~€€~~}~€‚‚}}€€~~€€€€€€€~||‚‚€}{}}{|……€{z|€ƒ…„‚~€€~}‚‚€}{{~€{yz~ƒ…†…ƒzy{€„…ƒ€~}}}}~„…ƒ€~}}}~~}~€}|~ƒ}{{|}}~€ƒ…„‚~€€€~{z|€€€}}‚‚}{|€€€|xx€ŠŒ€uprx€†‹‹ˆ‚}zz}‚‡‡„|yxz€‚ƒ}yz}‚„„‚€}}~€€}{y|…††…€{y|‚„‚}}~~}‚„„‚€}|}€‚€€€€€~~€€~€€~|zz|‚€€‚ƒƒ€‚}|~€€€€~}ƒ†ƒ~xw{€ƒƒƒƒ‚€}|}~€€€€€~{zz|~~ƒƒ€€‚€€€~}}}}}}‚‚‚‚€~}}~€€~{y|€ƒ„ƒ€}||~€~~€‚‚€~}€}{{|ƒƒ}{{~‚ƒ‚~~€}|}€ƒ„~}}€‚„ƒ‚€~}||||{}€‚~‚~}~}|{|~‚‚€~~€€€€~‚‚€€€€~~€‚ƒ‚~~‚‚€€€}||~€€€€‚‚€~|||~€‚€~~€€€€€~||}€€~~~€€€€~~‚€}}~€€€€~}~‚€}|{}~€€‚~}~~~~€€€€€€~}~€€€€€€€~~€€~~€€~~~~~€€€€~}~~~~‚‚€~~€€€€€~~€€~~~€€‚€~~~~~€‚~~€€~€€€~~€‚ƒ‚€~}~€‚€€~}}~€€€€€€€€€€€€€€‚‚}|}~€€€€€€€€~}}}}}~‚‚ƒ‚€~||~€€~~~~~€}}}‚~~€€€€}}~~€€€}}~€‚}|}€€~~~~€‚€~}||}€€€€~~~~€€€~~€‚~}~~€€€~~~~€€~~~~€€~€€€€€€€€€€€~}~€€~}~€€€~}}~€‚ƒ‚€~}}~~€€€€~~€€~€€€~~~~€‚€~~€€€€€€€€€€~~}}€€~€€€€~~~€€€€€~~~~€€~~~€€€~~€€€~~€€€€€~~~~€€€~}~€~~~€€€€€€€~€€€€€€€€€€€€~~€€€€€€€€€~~€€€€€€~~€€€€€€€~}|}~€€‚‚€~~~€‚ƒƒ€~~~€€~~€‚ƒ‚|{{}€‚ƒƒ‚‚€~}|||~€‚ƒ„„„„‚~|{|}}}~~€‚|zz{|}}}ƒƒƒ‚‚‚€‚ƒ‚‚€~}}~~~~€~~~}}~€€~‚‚€~}}€‚ƒ‚€€€€€€€‚‚}||}}}~€€~~}}~~~~‚ƒƒ‚€~}}}~€‚‚‚}|{{{}~€€€~}~~€‚‚‚€~~~~~~~~~~~~~~~}~€€€€€€~~€€€~~~€€€€€€€~}|}}~~€‚‚‚€€~~}}~€€€~€€€€€€€€€€~~~€€€~}}}}~~~€~~€€€‚ƒ‚‚€~~€‚ƒƒƒƒ}|{||~€€€~~~~~~~€€€€€€€€€€€‚‚‚‚‚€€~~~~}~€€~}|}‚€€~}|||~€€‚‚‚€}||}}}~€€‚‚~~~~~~~~€€€~~~~}}||}}€‚‚€€~}||}}~‚‚‚€€€€~~}}~~}}~€‚„„„‚~}}}}}}|}~€‚‚ƒ„„„ƒ‚€~}|}}~~~~~€€€‚‚€~~~€€‚‚€€€€€€€€€~}|}}€‚‚‚‚„………ƒ~{xwwx{~€‚ƒ„„„ƒ‚€~~~~~}||~€ƒƒƒ„„„ƒ~}}}€€~}|{||}}~‚ƒ„ƒ‚€~~~€‚‚‚~}{zzzz{|}‚|zyz{}ƒ…‡‡‡†…„ƒ~||{zz{}€€€€€~}|}€‚‚‚€}||}}~‚‚ƒƒ‚~~}}}}}}}€€€‚ƒƒ‚‚€}|||||}~~~~€€€€€€€~~~~~~~~~€€€~}}||}~€‚ƒ„ƒ‚€~}}}}~~€€€€~}~~€‚‚‚€}||||}€‚ƒƒ‚€~~~~€‚‚‚}}~€€€€€€€~~€€~~€‚‚€€€€~|{}~}~ƒ„„‚~~€€€€ƒ„ƒ€~}}~}|||}}€€~}‚ƒ‚€~‚‚€€€~}~€€}||}~€€€€€€€}|}~~~~€~|{|~€‚‚€~}}~~~~€€€€€€€~€€~€€~~~}}}~~~€€€~€€€€‚ƒƒ‚€€€~}||ƒ††„€{wuvy|‚ƒ‚€€ƒ„……„‚}}~€€€}||}€€‚ƒƒ‚€~}|}~~}{{}~}{zz}€ƒ…‡‡…ƒ€€€€‚ƒƒ‚€}{{|~€€}|zyyy{~„†‡ˆ‰Šˆ…‚€€zsqsz‚ˆŠ‡‚}zwwx{~„†‡…}{|~„††…„‚€~{ywvvxz|}}}}}}||}~€‚~}€ƒ†ˆ‡†„‚‚ƒ„„~}~€€€€~{yyz{{zyz{zywvvwz~ƒƒƒ„…‡ˆ‡†…†ˆˆ‡…„„…ƒ~}|{{{||{zyyz{|}|}~„†‡†…ƒ€‚ƒƒ‚€~~}}}||{|||}~ƒ…††…„ƒ‚€}||}~~€€€}{zz{~ƒ„ƒ€}{z{|~€‚„………„‚€~}|||~€€€€€~~~~}{zyz|~€‚‚€}|}‚ƒƒƒ|{{}€}|||~„†…ƒ€€€}||~€‚ƒ‚€~~~~}}}~~~~€€~~~ƒ„„‚€~€€~~~~~~~}}}~~€€€€‚‚ƒƒƒ‚€~~}~~~~~~~~~~~~€€‚‚‚‚ƒ„„…„‚€~}}}}}}}|{{{|~€€€~}}~€€€€€€‚€~~€‚‚‚~~}~€€€€€}||||}~~}}}~~~~€€€€€€€€€€€€€~~~~~~~~~~€€€€€€€€€€€€€~~}}~~~~€‚ƒ……„‚€€~}|}€€€~~}|}~€‚‚€€€€€~~~‚}||}€€€€€€‚‚~}~€€€€€~~€‚‚‚‚€~}~~~~~~€€€€~}}~€€‚‚€€€€€€€~}|}}~~~~~~€‚~}}~€‚€~~~€€€€€€€~~~~~}}~~€€€~~~€€€~~~~~~~€€‚‚~}}|}~~~}}~~€€€~~~~}}}~€€€~~~€€~~~~}~~€€€€€€€€€~€€€€~~~~€‚‚‚‚€~~~~~€€€€€~~€€€€€€€€€€~~~~~€€~~€€€~~}~~~}}~~€€€€€€€€€€~~}}}~€€€€€€€€~~€€€€~~~~~~~€€€€€€€€~~~~~~€€€€~~~~~€‚‚ƒƒ‚€~~~}}}||}~~~€€€€€€€€€€~~}}}}}~~€€€~~~~}}}~~~~€€€€€€€€€€€€~~€€€€€~}}~€‚‚‚‚‚€€€€€~€€€€€€€€€€€€€€€€€€€‚‚ƒ‚€~~~€€€€€€€€~~~~€€€€€€€€€~}}~~~~~€€€€€~~~~}}}}~€€€€~~~}}}~~€€€€€€~~~~~~~€€€€€€€€€€~~~~~~~€€€€~~~~€‚‚‚€€~~~€€€€€€€€€€€€€~~~€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€~~~€€€€€€€€€€€€€€~~~~~€€€~~}}}~€€€~~~~€€€€€€€€€~~~€€€€€~~€€€€€~~~€€€€€€€€€€€~€€€€€€~~€€€€€€~~~~~€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€~~€€€€~~~~~~~€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€~€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€€€€€€€~~€€€~~~~~~€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€~~~€€~€€€€€€€€€€€€€€€€€€€€€€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€~~€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
\ No newline at end of file
diff --git a/examples/audio-wave/audio-wave-icon.png b/examples/audio-wave/audio-wave-icon.png
deleted file mode 100644
index 6e114692e..000000000
Binary files a/examples/audio-wave/audio-wave-icon.png and /dev/null differ
diff --git a/examples/audio-wave/audio-wave.cpp b/examples/audio-wave/audio-wave.cpp
deleted file mode 100644
index 055f43c86..000000000
--- a/examples/audio-wave/audio-wave.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-#include
-#include
-#include
-#include
-
-#include "audio-wave.hpp"
-
-#include "assets.hpp"
-
-/*
- Wave example:
-
- An example of an arbitrary waveform being played through the blit speaker.
-
- This example, a runthrough:
-
- Audio data:
- The audio file has been converted to 22050Hz sample rate, then exported without its header.
- (If a headered file is used, just read past that first. Try skipping the first 44 bytes).
- You would preferably store files separate because uncompressed audio will use all your flash!
- Here though, the raw wave to a c header using 'xxd -i glass.raw glass.h'
-
- As the data could be long, or even infinite, we can fill the audio buffer via a callback.
-
- Calling channels[n].trigger_attack() will run the playback and callback continuously until
- either channels[n].trigger_release() or channels[n].off() is called.
-
-
-*/
-
-
-
-using namespace blit;
-
-void buff_callback(AudioChannel &); //Declare our callback here instead of putting the whole thing here.
-
-/* setup */
-void init() {
-
- // Setup channel
- channels[0].waveforms = Waveform::WAVE; // Set type to WAVE
- channels[0].wave_buffer_callback = &buff_callback; // Set callback address
-
- screen.pen = Pen(0, 0, 0, 255);
- screen.clear();
-}
-
-
-// Static wave config
-static uint32_t wav_size = 0;
-static uint16_t wav_pos = 0;
-static uint16_t wav_sample_rate = 0;
-static const uint8_t *wav_sample;
-
-
-// Called everytime audio buffer ends
-void buff_callback(AudioChannel &channel) {
-
- // Copy 64 bytes to the channel audio buffer
- for (int x = 0; x < 64; x++) {
- // If current sample position is greater than the sample length, fill the rest of the buffer with zeros.
- // Note: The sample used here has an offset, so we adjust by 0x7f.
- channel.wave_buffer[x] = (wav_pos < wav_size) ? (wav_sample[wav_pos] << 8) - 0x7f00 : 0;
-
- // As the engine is 22050Hz, we can timestretch to match by incrementing our sample every other step (every even 'x')
- if (wav_sample_rate == 11025) {
- if (x % 2) wav_pos++;
- } else {
- wav_pos++;
- }
- }
-
- // For this example, clear the values
- if (wav_pos >= wav_size) {
- channel.off(); // Stop playback of this channel.
- //Clear buffer
- wav_sample = nullptr;
- wav_size = 0;
- wav_pos = 0;
- wav_sample_rate = 0;
- }
-}
-
-void render(uint32_t time_ms) {
- screen.pen = Pen(0, 0, 0);
- screen.clear();
-
- screen.alpha = 255;
- screen.pen = Pen(255, 255, 255);
- screen.rectangle(Rect(0, 0, 320, 14));
- screen.pen = Pen(0, 0, 0);
- screen.text("Wave Example", minimal_font, Point(5, 4));
-
- screen.pen = Pen(64, 64, 64);
- screen.text("Press A to break screen.", minimal_font, Point(20, 60));
-}
-
-void update(uint32_t time_ms) {
- bool button_a = blit::buttons & blit::Button::A;
-
- // If 'A' button pushed
- if(button_a){
- wav_sample = glass_wav; // Set sample to the array in assets.hpp
- wav_size = glass_wav_length; // Set the array length to the value in assets.hpp
- channels[0].trigger_attack(); // Start the playback.
- }
-}
-
diff --git a/examples/audio-wave/audio-wave.hpp b/examples/audio-wave/audio-wave.hpp
deleted file mode 100644
index 21d2d7a39..000000000
--- a/examples/audio-wave/audio-wave.hpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#pragma once
-
-#include
-
-#include "32blit.hpp"
-
-void init();
-void update(uint32_t time);
-void render(uint32_t time);
-
-
diff --git a/examples/audio-wave/audio-wave.png b/examples/audio-wave/audio-wave.png
deleted file mode 100644
index e3d20d5bc..000000000
Binary files a/examples/audio-wave/audio-wave.png and /dev/null differ
diff --git a/examples/audio-wave/metadata.yml b/examples/audio-wave/metadata.yml
deleted file mode 100644
index f728739d9..000000000
--- a/examples/audio-wave/metadata.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-title: Audio Wave
-description: A simple demo of arbitrary waveform audio. Press a button to hear a glass smash sound.
-author: tinwhisker
-splash:
- file: audio-wave.png
-icon:
- file: audio-wave-icon.png
-version: v1.0.0
-url: https://github.com/32blit/32blit-sdk
-category: demo
\ No newline at end of file
diff --git a/examples/doom-fire/CMakeLists.txt b/examples/doom-fire/CMakeLists.txt
deleted file mode 100644
index a8a5b73ca..000000000
--- a/examples/doom-fire/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-cmake_minimum_required(VERSION 3.9)
-project (doom-fire)
-find_package (32BLIT CONFIG REQUIRED PATHS ../..)
-blit_executable (doom-fire doom-fire.cpp)
-blit_metadata (doom-fire metadata.yml)
diff --git a/examples/doom-fire/doom-fire-icon.png b/examples/doom-fire/doom-fire-icon.png
deleted file mode 100644
index 8712448e3..000000000
Binary files a/examples/doom-fire/doom-fire-icon.png and /dev/null differ
diff --git a/examples/doom-fire/doom-fire.cpp b/examples/doom-fire/doom-fire.cpp
deleted file mode 100644
index f7b1f7a63..000000000
--- a/examples/doom-fire/doom-fire.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * An example that implements the "Doom Fire", as documented by Fabien
- * Sanglard: http://fabiensanglard.net/doom_fire_psx/
- *
- */
-#include
-#include
-#include
-#include
-
-#include "doom-fire.hpp"
-
-using namespace blit;
-
-const uint16_t screen_width = 320;
-const uint16_t screen_height = 240;
-const uint32_t FPS = 1000 / 27; // DoomFire runs at 27FPS.
-
-Pen palette[] = { // 36 colours
- Pen(0x07, 0x07, 0x07), Pen(0x1f, 0x07, 0x07), Pen(0x2f, 0x0f, 0x07),
- Pen(0x47, 0x0f, 0x07), Pen(0x57, 0x17, 0x07), Pen(0x67, 0x1f, 0x07),
- Pen(0x77, 0x1f, 0x07), Pen(0x8f, 0x27, 0x07), Pen(0x9f, 0x2f, 0x07),
- Pen(0xaf, 0x3f, 0x07), Pen(0xbf, 0x47, 0x07), Pen(0xc7, 0x47, 0x07),
- Pen(0xDF, 0x4F, 0x07), Pen(0xDF, 0x57, 0x07), Pen(0xDF, 0x57, 0x07),
- Pen(0xD7, 0x5F, 0x07), Pen(0xD7, 0x67, 0x0F), Pen(0xcf, 0x6f, 0x0f),
- Pen(0xcf, 0x77, 0x0f), Pen(0xcf, 0x7f, 0x0f), Pen(0xCF, 0x87, 0x17),
- Pen(0xC7, 0x87, 0x17), Pen(0xC7, 0x8F, 0x17), Pen(0xC7, 0x97, 0x1F),
- Pen(0xBF, 0x9F, 0x1F), Pen(0xBF, 0x9F, 0x1F), Pen(0xBF, 0xA7, 0x27),
- Pen(0xBF, 0xA7, 0x27), Pen(0xBF, 0xAF, 0x2F), Pen(0xB7, 0xAF, 0x2F),
- Pen(0xB7, 0xB7, 0x2F), Pen(0xB7, 0xB7, 0x37), Pen(0xCF, 0xCF, 0x6F),
- Pen(0xDF, 0xDF, 0x9F), Pen(0xEF, 0xEF, 0xC7), Pen(0xFF, 0xFF, 0xFF)
-};
-
-uint8_t fire[screen_width * screen_height];
-uint32_t last_time = 0;
-int8_t wind = 0;
-bool enabled = true;
-
-uint32_t posAt(uint32_t x, uint32_t y) {
- return y * screen_width + x;
-}
-
-void init() {
- blit::set_screen_mode(ScreenMode::hires);
-
- screen.pen = Pen(0, 0, 0, 255);
- screen.clear();
-
- // Initialises the screen
- for (int x = 0; x < screen_width; x++) {
- for (int y = 0; y < screen_height; y++) {
- uint32_t pos = posAt(x, y);
- fire[pos] = 0;
- }
- }
-
- // Initialises the bottom line
- for (int i = 0; i < screen_width; i++) {
- uint32_t pos = posAt(i, screen_height - 1);
- fire[pos] = 35;
- }
-}
-
-void update(uint32_t time) {
- // Adds wind to east.
- if (buttons.pressed & Button::DPAD_LEFT) {
- wind--;
- }
-
- // Adds wind to east.
- if (buttons.pressed & Button::DPAD_RIGHT) {
- wind++;
- }
-
- // Toggles fire on and off.
- if (buttons.pressed & Button::X) {
- uint8_t fire_index = enabled ? 0 : 35;
- for (int i = 0; i < screen_width; i++) {
- uint32_t pos = posAt(i, screen_height - 1);
- fire[pos] = fire_index;
- }
- enabled = !enabled;
- }
-}
-
-void render(uint32_t time) {
- if (time - last_time < FPS) {
- return;
- }
- last_time = time;
- for (int y = 0; y < screen_height; y++) {
- // Precompute the rows for a small performance gain.
- int row = y * screen_width;
-
- // For each pixel in each row, calculate the colours that will be
- // rendered on the previous row, on the next call to update.
- int next_row = y == 0 ? 0 : (y - 1) * screen_width;
-
- for (int x = 0; x < screen_width; x++) {
- // Draw the current pixel.
- uint8_t color = fire[row + x];
- screen.pen = palette[color];
- screen.pixel(Point(x, y));
-
- // Update the pixels on the previous row.
- if (y > 0) {
- int new_x = x;
- int rand = std::rand() % 3;
- new_x = (new_x + rand - 1 + wind);
- if (new_x >= screen_width) {
- new_x = new_x - screen_width;
- }
- else if (new_x < 0) {
- new_x = new_x + screen_width;
- }
- color = color > 0 ? color - (rand & 1) : 0;
- fire[next_row + new_x] = color;
- }
- }
- }
-}
diff --git a/examples/doom-fire/doom-fire.hpp b/examples/doom-fire/doom-fire.hpp
deleted file mode 100644
index b791bb454..000000000
--- a/examples/doom-fire/doom-fire.hpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#pragma once
-
-#include
-
-#include "32blit.hpp"
-
-void init();
-void update(uint32_t time);
-void render(uint32_t time);
\ No newline at end of file
diff --git a/examples/doom-fire/doom-fire.png b/examples/doom-fire/doom-fire.png
deleted file mode 100644
index 064868447..000000000
Binary files a/examples/doom-fire/doom-fire.png and /dev/null differ
diff --git a/examples/doom-fire/metadata.yml b/examples/doom-fire/metadata.yml
deleted file mode 100644
index 4a8d298b2..000000000
--- a/examples/doom-fire/metadata.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-title: Doom Fire
-description: The classic cellular automata animated pixel fire effect from the Final DOOM console port.
-author: andreban
-splash:
- file: doom-fire.png
-icon:
- file: doom-fire-icon.png
-version: v1.0.0
-url: https://github.com/32blit/32blit-sdk
-category: demo
\ No newline at end of file
diff --git a/examples/fizzlefade/CMakeLists.txt b/examples/fizzlefade/CMakeLists.txt
deleted file mode 100644
index e8e248121..000000000
--- a/examples/fizzlefade/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-cmake_minimum_required(VERSION 3.9)
-project (fizzlefade)
-find_package (32BLIT CONFIG REQUIRED PATHS ../..)
-blit_executable (fizzlefade fizzlefade.cpp)
-blit_metadata (fizzlefade metadata.yml)
diff --git a/examples/fizzlefade/fizzlefade.cpp b/examples/fizzlefade/fizzlefade.cpp
deleted file mode 100644
index 5e9506df1..000000000
--- a/examples/fizzlefade/fizzlefade.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-
-#include
-#include
-#include
-#include <32blit.hpp>
-
-#include "fizzlefade.hpp"
-
-using namespace blit;
-
-#define FADE_STEPS 3
-
-Pen fade_to[FADE_STEPS]{
- Pen(128, 64, 15, 64),
- Pen(15, 128, 15, 64),
- Pen(15, 64, 128, 64)
-};
-
-uint16_t taps[FADE_STEPS]{
- 0x74b8,
- 0x50e7,
- 0x6000
-};
-
-int8_t fade_current = 0;
-
-/* setup */
-void init() {
- set_screen_mode(ScreenMode::lores);
-
- screen.alpha = 255;
- screen.mask = nullptr;
- Pen p = fade_to[FADE_STEPS - 1];
- p.a = 255;
- screen.pen = p;
- screen.clear();
-
- screen.pen = fade_to[0];
-}
-
-uint32_t lfsr = 1;
-uint16_t tap = 0x74b8;
-Point fizzlefade() {
- uint16_t x = lfsr & 0x00ff;
- uint16_t y = (lfsr & 0x7f00) >> 8;
-
- uint8_t lsb = lfsr & 1;
- lfsr >>= 1;
-
- if (lsb) {
- lfsr ^= tap;
- }
-
- if (x - 1 < 160 && y < 120) {
- return Point(x - 1, y);
- }
-
- return Point(-1, -1);
-}
-
-void render(uint32_t time_ms) {
- uint32_t ms_start = now();
-
- screen.pen = fade_to[fade_current];
-
- for (int c = 0; c < 500; c++) {
- Point ff = fizzlefade();
- if (ff.x > -1) {
- screen.pixel(ff);
- }
- if (lfsr == 1) {
- fade_current += 1;
- fade_current %= FADE_STEPS;
- tap = taps[fade_current];
- break;
- }
- }
-
- uint32_t ms_end = now();
- screen.mask = nullptr;
- screen.pen = Pen(255, 0, 0);
- for (uint32_t i = 0; i < (ms_end - ms_start); i++) {
- screen.pen = Pen(i * 5, 255 - (i * 5), 0);
- screen.rectangle(Rect(i * 3 + 1, 117, 2, 2));
- }
-}
-
-void update(uint32_t time) {
-
-}
diff --git a/examples/fizzlefade/fizzlefade.hpp b/examples/fizzlefade/fizzlefade.hpp
deleted file mode 100644
index e81a4cdf8..000000000
--- a/examples/fizzlefade/fizzlefade.hpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-
-#include
-
-#include "32blit.hpp"
-
-
- void init();
- void update(uint32_t time);
- void render(uint32_t time);
diff --git a/examples/fizzlefade/metadata.yml b/examples/fizzlefade/metadata.yml
deleted file mode 100644
index 801f22176..000000000
--- a/examples/fizzlefade/metadata.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-title: Fizzlefade
-description: The classic fizzle fade screen transition effect using a LFSR.
-author: pimoroni
-splash:
- file: ../no-image.png
-icon:
- file: ../no-icon.png
-version: v1.0.0
-url: https://github.com/32blit/32blit-sdk
-category: demo
\ No newline at end of file
diff --git a/examples/flight/CMakeLists.txt b/examples/flight/CMakeLists.txt
deleted file mode 100644
index d5685a88e..000000000
--- a/examples/flight/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-cmake_minimum_required(VERSION 3.9)
-project (flight)
-find_package (32BLIT CONFIG REQUIRED PATHS ../..)
-
-if(32BLIT_PICO)
- # This example uses too much RAM (at run time)
- return()
-endif()
-
-blit_executable (flight flight.cpp)
-blit_assets_yaml (flight assets.yml)
-blit_metadata (flight metadata.yml)
diff --git a/examples/flight/assets.yml b/examples/flight/assets.yml
deleted file mode 100644
index 6edd2599e..000000000
--- a/examples/flight/assets.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-assets.cpp:
- assets/flight.png:
- name: packed_data
-
- assets/water.png:
- name: water_packed_data
diff --git a/examples/flight/assets/flight.png b/examples/flight/assets/flight.png
deleted file mode 100644
index 3eeab0716..000000000
Binary files a/examples/flight/assets/flight.png and /dev/null differ
diff --git a/examples/flight/assets/water.png b/examples/flight/assets/water.png
deleted file mode 100644
index f7b96d5b3..000000000
Binary files a/examples/flight/assets/water.png and /dev/null differ
diff --git a/examples/flight/flight.cpp b/examples/flight/flight.cpp
deleted file mode 100644
index 718923229..000000000
--- a/examples/flight/flight.cpp
+++ /dev/null
@@ -1,313 +0,0 @@
-
-#include
-#include
-#include
-#include
-
-#include "graphics/mode7.hpp"
-
-#include "flight.hpp"
-#include "assets.hpp"
-
-using namespace blit;
-
-// extra space allocated to take mipmaps
-// mipmaps are stored as Pen since they're the blended result of scaling the paletted image data
-uint8_t __sprites[(128 * 128) + (64 * 128 * sizeof(Pen))];
-
-// storage for the water spritesheet
-uint8_t __water[64 * 64];
-
-/* create surfaces */
-Surface *sprites;
-Surface *water;
-
-Map map(Rect(0, 0, 128, 128));
-
-struct object {
- Vec2 pos;
- uint8_t type;
-
- object(Vec2 pos, uint8_t type) : pos(pos), type(type) {}
-};
-
-struct DrawObject {
- object o;
- float dist;
- Vec2 vs;
-
- DrawObject(object obj, float dist, Vec2 vs): o(obj), dist(dist), vs(vs) {}
-
- bool operator< (const DrawObject &other) const {
- return other.dist < dist;
- }
-};
-
-std::vector