diff --git a/.drone.yml b/.drone.yml index d0541de..f49242b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,7 +8,7 @@ trigger: - main steps: - - name: docker-default + - name: docker image: plugins/docker settings: registry: git.riksolo.com @@ -18,30 +18,4 @@ steps: - latest - ${DRONE_COMMIT} password: - from_secret: dockertoken - - - name: docker-rblicht - image: plugins/docker - settings: - registry: git.riksolo.com - username: riksolo - repo: git.riksolo.com/${DRONE_REPO,,} - build_args: - - SITE=rblicht - tags: - - latest-rblicht - - ${DRONE_COMMIT}-rblicht - password: - from_secret: dockertoken - - - name: trigger docker-compose release - image: plugins/downstream - settings: - server: https://drone.riksolo.com - token: - from_secret: drone_token - repositories: - - RikSolo/docker-compose - depends_on: - - docker-default - - docker-rblicht \ No newline at end of file + from_secret: dockertoken \ No newline at end of file diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml deleted file mode 100644 index c0b30ba..0000000 --- a/.forgejo/workflows/build.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Build -on: [workflow_dispatch] - -jobs: - Deploy: - runs-on: docker - container: - image: ghcr.io/catthehacker/ubuntu:act-latest - - steps: - - name: Install LFS - run: | - curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash - apt-get update - apt-get install -y git-lfs - git lfs install - - - name: Checkout - uses: actions/checkout@v4 - with: - lfs: 'true' - - - name: Docker Login - run: | - docker login -u riksolo -p ${{secrets.CONTAINER_REGISTRY_TOKEN}} git.riksolo.com - - - name: Build and push - run: | - docker build -t git.riksolo.com/riksolo/eleventy-riksolo-com:latest -t git.riksolo.com/riksolo/eleventy-riksolo-com:${{github.sha}} . - docker push git.riksolo.com/riksolo/eleventy-riksolo-com:latest - docker push git.riksolo.com/riksolo/eleventy-riksolo-com:${{github.sha}} - docker build --build-arg SITE=rblicht -t git.riksolo.com/riksolo/eleventy-riksolo-com:latest-rblicht -t git.riksolo.com/riksolo/eleventy-riksolo-com:${{github.sha}}-rblicht . - docker push git.riksolo.com/riksolo/eleventy-riksolo-com:latest-rblicht - docker push git.riksolo.com/riksolo/eleventy-riksolo-com:${{github.sha}}-rblicht - - - name: Trigger Compose Deploy - uses: https://github.com/fjogeleit/http-request-action@v1 - with: - url: ${{ vars.DOCKER_COMPOSE_DEPLOY_URL }} - method: 'POST' - customHeaders: '{"Content-Type": "application/json", "Authorization": "token ${{secrets.FORGEJO_TOKEN}}"}' - data: '{"ref": "${{forgejo.ref}}"}' \ No newline at end of file diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..0fd5c20 --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,65 @@ +name: Build +on: [workflow_dispatch] + +jobs: + Deploy: + runs-on: ubuntu-latest + steps: + - name: Start webhook + if: ${{always()}} + continue-on-error: true + uses: fjogeleit/http-request-action@v1 + with: + url: ${{vars.NODE_RED_WORKFLOW_STARTED_URL}} + data: '{"job": ${{toJSON(job)}}, "gitea": ${{toJSON(gitea)}}}' + + - name: Install LFS + run: | + curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash + apt-get update + apt-get install -y git-lfs + git lfs install + + - name: Checkout + uses: actions/checkout@v4 + with: + lfs: 'true' + + - name: Docker install + run: | + export DEBIAN_FRONTEND=noninteractive + apt-get update + apt-get install -yqq ca-certificates curl + install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc + chmod a+r /etc/apt/keyrings/docker.asc + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + tee /etc/apt/sources.list.d/docker.list > /dev/null + apt-get update + apt-get install -yqq docker-ce docker-ce-cli containerd.io + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker Login + uses: docker/login-action@v3 + with: + registry: git.riksolo.com + username: riksolo + password: ${{secrets.CONTAINER_REGISTRY_TOKEN}} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + push: true + tags: git.riksolo.com/riksolo/eleventy-riksolo-com:latest , git.riksolo.com/riksolo/eleventy-riksolo-com:${{github.sha}} + + - name: Completion webhook + if: ${{always()}} + continue-on-error: true + uses: fjogeleit/http-request-action@v1 + with: + url: ${{vars.NODE_RED_WORKFLOW_COMPLETE_URL}} + data: '{"job": ${{toJSON(job)}}, "gitea": ${{toJSON(gitea)}}}' \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 5b64798..781c554 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,6 @@ FROM node:22 WORKDIR /usr/src/app -ARG SITE=default -ENV SITE=$SITE - COPY package*.json ./ RUN npm install ADD . . diff --git a/content/_data/site.js b/content/_data/site.js deleted file mode 100644 index 472322c..0000000 --- a/content/_data/site.js +++ /dev/null @@ -1,8 +0,0 @@ -export default function () { - return { - title: process.env.SITE === "rblicht" ? "RBLicht" : "Rik Berkelder", - url: process.env.SITE == "rblicht" ? "https://rblicht.nl" : "https://riksolo.com", - author: "Rik Berkelder", - site: process.env.SITE || 'default' - }; -} \ No newline at end of file diff --git a/content/_data/site.json b/content/_data/site.json new file mode 100644 index 0000000..e1ee386 --- /dev/null +++ b/content/_data/site.json @@ -0,0 +1,5 @@ +{ + "title": "Rik Berkelder", + "url": "https://riksolo.com", + "author": "Rik Berkelder" +} \ No newline at end of file diff --git a/content/blogposts/2024-05-04-grandma3-fader-feedback.md b/content/blogposts/2024-05-04-grandma3-fader-feedback.md index 45c790f..b384ff0 100644 --- a/content/blogposts/2024-05-04-grandma3-fader-feedback.md +++ b/content/blogposts/2024-05-04-grandma3-fader-feedback.md @@ -2,7 +2,7 @@ slug: "grandma3-fader-feedback-2024-05-04" title: "GrandMA3 Fader Feedback Plugin" date: "2024-05-04" -modified: "2025-12-05" +modified: "2024-05-04" description: "A free MA3 LUA plugin to provide per-fader feedback over OSC" --- You might have used the new OSC features in GrandMA3 to connect a MIDI controller to get some extra faders on your system. In my experience, this works quite smoothly. You then might have wanted to go extra fancy and tried to hook up the OSC that MA3 sends you back to make your motorized faders work, only to find out that, for some reason, it doesn't send feedback per fader, only per sequence, which is difficult to map to physical faders as you move things around. @@ -13,7 +13,7 @@ The plugin worked, but was kind of messy, so I rewrote the plugin to a point whe It's not the fanciest thing out there. there's no fancy GUIs for your settings, just a couple of variables to tweak and then never think about again. The upside of this is that the plugin is very small and light-weight. -You can download the plugin (along with any others I've made) [over here](https://git.riksolo.com/RikSolo/GrandMA3-Plugins/releases/tag/latest). +You can download the plugin [over here](https://git.riksolo.com/riksolo/GrandMA3-Plugins/releases). # Installation & Usage 1. Download the plugin from the link above. @@ -35,7 +35,7 @@ You can download the plugin (along with any others I've made) [over here](https: 7. Open the plugin back up, select the first (and only) line in the table, and hit the Edit button on the bottom of the window. 8. Change the variables at the top of the plugin to your liking. There are comments above each one to tell you how they work. 9. Now run the plugin. - + MA3 should start sending feedback for the executors you configured in the plugin file. The OSC addresses are the same as the ones you would use to send OSC into MA# (using the current page). So, for example, the feedback for fader 202 would be sent to `/Page/Fader/202`. For faders, the plugin will send a Float value between 0.00 and 1.00. For buttons, a value of 0 or 1 will be sent. diff --git a/content/blogposts/2025-09-09-ma3-tip-conditional-recipes.md b/content/blogposts/2025-09-09-ma3-tip-conditional-recipes.md deleted file mode 100644 index e6f5d0a..0000000 --- a/content/blogposts/2025-09-09-ma3-tip-conditional-recipes.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -slug: ma3-tip-conditional-recipes -title: "MA3 Tip: Customizing Shows On The Fly Using Conditional Recipes" -date: "2025-09-11" -modified: "2025-09-11" -description: "Easily adapting GrandMA3 showfiles to different situations by bulk-toggling Recipe lines based on tags." ---- -Touring with a super detailed, highly programmed light show is great, until you find yourself having to adapt to more limited venues than anticipated. - -I found myself facing this problem earlier this year. A band I've been working with had mostly been doing big one-off festival shows, and not a huge amount per year. With those circumstances, it wasn't a big problem for me to manually go over the showfile for every show and fixing things that didn't really work with each festival rig. - -Until they booked a two week club tour through Europe, and while it was a big step for the band, the variety of venues ranged from tiny 100-capacity music places to the mainstage of a festival with 40,000 sold tickets. - -Spending a couple of hours per show doing previz would be possible, but I kept making more or less the same substitutions, which left me wondering if I could lighten that workload. - -## The easy option, and the engineering perspective -The first thought was to just build a second "minimal" showfile, for very small rigs. This would be a lot easier to scale up, but it would mean having two base files to keep up to date and program new tracks into. I absolutely hate doing repetitive work though, so keeping two separate showfiles up to date sounds like a pain. - -DRY (don't repeat yourself) is one of the first things hammered into you when you're learning computer programming. If you notice you're writing the same code multiple times, it means you can probably simplify something, or extract it into a reusable bit of code, so that when you change some part of it, it updates anywhere. A great example of DRY in lighting programming would be using presets in your show, instead of hardcoding values into every cue. So I started thinking if I could come up with a more elegant solution for my situation. - -## The elegant solution -The entire show has been programmed using recipes, and when I was thinking this problem through, tags were recently added into the MA3 software. I noticed that a Tag field was also added to the recipe lines I started wondering if I could bulk edit recipe lines that have a tag. And as basically any question about doing things in MA using commands, the answer was "of course!" - -I ended up with the following syntax: -` -Set Sequence 1 Thru Cue 1 Thru Part Thru.Thru Property "enabled" 0 if #[Tag 'No Sides'] -` - - This disables any recipe line in any cue in any sequence as long as it has a certain tag. change the 0 for a 1 and it enables it. So I created a few tags ("No Sides", "No Floor Spots", "No Floor Washes", and so on), then went through the show, adding additional programming for these situations. Then I just had to create a couple of simple macros to toggle the recipe lines on and off, and I was left with an on-the-fly configurable showfile to adapt to wildly differing show scenarios. - -## Takeaways and other uses -Being able to mix and match multiple options also lets me make sure to still maximize what I'm doing with the parts of a rig that are there. Had I chosen to go with a "minimal" showfile, using it when I don't have washes on the floor would also mean losing any cool stuff I was doing with the side lights, or having to manually program it back. - -This technique has saved me several hours per gig, most of which wouldn't have been paid either. - -This trick can be very useful when you're not touring too. I've also started using the `If Tag` technique in my busking showfile. For example for enabling/disabling certain groups in my LOS-inspired system. diff --git a/content/blogposts/2025-12-05-grandma3-osc-hardkeys.md b/content/blogposts/2025-12-05-grandma3-osc-hardkeys.md deleted file mode 100644 index 81a8fe1..0000000 --- a/content/blogposts/2025-12-05-grandma3-osc-hardkeys.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -slug: "grandma3-osc-keys" -title: "GrandMA3 OSC Hardkeys Plugin" -date: "2025-12-05" -modified: "2025-12-05" -description: "A free MA3 LUA plugin to emulate key presses as if they were entered on a console or command wing" ---- - -Back when I decided to invest in some MA hardware of my own, I only had budget for a command wing at most. At the time MA2 was already more or less discontinued, and MA3 wasn't really ready to be used on shows yet. So, instead of a command wing, which would lock me in MA2 or MA3, I decided to buy a GrandMA3 OnPC 2port node to unlock my parameters, and build my setup around that. - -That setup started out with a little midi controller for faders, and using the keyboard of my laptop to do my programming using keyboard shortcuts. Shortly after, I custom-built a keyboard to enter MA's specific keyboard shortcuts with single key presses. This was a big improvement, but working through keyboard shortcuts had it's problems. One big nuisance was constantly having to switch keyboard shortcuts on and off if I wanted to do different things, and they buttons would still do random other actions if programs other than MA3 OnPC were currently highlighted. - -I figured out pretty early on that it would be aMAzing to be able to trigger MA's specific programming keys through OSC, but I never figured out a way to do so, until now! - -I present to you: the MA3 OSC Keys plugin. - -It works quite simply. First, it creates a block of 10 blank quickeys, generally somewhere out of the way. It then assigns these 10 quickeys to 10 executor buttons (also somewhere out of the way, and configurable). When the plugin is called with a command, such as "STORE press", it figures out the first available quickey slot. It then sets it's keycode to STORE, and "presses" it's corresponding executor button. When the plugin then receives a "STORE release" command, the executor button is "released" and the quickey slot is marked as free. This makes it so you can press and hold a number of keys in various overlapping sequences without any collisions or needing a separate quickey and executor for each possible keycode. - -You can download the plugin (and any other ones i've made) [over here](https://git.riksolo.com/RikSolo/GrandMA3-Plugins/releases/tag/latest). - -> **Note:** This is the very first iteration of the plugin, and it's not been tested very thoroughly yet. Things are bound to change or need fixing, so keep an eye on this page for updates. - -# Installation & Usage -1. Download the plugin from the link above. -2. Take both of the files of the "grandma3-plugins/OSC Keys" folder and put them where you normally put your MA3 plugins - - If you're not sure where that is, your best choice is probably on whichever USB stick you also keep your showfiles, the folder will be `/ma/ma3_library/datapools/plugins` -3. Open up MA3 -4. Edit an empty slot in your Plugins pool in MA3, hit the "import" button on the bottom of the dialogue, and find the plugin. -5. If you haven't gotten an OSC input set up yet, create one: - - In the MA3 menu, go to "In & Out", then into the OSC tab - - Create a new OSC entry with the following settings: - - Port: What port to listen on. - - Receive: Yes - - Receive Command: Yes -6. Open the plugin back up, select the first (and only) line in the table, and hit the Edit button on the bottom of the window. -7. Change the variables at the top of the plugin to your liking. There are comments above each one to tell you how they work. -8. Run the plugin once to initialize it. -9. From your OSC software, send a "String" type message to the IP of your machine, at the port you set in your OSC configuration earlier. The address should be `/cmd`, and the data should be something like `Plugin "RBOSCKeys" "STORE press"` or `Plugin "RBOSCKeys" "MA1 release"`. - - If you change the name of the plugin, you should rename the first value after the "Plugin" keyword. - - `STORE` can be replaced with any valid MA3 keycode. This list is the same of codes that are available for use in Quickeys - - the last word can be "press" or "release". For proper functionality of the plugin, it's very important that whenever you send a "press" event for a keycode, you also send a "release" event afterwards. The reason there aren't just one single action is for keys which also have functionality when held, such as the MA key. - -# Support -I maintain this plugin in my free time. This plugin is available free, and the code is free for you to edit. If you have any issues with the plugin, feel free to contact me through the contact info on this website, but please don't expect me to respond right away. - -If this plugin makes your life better, you can consider buying me a beer through [ko-fi](https://ko-fi.com/riksolo) \ No newline at end of file diff --git a/content/blogposts/blogposts.11tydata.js b/content/blogposts/blogposts.11tydata.js index dd1cae7..51c301b 100644 --- a/content/blogposts/blogposts.11tydata.js +++ b/content/blogposts/blogposts.11tydata.js @@ -1,5 +1,5 @@ const conf = { - tags: "blogpost", + tags: "blogposts", layout: "blogpost.njk", eleventyComputed: { permalink(data) { diff --git a/content/includes/highlights.njk b/content/includes/highlights.njk deleted file mode 100644 index 6097482..0000000 --- a/content/includes/highlights.njk +++ /dev/null @@ -1,11 +0,0 @@ -
- I am a freelance lighting designer, technician, and systems specialist with a focus on touring productions and live - performance. Since 2018, I have worked freelance, initially alongside a career in IT and software engineering and - full time since 2022, bringing together technical precision, creative design, and a strong respect for the craft and - crew. -
- -- I have designed lighting for touring shows that require both creative adaptability and practical problem solving on - the road. As a house and systems technician in a variety of venues, I regularly support international acts and - crews, adapting to varied - setups and workflows. My theatre and festival touring experience has also strengthened my ability to communicate - clearly with local teams and deliver consistent, high quality results in dynamic environments. -
- -- A perfectionist by nature, I value preparation, attention to detail, and reliability while staying flexible and - collaborative to meet the demands of live production. My background in IT and network management supports - increasingly complex lighting and control systems, ensuring stable and efficient operation across all types of - venues. -
- -
-
+
-
+
-
-- I am a freelance lighting designer/technician with a passion for the intersection of technical problem-solving with creative expression. My journey in lighting began in primary school, where I didn't want to perform in the school play and got put behind the technical desk instead. At that point, something clicked in me, and I've found a drive to pass that feeling of magic along to audiences through creating unique live experiences. I grew to greatly appreciate how light can affect mood and atmosphere, and I've found it fascinating to explore these relationships through technology. -
- -- This passion for stagecraft is contrasted by a long-running interest in computers, and a solid background in software development. Aside from working in software for a living before transitioning into lighting full-time, I still program for clients on occasion. The software projects I take on now usually involve some blend of art and technology. Such projects have included custom integrations with external tools for live show concepts, automation tools for solo live-streaming and remote production tools that have helped enable remotely-produced events during social distancing. -
- -- A perfectionist by nature, I deeply value preparation, attention to detail and reliability without losing sight of the spontaneity that fuels the creative process. I always aim to bring professionalism and technical precision to the table, blending it with a love for creative problem-solving and, in the end, a never-ending drive to make any project the best version of itself it can possibly be. -
- -- I strongly believe that, in this highly specific and inseparable mix of art and technology, a new kind of magic is to be explored. -
- - -