In [1]:
    
#include <string>
#include <fstream>
#include "xwidgets/ximage.hpp"
#include "xwidgets/xslider.hpp"
#include "xtensor/xview.hpp"
#include "xtensor/xio.hpp"
#include "xtensor-io/ximage.hpp"
#include "xtensor-io/xaudio.hpp"
#include "xtensor-io/xnpz.hpp"
#include "xtl/xbase64.hpp"
#include "xcpp/xdisplay.hpp"
    
In [2]:
    
std::vector<char> read_file(const char* filename)
{
    std::basic_ifstream<char> file(filename, std::ios::binary);
    return std::vector<char>((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
}
    
In [3]:
    
template <class E>
std::vector<char> to_png_buffer(const xt::xexpression<E>& e)
{
    const char* temp_filename = "/tmp/xio_image.png";
    xt::dump_image(temp_filename, e);
    return read_file(temp_filename);
}
    
In [4]:
    
auto lightsaber = xt::load_image("images/saber.png");
    
In [5]:
    
xw::image ls_image;
ls_image.value = to_png_buffer(lightsaber);
ls_image
    
    Out[5]:
 
 
In [6]:
    
xt::xtensor<double, 3> lightsaber_modified;
    
In [7]:
    
template <class E>
void modify_image(xt::xexpression<E>& e, double value)
{
    lightsaber_modified = e.derived_cast();
    double inc = value * 0.2;
    xt::xtensor<double, 1> filter = {1. - inc, 1. + inc, 1. - inc};
    lightsaber_modified *= filter;
    ls_image.value = to_png_buffer(lightsaber_modified);
}
    
In [8]:
    
xw::slider<double> slider;
slider.max = 5;
slider.value = 2;
slider.continuous_update = false;
slider.display();
XOBSERVE(slider, value, [](const auto& s) {
    modify_image(lightsaber, s.value());
});
    
    
 
 
In [ ]:
    
auto swing = xt::load_audio("audio/lightsaber_swing.wav");
    
In [ ]:
    
int sample_rate = std::get<0>(swing);
auto audio_data = std::get<1>(swing);
    
In [ ]:
    
template <class E>
auto player(const xt::xexpression<E>& e, int sample_rate, xeus::xguid id = xeus::xguid(), bool update = false)
{
    using namespace std::string_literals;
    xt::dump_audio("/tmp/xio_audio.wav", e, sample_rate);
    std::ifstream fin("/tmp/xio_audio.wav", std::ios::binary);
    std::stringstream buffer;
    buffer << fin.rdbuf();
    xeus::xjson mime;
    mime["text/html"] = std::string("<audio autoplay controls loop src=\"data:audio/wav;base64,") + 
                        xtl::base64encode(buffer.str()) + "\"/>";
    xeus::xjson transient;
    if (update)
    {
        transient["display_id"] = id;
        xeus::get_interpreter().update_display_data(
            std::move(mime),
            xeus::xjson::object(),
            std::move(transient));
        return id;
    }
    else
    {
        id = xeus::new_xguid();
        transient["display_id"] = id;
        xeus::get_interpreter().display_data(
            std::move(mime),
            xeus::xjson::object(),
            std::move(transient));
        return id;
    }
}
    
In [ ]:
    
auto audio_id = player(std::get<1>(swing), sample_rate);
    
In [ ]:
    
xw::slider<int> samplerate_slider;
samplerate_slider.max = 50000;
samplerate_slider.value = sample_rate;
samplerate_slider.continuous_update = false;
samplerate_slider.display();
XOBSERVE(samplerate_slider, value, [](const auto& s) {
    player(std::get<1>(swing), s.value(), audio_id, true);
});
    
In [ ]: