diff --git a/src/content/posts/developing-a-free-alternative-for-splice.md b/src/content/posts/developing-a-free-alternative-for-splice.md new file mode 100644 index 0000000..457616c --- /dev/null +++ b/src/content/posts/developing-a-free-alternative-for-splice.md @@ -0,0 +1,128 @@ +--- +title: "Developing a Free Alternative for Splice" +date: 2023-05-31T12:05:44+02:00 +draft: true +ShowToc: true +cover: + image: "cover.png" + caption: "Developing a Free Alternative for Splice" + relative: false + responsiveImages: false +--- + +## Intro + +I think that almost everybody knows what **Splice** is. Basically, it's just a huge library of sounds and VST presets with some additional sweets. I can't say that I'm not satisfied by Splice, it's an applications that is doing pretty good, until you want to use it on Linux. That's something that I don't understand, (I'm almost sure that )it's an Electron application with and some binary running a gRPC server in a background, that I believe is written in **GO**. Both technologies are working on Linux, so basically, they could have just built a version without promising any real support for that. But they haven't. I've decided to try running it with WINE, but it didn't work. And then I though: There is awesome [freesound](https://freesound.org/), and why wouldn't I use it? + + +> Freesound is a collaborative database of Creative Commons Licensed sounds. Browse, download and share sounds. + + +But downloading samples using a browser it not something I'd like to do. I love Splice for their drag-n-drop app. And I've decided to develop one that will work with Freesound. + +## Starting the project + +I've decided to use Rust and try the [Iced](https://iced.rs/) for the UI. +Here you will find the project git repository: https://git.badhouseplants.net/allanger/frice + +Basically, there are two things to do so the MVP is ready + +- Make correct API requests to the Freesound +- Create a UI + +So the very first thing that I'm doing, I'm initializing a project and creating a very simple **Iced** app using examples + +```bh +cargo init +cargo add iced +``` + +```toml +# Cargo.toml +[package] +name = "frice" +version = "0.1.0" +edition = "2021" + +[dependencies] +iced = "0.9.0" +``` +```rust +// ./src/main.rs +use iced::{Sandbox, Settings, widget::Container}; + +fn main() -> Result<(), iced::Error> { + Frice::run(Settings::default()) +} + +struct Frice {} + +impl Sandbox for Frice { + type Message = String; + + fn new() -> Self { + Frice {} + } + + fn title(&self) -> String { + "Frice".to_string() + } + + fn update(&mut self, message: Self::Message) { + println!("Updating") + } + + fn view(&self) -> iced::Element<'_, Self::Message> { + Container::new("frice").center_x().center_y().width(iced::Length::Fill).height(iced::Length::Fill).into() } +} + +``` + +### API +And now I want to switch to the API, because the UI without API requests won't be able to do anything. As I see now, I'll need to implement two API calls for the MVP: +1. Search sounds +2. Download a sound + +So let's start with the first one. They have a basic example of searching on their [documentation page](https://freesound.org/docs/api/overview.html) + +```bash +curl "https://freesound.org/apiv2/search/text/?query=dogs&token=YOUR_API_KEY" +``` + +*API key can be created here: * + +So let's create a FreesoundAPI struct and add two methods there + +```rust +struct FreesoundAPI {} + +impl FreesoundAPI { + fn new() -> Self { + Self {} + } + + fn search() { + todo!() + } + + fn download() { + todo!() + } +} + +``` + +To create an API call I'll need a token, so I need to add a new field to the `FreesoundAPI struct` +```rust +struct FreesoundAPI { + token: String +} +impl FreesoundAPI { + fn new(token: String) -> Self { + Self { token } + } +... +} +``` + +I also need a library for making API calls `cargo add reqwest`